ROS2 使用 tf2的过程的四元数变换,需要通过python的第三方包进行四元数旋转关系转换

本文深入探讨了机器人系统中坐标转换的重要性和应用场景,特别是在ROS环境中如何处理静态和动态坐标转换,包括tf2_ros的使用,四元数转换方法,以及Python和C++中实现的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在机器人系统中,经常需要用到坐标转换,比如一个机器人的手臂要去拿一个运动的物体,控制的时候我们需要手臂的当前坐标,同时还需要知道手臂和身体的坐标,这个时候就需要用到坐标转换,把手臂的坐标转换为身体的坐标系,这样控制起来就方便一点。当然这里是动态的情况,也存在静态的情况,比如机器人头顶的摄像头,转换到身体的坐标系,那么位置关系是相对固定的,所以可以一开始就写到固定的位置。

  • 有固定转换关系的文件放在哪里?个比较好的方法是各个节点自己广播自己的转换关系,而其实静态的转换关系只需要发送一次就可以了,因为不会变化。
  • 有动态转换关系的节点,需要实时动态发布自己的转换关系,这样会涉及到时间戳,以及过时。
  • 转换关系的拓扑结构如何确定?是树型还是网络型的,这涉及到转换关系传递的问题。

安装

sudo apt install ros-dashing-tf2
sudo apt install ros-dashing-tf2-ros

Demo 实例:
https://github.com/ros2/geometry2/tree/ros2/examples_tf2_py/examples_tf2_py

我用的ros2 dashing 发行版,感觉一直无法导入tf2_ros 最后的方法是重新安装了更新的版本eloquent,安装过程严格对照官网教程进行即可。

在ROS1里面,

# tf.transformations alternative is not yet available in tf2
from tf.transformations import quaternion_from_euler
if __name__ == '__main__':
# RPY to convert: 90deg, 0, -90deg
	q = quaternion_from_euler(1.5707, 0, -1.5707)
	print "The quaternion representation is %s %s %s %s." % (q[0], q[1], q[2], q[3])
quaternion = tf.transformations.quaternion_from_euler(roll, pitch, yaw)
#type(pose) = geometry_msgs.msg.Pose
pose.orientation.x = quaternion[0]
pose.orientation.y = quaternion[1]
pose.orientation.z = quaternion[2]
pose.orientation.w = quaternion[3]
#type(pose) = geometry_msgs.msg.Pose
quaternion = (
    pose.orientation.x,
    pose.orientation.y,
    pose.orientation.z,
    pose.orientation.w)
euler = tf.transformations.euler_from_quaternion(quaternion)
roll = euler[0]
pitch = euler[1]
yaw = euler[2]

在ROS2里面,目前四元数的转换没有集成到tf2_ros里面,四元数的定义放在了gemetry_msgs
使用python的第三方quaternions包进行四元数转换。

在Python中进行转换的方法:

pip install quaternions
from quaternions import Quaternion as Quaternion # 用于求解欧拉角到四元数的变换结果
b = [0.21467549,0.32245,0.44535] # ROLL PITCH HEADING
a = Quaternion.from_euler(b,axes = ['y', 'y', 'x']) # 返回的是 w x y z
print(a)
c = Quaternion.get_euler(a) # 返回的结果是 Heading Pitch Roll
c = c[::-1]
print(c)

输出结果:
<0.9609193895916198, 0.19994791727967973, 0.17901508090292767, 0.06788488706409596>
[0.21467548999999994, 0.32245000000000007, 0.4453499999999999]

还有另外的方法:

from scipy.spatial.transform import Rotation
r = Rotation.from_euler('zyx',[-1 * self.heading_radians, self.pitch_radians, self.roll_radians])
orientation = r.as_quat()

这个和C++版本的tf2里的变换顺序是保持一致的。

ROS(Robot Operating System)中,使用Pythontf2(第二版)协作,主要是为了管理机器人的空间定位、姿态变换以及传感器之间的相对位置信息。以下是使用tf2的基本步骤: 1. **安装依赖**: 首先确保你的ROS环境已经安装了tf2及其相关的python库,如`ros-tf2-api`。如果没有,可以使用命令行安装: ``` sudo apt-get install ros-<your_ros_distro>-tf2 ``` 2. **导入TF2库**: ```python import rospy from tf2_ros import TransformListener from geometry_msgs.msg import TransformStamped ``` 这里引入了必要的 ROS Python 模块,TF2 的监听者类 `TransformListener`。 3. **初始化Node**: ```python rospy.init_node('my_transform_publisher') ``` 4. **创建Transformer实例**: ```python listener = TransformListener() ``` 5. **获取或发布Transforms**: - 获取两个坐标系之间的变换: ```python try: (trans, rot) = listener.lookup_transform('source_frame', 'target_frame', rospy.Time(0)) except (tf2.LookupException, tf2.ConnectivityException, tf2.ExtrapolationException): print("Transform not available") return ``` - 发布自定义变换: ```python broadcaster = tf2_ros.TransformBroadcaster() transform_stamped = TransformStamped() # 设置消息属性... broadcaster.sendTransform(transform_stamped) ``` 6. **监听和循环**: 使用循环不断地尝试查找变换,或者在满足条件时广播变换。 7. **退出回调函数**: ```python def shutdownhook(): # 在node关闭前停止监听 listener.shutdown() rospy.on_shutdown(shutdownhook) ``` 8. **运行脚本**: 在ROS控制台上启动你的脚本,让它作为独立的进程运行。 使用tf2时,你可以创建更复杂的空间操作,处理延迟和时间同步问题,以及利用其提供的各种便利工具。记得在实际应用中处理异常并确保在ROS节点结束时清理资源。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值