目录

URDF语法

练习案例

URDF工具


URDF语法

1.URDF是 Unified Robot Description Format 的首字母缩写,直译为统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件。

2.URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型。

标签包括:

  • robot 根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内
  • link 连杆标签(用于描述机器人某个部件的外观和物理属性)
  • joint 关节标签(用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限)
  • gazebo 集成gazebo需要使用的标签(用于配置仿真环境所需参数)

【1】 robot:

  • 属性:name (指定机器人模型的名称)
  • 其他标签都是其子标签

【2】link:

1.属性

  • name ---> 为连杆命名

2.子标签

  • visual ---> 描述外观(对应的数据是可视的)
  • geometry 设置连杆的形状
  • 标签1: box(盒状)
  • 属性:  size=长(x) 宽(y) 高(z)
  • 标签2: cylinder(圆柱)
  • 属性:  radius=半径   length=高度
  • 标签3: sphere(球体)
  • 属性:  radius=半径
  • 标签4: mesh(为连杆添加皮肤)
  • 属性:  filename=资源路径(格式:package://<packagename>/<path>/文件)
  • origin 设置偏移量与倾斜弧度
  • 属性1: xyz=x偏移 y偏移 z偏移
  • 属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
  • metrial 设置材料属性(颜色)
  • 属性: name
  • 标签: color
  • 属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1],越大越深)
  • collision ---> 连杆的碰撞属性
  • Inertial ---> 连杆的惯性矩阵

【3】joint: 

1.属性

  • name ---> 为关节命名
  • type ---> 关节运动形式
  • continuous: 旋转关节,可以绕单轴无限旋转
  • revolute: 旋转关节,类似于 continues,但是有旋转角度限制
  • prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
  • planer: 平面关节,允许在平面正交方向上平移或旋转
  • floating: 浮动关节,允许进行平移、旋转运动
  • fixed: 固定关节,不允许运动的特殊关节

2.子标签

  • parent(必需的)
    parent link的名字是一个强制的属性:
  • link:父级连杆的名字,是这个link在机器人结构树中的名字。
  • child(必需的)
    child link的名字是一个强制的属性:
  • link:子级连杆的名字,是这个link在机器人结构树中的名字。
  • origin
  • 属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
  • axis
  • 属性: xyz用于设置围绕哪个关节轴运动。

练习案例

需求:创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 0.1m,高 0.08m,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 0.035m,轮胎宽度0.015cm,两个万向轮为球状,半径 0.0075m,底盘离地间距为 0.015m(与万向轮直径一致)

目标:

 

rviz添加penal python脚本 rviz的使用_权重

流程:

1.创建一个功能包,导入 urdf 依赖

在当前功能包下,再新建几个目录:

urdf: 存储 urdf 文件的目录

config: 存储保存的已配置的rviz文件

launch: 存储 launch 启动文件

2. 新建urdf以及launch文件

2.1新建urdf文件

<robot name="mycar">
    <!-- 设置 base_footprint  -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="0.001" />
            </geometry>
        </visual>
    </link>

    <!-- 添加底盘 -->


    <!-- 添加驱动轮 -->


    <!-- 添加万向轮(支撑轮) -->

</robot>

设置base_footprint的意义:

添加一个尺寸极小的link(上图中的base_footprint),再关联(通过joint)base_footprint与base_link (底盘),更方便移动整个物体,或者  同时修改base_link和其他物体link的origin (初始位置)
    前者方法是构建一个极小的base_footprint出来,然后与其他所有物体划分,再建立一个他们各自坐标系的相对关系,以这个footprint为参照坐标系,那么其他所有物体就会随之改变位置(更高效便捷地移动多个物体)
    后者是通过改变每个物体的重心的坐标系实现相同的视觉效果(较麻烦)

 2.2新建launch文件(下面的关节状态节点,我们选择发布动态的)

<launch>
   <!--1.在参数服务器中载入URDF-->
   <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/orange05_test.urdf" />
   <!--2.启动rviz-->
   <node pkg="rviz" name="rviz" type="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
   <!--args用于启动之前已保存在config目录下的rviz文件,方便配置-->
   <!--3.添加关节状态发布节点-->
   <!--静态
   问题:tf坐标系旋转时抖动,
   因为开了两个joint_state_publisher,一个静态的,一个gui的,造成了tf冲突
   解决:将静态的tf去掉-->
   <!-- <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /> -->

   <!--4.添加机器人状态发布节点-->
   <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

   <!--5.关节控制运动节点-->
   <!--动态-->
   <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" /> 
</launch>

每次重复启动launch文件时,Rviz 之前的组件配置信息不会自动保存 ,我们可以将rviz文件另存为

再启动时,就可以包含之前的组件配置了,使用更方便快捷。

launch文件中 Rviz 的启动配置添加参数:args,值设置为"-d 配置文件路径

3.底盘搭建

