From 2159d22967ea8fa7f8dbeb58c95e9e00ac0790b5 Mon Sep 17 00:00:00 2001
From: swittl <simon.wittl@th-deg.de>
Date: Wed, 10 Jul 2024 09:24:33 +0200
Subject: [PATCH] added static broadcaster

---
 package.xml                             |  6 ++
 rq_controller/tf2/__init__.py           |  0
 rq_controller/tf2/static_broadcaster.py | 73 +++++++++++++++++++++++++
 setup.py                                |  1 +
 4 files changed, 80 insertions(+)
 create mode 100644 rq_controller/tf2/__init__.py
 create mode 100644 rq_controller/tf2/static_broadcaster.py

diff --git a/package.xml b/package.xml
index fd22eac..9ede545 100644
--- a/package.xml
+++ b/package.xml
@@ -12,6 +12,12 @@
   <test_depend>ament_pep257</test_depend>
   <test_depend>python3-pytest</test_depend>
 
+  <exec_depend>geometry_msgs</exec_depend>
+  <exec_depend>python3-numpy</exec_depend>
+  <exec_depend>rclpy</exec_depend>
+  <exec_depend>tf2_ros_py</exec_depend>
+  <exec_depend>turtlesim</exec_depend>
+
   <export>
     <build_type>ament_python</build_type>
   </export>
diff --git a/rq_controller/tf2/__init__.py b/rq_controller/tf2/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/rq_controller/tf2/static_broadcaster.py b/rq_controller/tf2/static_broadcaster.py
new file mode 100644
index 0000000..39f5cd9
--- /dev/null
+++ b/rq_controller/tf2/static_broadcaster.py
@@ -0,0 +1,73 @@
+import math
+import sys
+
+from geometry_msgs.msg import TransformStamped
+
+import numpy as np
+
+import rclpy
+from rclpy.node import Node
+
+from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster
+
+
+class StaticFramePublisher(Node):
+    """
+    Broadcast transforms that never change.
+
+    This example publishes transforms from `world` to a static turtle frame.
+    The transforms are only published once at startup, and are constant for all
+    time.
+    """
+
+    def __init__(self, frame, position, quaternion, name: str = 'static_broadcaster', parent_frame: str = 'world'):
+        super().__init__(name)
+
+        self.tf_static_broadcaster = StaticTransformBroadcaster(self)
+
+        # Publish static transforms once at startup
+        self.make_transforms(frame, position.split(" "), quaternion.split(" "), parent_frame)
+
+    def make_transforms(self, frame, position, quaternion, parent_frame):
+        t = TransformStamped()
+
+        t.header.stamp = self.get_clock().now().to_msg()
+        t.header.frame_id = parent_frame
+        t.child_frame_id = frame
+
+        t.transform.translation.x = float(position[0])
+        t.transform.translation.y = float(position[1])
+        t.transform.translation.z = float(position[2])
+        t.transform.rotation.x = float(quaternion[0])
+        t.transform.rotation.y = float(quaternion[1])
+        t.transform.rotation.z = float(quaternion[2])
+        t.transform.rotation.w = float(quaternion[3])
+
+        self.tf_static_broadcaster.sendTransform(t)
+
+
+def main(args=None):
+    logger = rclpy.logging.get_logger('logger')
+
+    rclpy.init(args=args)
+
+    node = rclpy.create_node('static_broadcaster')
+    parent_frame = node.declare_parameter('parent_frame', 'world').value
+    frame = node.declare_parameter('frame', 'object').value
+    name = node.declare_parameter('name', 'static_broadcaster').value
+    position = node.declare_parameter('position', '0 0 0').value
+    quaternion = node.declare_parameter('quaternion', '0 0 0 1').value
+
+    node = StaticFramePublisher(
+        frame,
+        position,
+        quaternion,
+        name,
+        parent_frame)
+    
+    try:
+        rclpy.spin(node)
+    except KeyboardInterrupt:
+        pass
+
+    rclpy.shutdown()
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 9961d05..4ba1f90 100644
--- a/setup.py
+++ b/setup.py
@@ -20,6 +20,7 @@ setup(
     tests_require=['pytest'],
     entry_points={
         'console_scripts': [
+            'tf_static_broadcaster = rq_controller.tf2.static_broadcaster:main',
         ],
     },
 )
-- 
GitLab