如何在ROS中获取坐标系间的变换关系
在机器人应用中,我们有时难免要将对象的位姿在不同坐标系之间转换,比如在仿真软件Coppeliasim中,我们可以直接指定一个简单的参数实现这一需求。
那么在ROS中呢?虽然不像仿真环境里那么简单直观,但我们可以利用TF坐标变换实现需求。以baxter机器人模型进行说明
查看baxter机器人中模型中有哪些坐标系
首先启动baxter的仿真:roslaunch baxter_gazebo baxter_world.launch
执行以下命令:rosrun rqt_tf_tree rqt_tf_tree
图中各圆框就是各坐标系,如right_upper_shoulder
就是一个坐标系的名称
图形化观察baxter的坐标系关系
首先启动baxter的仿真:roslaunch baxter_gazebo baxter_world.launch
然后启动rviz:rosrun rviz rviz
在Displays栏添加TF,如下:
此时我们发现这里坐标系太多了,为了筛选我们要的部分,在TF下的frame中勾选我们需要的部分:
这就是左手的各关节坐标系,当然,只看到坐标系并不直观,为了将坐标系在机器人上对应起来,我们在rviz中显示baxter的模型
-
关掉这个界面,在终端运行:
roslaunch baxter_moveit_config baxter_grippers.launch
-
和前面一样,添加TF
现在就看到各坐标系和机器人的对应关系了,当然,我们可以调整坐标系显示的大小方便观察:
数值化得到坐标系之间的相对关系
执行命令:rosrun tf tf_echo <target_frame> <source_frame>
输出从 right_upper_shoulder
坐标系到 right_lower_shoulder
坐标系的变换信息
编程得到上述变换信息(使用tf2)
def translation_test():
tf_buffer = tf2_ros.Buffer()
tf_listener = tf2_ros.TransformListener(tf_buffer)
transform_msgs = tf_buffer.lookup_transform('right_upper_shoulder', 'right_lower_shoulder', rospy.Time(0), rospy.Duration(1.0))
print("transform_msgs")
print(transform_msgs)
输出:
根据这些信息你可以容易得到转换矩阵之类的信息,进而实现自己个性化的需求。
总结
本文从需求出发描述了在ROS中TF变换的作用,如需系统学习可以移步官网:tf2 - ROS Wiki