本篇总结如何由机器人描述文件,得到各个link之间的位置关系,如何发布到/tf、/tf_static。
一、过程实现
- 一个简单的模型,包含两个link,一个joint,以URDF为例,如下
<?xml version="1.0"?>
<robot name="myfirstrobot">
<!-- Base Link -->
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 2"/>
</geometry>
</visual>
</link>
<joint name="joint1" type="continuous">
<parent link="base_link"/>
<child link="middle_link"/>
<origin rpy="0 0 0" xyz="0 0 1"/>
<axis xyz="0 1 0"/>
</joint>
<link name="middle_link">
<visual>
<geometry>
<box size="0.2 0.2 1"/>
</geometry>
<origin rpy="0 1.57075 0" xyz="0.5 0 0"/>
</visual>
</link>
</robot>
- 创建ROS功能包,并新建一个launch文件,如下:
<launch>
<param
name="robot_description"
textfile="$(find myurdf)/robot/myfirstrobot.urdf" />
<!-- send fake joint values -->
<node
name="joint_state_publisher"
pkg="joint_state_publisher"
type="joint_state_publisher">
<param name="use_gui" value="false"/>
</node>
<!-- Combine joint values -->
<node
name="robot_state_publisher"
pkg="robot_state_publisher"
type="robot_state_publisher" />
<!-- Display -->
<node
name="rviz"
pkg="rviz"
type="rviz"
respawn="false"
output="screen"
args="-d $(find myurdf)/urdf.rviz" />
</launch>
- 启动,便可在rviz查看机器人模型:

- 查看topic:

参考:https://blog.csdn.net/wxflamy/article/details/79235493
二、过程解释
- 首先,将机器人描述文件使用参数服务器加载:param name=robot_description;即launch文件中的第一步:

- 第二步,要把机器人的joint状态发布到/joint_states,以便于后续通过 joint状态得到各个link之间的位置关系,使用的插件为:joint_state_publisher

- 第三步,使用robot_state_publisher插件,发布机器人各个link之间的位置关系,两个topic: /tf、tf_static

三、两个疑问及解答
- 为什么会有两个位置关系的topic: /tf、/tf_static
/tf:动态的位置关系将会发布到此topic,这里的动态指的是机器人描述文件中活动joint
/tf_static:固定的位置关系会发布到此topic,即机器人描述文件中joint定义为“fixed"
- robot_state_publisher与static_transform_publisher的区别
static_transform_publisher:发布两个坐标系之间的静态坐标变换,这两个坐标系不发生相对位置变化,如下:
<launch>
<node pkg="tf"type="static_transform_publisher" name="link1_broadcaster"args="1 0 0 0 0 0 1 link1_parent link1 100" />
</launch>尽管发布的是静态坐标变换,但是经过测试,它并没有发布到/tf_static话题上,依旧是/tf。
参考:https://zhuanlan.zhihu.com/p/58183383
版权声明:本文为jcsm__原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。