From 63cf9f12bd1ed777396c9bf889cdd68354188179 Mon Sep 17 00:00:00 2001
From: oliverkania <oliver.kania@rwth-aachen.de>
Date: Fri, 9 May 2025 12:26:38 +0200
Subject: [PATCH] added broadcaster node

---
 .vscode/c_cpp_properties.json     | 20 ++++++++++
 .vscode/settings.json             | 20 ++++++++++
 my_robot_package/tof_tf_caster.py | 62 +++++++++++++++++++++++++++++++
 setup.py                          |  1 +
 4 files changed, 103 insertions(+)
 create mode 100644 .vscode/c_cpp_properties.json
 create mode 100644 .vscode/settings.json
 create mode 100644 my_robot_package/tof_tf_caster.py

diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
new file mode 100644
index 0000000..af5a8df
--- /dev/null
+++ b/.vscode/c_cpp_properties.json
@@ -0,0 +1,20 @@
+{
+  "configurations": [
+    {
+      "browse": {
+        "databaseFilename": "${default}",
+        "limitSymbolsToIncludedHeaders": false
+      },
+      "includePath": [
+        "/opt/ros/humble/include/**",
+        "/usr/include/**"
+      ],
+      "name": "ROS",
+      "intelliSenseMode": "gcc-x64",
+      "compilerPath": "/usr/bin/gcc",
+      "cStandard": "gnu11",
+      "cppStandard": "c++14"
+    }
+  ],
+  "version": 4
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..cab2135
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,20 @@
+{
+    "python.autoComplete.extraPaths": [
+        "/home/sochi/40_BA_WS/ros2_ws/build/my_sensor_controller",
+        "/home/sochi/40_BA_WS/ros2_ws/install/my_sensor_controller/lib/python3.10/site-packages",
+        "/home/sochi/40_BA_WS/ros2_ws/build/my_robot_package",
+        "/home/sochi/40_BA_WS/ros2_ws/install/my_robot_package/lib/python3.10/site-packages",
+        "/home/sochi/40_BA_WS/ros2_ws/src/my_sensor_controller/install/my_sensor_controller/lib/python3.10/site-packages",
+        "/opt/ros/humble/lib/python3.10/site-packages",
+        "/opt/ros/humble/local/lib/python3.10/dist-packages"
+    ],
+    "python.analysis.extraPaths": [
+        "/home/sochi/40_BA_WS/ros2_ws/build/my_sensor_controller",
+        "/home/sochi/40_BA_WS/ros2_ws/install/my_sensor_controller/lib/python3.10/site-packages",
+        "/home/sochi/40_BA_WS/ros2_ws/build/my_robot_package",
+        "/home/sochi/40_BA_WS/ros2_ws/install/my_robot_package/lib/python3.10/site-packages",
+        "/home/sochi/40_BA_WS/ros2_ws/src/my_sensor_controller/install/my_sensor_controller/lib/python3.10/site-packages",
+        "/opt/ros/humble/lib/python3.10/site-packages",
+        "/opt/ros/humble/local/lib/python3.10/dist-packages"
+    ]
+}
\ No newline at end of file
diff --git a/my_robot_package/tof_tf_caster.py b/my_robot_package/tof_tf_caster.py
new file mode 100644
index 0000000..b6853b8
--- /dev/null
+++ b/my_robot_package/tof_tf_caster.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+import rclpy
+from rclpy.node import Node
+from sensor_msgs.msg import JointState
+from tf2_ros import TransformBroadcaster
+from geometry_msgs.msg import TransformStamped
+import math
+import tf_transformations
+
+
+class SensorTFBroadcaster(Node):
+    def __init__(self):
+        super().__init__('sensor_tf_broadcaster')
+        self.broadcaster = TransformBroadcaster(self)
+        self.subscription = self.create_subscription(
+            JointState,
+            '/joint_states',
+            self.listener_callback,
+            10)
+        self.sensor_offset = (0.1, 0.0, 0.1)  # offset
+
+    def listener_callback(self, msg: JointState):
+        try:
+            idx = msg.name.index("shoulder_pan_joint")
+            angle = msg.position[idx]
+
+            t = TransformStamped()
+            t.header.stamp = self.get_clock().now().to_msg()
+            t.header.frame_id = "shoulder_pan_joint"
+            t.child_frame_id = "vl53_frame"
+
+            # Apply static offset
+            t.transform.translation.x = self.sensor_offset[0]
+            t.transform.translation.y = self.sensor_offset[1]
+            t.transform.translation.z = self.sensor_offset[2]
+
+            # Rotate sensor with shoulder_pan_joint (around Z axis)
+            # Combine static rotation (90° pitch, -90° yaw) with joint angle (around Z)
+            static_quat = tf_transformations.quaternion_from_euler(0, 1.5708, -1.5708)
+            joint_quat = tf_transformations.quaternion_from_euler(angle, 0, 0)
+
+            # Multiply quaternions: final = static * joint
+            quat = tf_transformations.quaternion_multiply(static_quat, joint_quat)
+            t.transform.rotation.x = quat[0]
+            t.transform.rotation.y = quat[1]
+            t.transform.rotation.z = quat[2]
+            t.transform.rotation.w = quat[3]
+
+            self.broadcaster.sendTransform(t)
+        except ValueError:
+            self.get_logger().warn("Joint shoulder_pan_joint not found in JointState")
+
+
+def main(args=None):
+    rclpy.init(args=args)
+    node = SensorTFBroadcaster()
+    rclpy.spin(node)
+    node.destroy_node()
+    rclpy.shutdown()
+
+if __name__ == '__main__':
+    main()
diff --git a/setup.py b/setup.py
index 8f8fdb0..4f07ddf 100644
--- a/setup.py
+++ b/setup.py
@@ -25,6 +25,7 @@ setup(
         'console_scripts': [
         'joint_reader = my_robot_package.joint_reader:main',
         'tof_pico_node = my_robot_package.tof_pico_node:main',
+        'tof_tf_caster = my_robot_package.tof_tf_caster:main',
         ],
     },
 )
-- 
GitLab