机器人描述文件(URDF、SDF、XACRO) 与 /tf、/tf_static

本篇总结如何由机器人描述文件,得到各个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版权协议,转载请附上原文出处链接和本声明。