-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtf2_wrapper.py
More file actions
59 lines (50 loc) · 2.01 KB
/
tf2_wrapper.py
File metadata and controls
59 lines (50 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import math
import rclpy.time
from geometry_msgs.msg import Transform, TransformStamped
from rclpy.duration import Duration
from rclpy.node import Node
from tf2_msgs.msg import TFMessage
from tf2_ros.buffer import Buffer
from tf2_ros.transform_listener import TransformListener
class TF2Wrapper:
def __init__(self, node: Node) -> None:
self._node = node
self._tf_buffer = Buffer()
self._tf_listener = TransformListener(self._tf_buffer, self._node)
self._tf2_pub = self._node.create_publisher(TFMessage, "/tf", 1)
def get_latest_pose(self, target_frame: str, source_frame: str) -> Transform | None:
"""
Returns the transform T_target_source (interpreted using left-handed
matrix multiplication).
"""
try:
return self._tf_buffer.lookup_transform(
target_frame,
source_frame,
rclpy.time.Time(),
timeout=Duration(seconds=0.1), # type: ignore
).transform
except: # noqa: E722
return None
def get_latest_transform(self, target_frame: str, source_frame: str):
try:
return self._tf_buffer.lookup_transform(
target_frame,
source_frame,
rclpy.time.Time(),
timeout=Duration(seconds=0.1), # type: ignore
)
except: # noqa: E722
return None
def publish_2d_pose(
self, target_frame: str, source_frame: str, x: float, y: float, theta: float
) -> None:
transform = TransformStamped()
transform.header.frame_id = target_frame
transform.header.stamp = self._node.get_clock().now().to_msg()
transform.child_frame_id = source_frame
transform.transform.translation.x = x
transform.transform.translation.y = y
transform.transform.rotation.z = math.sin(theta / 2)
transform.transform.rotation.w = math.cos(theta / 2)
self._tf2_pub.publish(TFMessage(transforms=[transform]))