<!--3.添加底盘-->
    <!--
        形状:圆柱
        半径:0.1m
        高度:0.08m
        离地间距:0.015m
    -->
    <!--3.1.link-->
    <link name="base_link" >
        <!--可视化标签-->
        <visual>
           <geometry>
                <cylinder radius="0.1" length="0.08" />
           </geometry>

           <origin xyz="0 0 0" rpy="0 0 0" />

           <material name="baselink_color">
               <color rgba="1.0 0.5 0.2 0.5" />
           </material>
        </visual>
    </link>
    <!--3.2.joint-->
    <!-- 关联base_footprint 与 base_link-->
    <joint name="link2footprint" type="fixed" >
        <!--父级 link-->
        <parent link="base_footprint" />
        <!--子级 link-->
        <child link="base_link" />
        <!--关节z上的设置 = 车体高度/2 + 离地间距-->
        <origin xyz="0 0 0.055" rpy="0 0 0" />
    </joint>

4.添加驱动轮

<!--4.添加驱动轮-->
    <!--
        形状:圆柱
        半径:0.035m
        长度:0.015m
    -->
    <!--4.1.link-->
    <link name="left_wheel" >
        <visual>
           <geometry>
                <cylinder radius="0.035" length="0.015" />
           </geometry>

           <origin xyz="0 0 0" rpy="1.5708 0 0" />

           <material name="leftwheel_color">
               <color rgba="0 0.5 1 1" />
           </material>
        </visual>
    </link>    
    <link name="right_wheel" >
        <visual>
           <geometry>
                <cylinder radius="0.035" length="0.015" />
           </geometry>

           <origin xyz="0 0 0" rpy="1.5708 0 0" />

           <material name="rightwheel_color">
               <color rgba="0.5 1 0 1" />
           </material>
        </visual>
    </link>   
    <!--4.2.joint-->
    <joint name="left2baselink" type="continuous">
        <parent link="base_link" />
        <child link="left_wheel" />

        <origin xyz="0 0.1 -0.02" rpy="0 0 0" />
        <axis xyz="0 1 0" />
    </joint>    
    <joint name="right2baselink" type="continuous">
        <parent link="base_link" />
        <child link="right_wheel" />

        <origin xyz="0 -0.1 -0.02" rpy="0 0 0" />
        <axis xyz="0 1 0" />
    </joint>

5.添加万向轮

<!--4.添加万向轮-->
    <!--
        形状:球
        半径:0.0075m
    -->
    <!--4.1.link-->
    <link name="front_wheel" >
        <visual>
           <geometry>
                <sphere radius="0.0075" />
           </geometry>
           <origin xyz="0 0 0" rpy="0 0 0" />
           <material name="frontwheel_color">
               <color rgba="1 0 1 1" />
           </material>
        </visual>
    </link>       
    <link name="back_wheel" >
        <visual>
           <geometry>
                <sphere radius="0.0075" />
           </geometry>
           <origin xyz="0 0 0" rpy="0 0 0" />
           <material name="backwheel_color">
               <color rgba="1 0 1 1" />
           </material>
        </visual>
    </link>   
    <!--4.2.joint-->
    <joint name="front2baselink" type="continuous">
        <parent link="base_link" />
        <child link="front_wheel" />

        <origin xyz="0.0925 0 -0.0475" rpy="0 0 0" />
        <axis xyz="1 0 0" />
    </joint>    
    <joint name="back2baselink" type="continuous">
        <parent link="base_link" />
        <child link="back_wheel" />

        <origin xyz="-0.0925 0 -0.0475" rpy="0 0 0" />
        <axis xyz="1 0 0" />
    </joint>

最后,ctrl+s保存一下,打开vscode中的终端,source 一下再 roslaunch 包名 launch文件 就可以打开rviz(然后记得查看Fixed Frame是否为base_footprint 即以它为参照坐标系 )

rviz添加penal python脚本 rviz的使用_c++_02

 我们先点击Add 选择添加TF坐标系,然后通过调节移动运动关节,例如上图的left2baselink,可以发现它的TF坐标系在转动(有抖动的现象,一般是launch文件中同时发布了静态和动态关节状态节点,上上面注释有说明)

URDF工具

在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:

  • check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题
  • urdf_to_graphiz命令可以查看 urdf 模型结构,显示不同 link 的层级关系

要使用工具之前,首先需要安装,安装命令: sudo apt install liburdfdom-tools

演示:

vscode中进入urdf文件所属目录,打开终端,

调用:check_urdf urdf文件 如果不抛出异常,说明文件合法,并且可以看见各个link之间的关系

调用: urdf_to_graphiz urdf文件,当前目录下会生成 pdf 文件 ,再通过 evince pdf文件 即可

rviz添加penal python脚本 rviz的使用_c++_03

 

rviz添加penal python脚本 rviz的使用_XML_04