Firechecking

URDF学习

简介

URDF(Unified Robot Description Format)是ROS中使用的一种机器人描述文件,它以HTML的形式定义一个机器人。包含的内容有:连杆、关节名称,运动学参数、动力学参数、可视化模型、碰撞检测模型等。

参考链接

  1. http://wiki.ros.org/urdf
  2. http://wiki.ros.org/urdf/Tutorials
  3. http://www.vccoo.com/v/e418b9?source=rss

参考教程

  1. TF2教程
  2. Xacro教程
  3. Gazebo教程

URDF基础

使用URDF语言创建可视的模型

  1. 本教程使用URDF创建一个可视的模型,首先确保已经安装了Package:”joint_state_publisher”(使用rosdep安装,或使用apt-get安装urdf_tutorial)
  2. 一个URDF文件中,有一个<robot name="">标签
  3. 有多个<link name="">标签,表示机器人实体部件
  4. 有多个<joint name="" type="">标签,表示机器人实体部件的连接(关节)
  5. 在URDF以树结构保存机器人模型,具有一个根link
  6. 在rviz中查看

    1
    $ roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf

    代码完成的事情包括:

    1. 将urdf/01-myfirst.urdf文件中的urdf模型载入ros parameter server
    2. 启动Node发布消息到sensor_msgs/JointState主题,以及发布transform消息
    3. 启动RVIZ
  7. 可视化展示URDF树结构

    1
    2
    $ urdf_to_graphiz my_robot.urdf
    $ evince test_robot.pdf
  8. 示例代码(source)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?xml version="1.0"?>
    <robot name="visual">
    <!-- 自定义材料属性 -->
    <!-- 也可以自定义图片纹理属性 -->
    <material name="blue">
    <color rgba="0 0 0.8 1" />
    </material>
    <link name="right_leg"><!-- link表示机器人实体部件 -->
    <visual><!-- 实体部件的视觉设置 -->
    <geometry>
    <cylinder length="0.6" radius="0.2"/><!-- 长0.6m,班级0.2米的圆柱体 -->
    </geometry>
    <origin rpy="0 1.57075 0" xyz="0 0 -0.3" /><!-- 实体部件的坐标 --><!--rpy:roll pitch yaw-->
    <!-- 部件向z轴移动-0.3m,沿y轴旋转PI/2 -->
    <material name="white" />
    </visual>
    </link>
    <joint name="base_to_right_leg" type="fixed"><!-- joint表示机器人实体部件的连接(关节) -->
    <!-- joint类型可以是"fixed","continuous","revolute","prismatic" -->
    <parent link="base_link" /><!-- joint连接两个实体部件,在URDF树上形成父子关系 -->
    <child link="right_leg" />
    <origin xyz="0 -0.22 0.25" />
    <!-- 关节向y、z轴分别移动-0.22m、0.25m -->
    </joint>
    <link name="left_gripper">
    <visual>
    <origin rpy="0.0 0 0" xyz="0 0 0" />
    <geometry>
    <mesh filename="package://urdf_tutorial/meshes/l_finger.dae" /><!-- 实体部件外形可以导入外部模型文件 -->
    </geometry>
    </visual>
    </link>
    <joint name="left_tip_joint" type="fixed">
    <parent link="left_gripper" />
    <child link="left_tip" />
    </joint>
    </robot>
  9. 外部导入网格模型

    1. URDF支持DAE、STL、TIF等外部网格模型
    2. DAE模型可以定义颜色,因此可以不用在URDF文件中指定颜色或材质

使用sw2urdf从Solidworks中导出模型

  1. 下载sw2urdf安装
  2. 参考官方文档,在Solidworks中进行操作并导出(假设为urdf-test)
  3. sw2urdf导出的是package包,将导出的package包复制到/opt/ros/kinetic/share目录(echo $ROS_PACKAGE_PATH)
  4. 进入导出的urdf目录。roscd urdf-
  5. 执行roslaunch。roslaunch urdf_tutorial display.launch model:=urdf/urdf-testt.urdf

创建可移动的URDF模型

代码说明

  1. 在上一节基础上修改URDF文件的joint节点(source)
  2. 运行效果

    1
    roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.urdf gui:=true

  3. joint类型说明:
    1. continuous:可以从负无穷到正无穷的任意角度变化。相对于fixed,需要axis标签说明旋转轴
    2. revolute:效果和continuous类似,但是具有严格的旋转范围限制,出axis标签外,还需要limit标签的upper、lower限定最大、最小旋转角度(单位:弧度),effort、velocity限定最大旋转力矩、旋转速度
    3. prismatic:prismatic是平行移动关节,关节沿axis周平行移动,而不是沿轴旋转。因为prismatic是平行移动,因此可以用于产生伸缩效果。limit标签内容和revolute类似,差别是在prismatic中的单位是米
    4. 其他joint:planar——可沿平面平行移动(prismatic只能沿一个轴移动);floating——浮动关节,可以沿着三维空间任意方向移动
  4. continuous示例代码

    1
    2
    3
    4
    5
    6
    <joint name="head_swivel" type="continuous">
    <parent link="base_link"/>
    <child link="head"/>
    <axis xyz="0 0 1"/>
    <origin xyz="0 0 0.3"/>
    </joint>
  5. revolute示例代码

    1
    2
    3
    4
    5
    6
    7
    <joint name="left_gripper_joint" type="revolute">
    <axis xyz="0 0 1"/>
    <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
    <origin rpy="0 0 0" xyz="0.2 0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="left_gripper"/>
    </joint>
  6. prismatic示例代码

    1
    2
    3
    4
    5
    6
    <joint name="gripper_extension" type="prismatic">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/>
    <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
    </joint>

RVIZ中URDF模型控制原理

  1. rviz首先解析URDF文件,并查找到所有非fixed的关节及限制参数
  2. 将滑块数据广播到sensor_msgs/JointState中
  3. 然后使用robot_state_publisher来计算所有的坐标变换
  4. 计算结果用于在rviz中进行显示

手动创建URDF文件

URDF文件书写格式


urdf模型中,包括:连杆link、关节joint、运动学参数axis、动力学参数dynamics、可视化模型visual、碰撞检测模型collision等。