当前位置:   article > 正文

ROS学习笔记十一:创建URDF 文件并在RVIZ中查看模型

rviz界面中怎么找到模型

Unified Robot Description Format,简称为URDF(标准化机器人描述格式),是一种用于描述机器人及其部分结构、关节、自由度等的XML格式文件。


一、创建第一个URDF文件

将要创建的URDF文件描述的是一种最常见的移动机器人,它有四个轮子、一个带有抓取器的手臂。

为了打好基础,我们先做一个带有四个轮子的机器人底座。在 chapter7_tutorials/robot1_description/urdf 文件夹创建一个新文件并命名为robot1.urdf,其内容如下:

  1. <?xml version="1.0"?>
  2. <robot name="robot1">
  3. <link name="base_link">
  4. <visual>
  5. <geometry>
  6. <box size="0.2 .3 .1"/>
  7. </geometry>
  8. <origin rpy="0 0 0" xyz="0 0 0.05"/>
  9. <material name="white">
  10. <color rgba="1 1 1 1"/>
  11. </material>
  12. </visual>
  13. </link>
  14. <link name="wheel_1">
  15. <visual>
  16. <geometry>
  17. <cylinder length="0.05" radius="0.05"/>
  18. </geometry>
  19. <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
  20. <material name="black">
  21. <color rgba="0 0 0 1"/>
  22. </material>
  23. </visual>
  24. </link>
  25. <link name="wheel_2">
  26. <visual>
  27. <geometry>
  28. <cylinder length="0.05" radius="0.05"/>
  29. </geometry>
  30. <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
  31. <material name="black"/>
  32. </visual>
  33. </link>
  34. <link name="wheel_3">
  35. <visual>
  36. <geometry>
  37. <cylinder length="0.05" radius="0.05"/>
  38. </geometry>
  39. <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
  40. <material name="black"/>
  41. </visual>
  42. </link>
  43. <link name="wheel_4">
  44. <visual>
  45. <geometry>
  46. <cylinder length="0.05" radius="0.05"/>
  47. </geometry>
  48. <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
  49. <material name="black"/>
  50. </visual>
  51. </link>
  52. <joint name="base_to_wheel1" type="fixed">
  53. <parent link="base_link"/>
  54. <child link="wheel_1"/>
  55. <origin xyz="0 0 0"/>
  56. </joint>
  57. <joint name="base_to_wheel2" type="fixed">
  58. <parent link="base_link"/>
  59. <child link="wheel_2"/>
  60. <origin xyz="0 0 0"/>
  61. </joint>
  62. <joint name="base_to_wheel3" type="fixed">
  63. <parent link="base_link"/>
  64. <child link="wheel_3"/>
  65. <origin xyz="0 0 0"/>
  66. </joint>
  67. <joint name="base_to_wheel4" type="fixed">
  68. <parent link="base_link"/>
  69. <child link="wheel_4"/>
  70. <origin xyz="0 0 0"/>
  71. </joint>
  72. </robot>


二、常见标签说明

连接(link)标签

标签功能
<link>连接的可视化、碰撞和惯性属性设置
<visual>设置连接的可视化属性
<collision>设置连接的碰撞计算属性
<inertial>设置连接的惯性属性
<geometry>输入模型的形状。提供box、cylinder、sphere等形态
<origin>设置相对于连接相对坐标系的移动和旋转
<material>设置连接的颜色和纹理
<mass>连接重量(单位:kg)的设置


关节(joint)标签

标签功能
<joint>与连接的关系和关节类型的设置
<parent>关节的父连接
<child>关节的子连接
<origin>将父连接坐标系转换为子连接坐标系
<axis>设置旋转轴
<limit>设置关节的速度、力和半径(仅当关节是revolute或prismatic时)


transmission标签

<transmission>是与ROS-CONTROL一起运行所必须的标签,它输入关节与舵机之间的命令接口。

标签功能
<transmission>设置关节和舵机之间的变量
<type>设置力的传递方式的形状
<joint>设置关节信息设置
<hardwareInterface>设置硬件接口
<actuator>设置舵机信息
<mechanicalReduction>设置舵机与关节之间的齿轮比

注:这里的起点位置是相对与父连杆的位置,并不是绝对坐标。另外连接又称连杆。


三、解释文件格式

如你在代码中所见,有两种用于描述机器人几何结构的基本字段:连接(link)和关节(joint)。

第一个连接的名字是base_link(基本连接),这个名字在文件中必须唯一:

  1. <link name="base_link">
  2. <visual>
  3. <geometry>
  4. <box size="0.2 .3 .1"/>
  5. </geometry>
  6. <origin rpy="0 0 0" xyz="0 0 0.05"/>
  7. <material name="white">
  8. <color rgba="1 1 1 1"/>
  9. </material>
  10. </visual>
  11. </link>
  • link name:定义连接名称为base_link
  • visual:让定义的物体结构可见
  • geometry:定义几何形状(圆柱体、立方体、球体和网格)为box,尺寸为0.2*0.3*0.1
  • origin:rpy-起点位置无位移,xyz-绕z轴旋转
  • material:定义材质(颜色和纹理),这里只定义了颜色为rgba="1 1 1 1"

然后使用以下代码定义关节:

  1. <joint name="base_to_wheel1" type="fixed">
  2. <parent link="base_link"/>
  3. <child link="wheel_1"/>
  4. <origin xyz="0 0 0"/>
  5. </joint>
  • joint name:定义关节名称为base_to_wheel1,类型为固定关节
  • parent link:父连接是base_link
  • child link:子连接是wheel_1
  • origin:起点位置相对父连接无位移


关节类型

  • fiexd:固定关节,不允许运动的特殊关节
  • continuous:转动关节,可以绕单轴无线旋转
  • revolute:旋转关节,类似于continuous,但旋转角度有限
  • prismatic:滑动关节,沿某一轴线移动的关节,带有位置极限
  • floating:浮动关节,允许进行平移、旋转运动
  • planar:平面关节,允许在平面正交方向上平移或者旋转


四、检查URDF语法

ROS为用户提供了一个检查URDF语法的命令:

check_urdf robot1.urdf

如果一切正常,将会有如下显示:

  1. robot name is: Robot1
  2. ---------- Successfully Parsed XML ---------------
  3. root Link: base_link has 4 child(ren)
  4. child(1): wheel1
  5. child(2): wheel2
  6. child(3): wheel3
  7. child(4): wheel4

如果你希望以图形的方式来查看它,那么可以使用urdf_to_graphiz命令工具:

$ urdf_to_graphiz robot1.urdf

此命令将生成两个文件:robot1.gv 和 robot1.pdf。可以使用 evince 打开:

evince robot1.pdf

显示如下:

ROS_evince.png


五、在rviz里查看3D模型

新建launch文件

在robot1_description/launch文件夹下新建display.launch文件,代码如下:

  1. <?xml version="1.0"?>
  2. <launch>
  3. <arg name="model" />
  4. <arg name="gui" default="False" />
  5. <param name="robot_description" textfile="$(arg model)" />
  6. <param name="use_gui" value="$(arg gui)"/>
  7. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
  8. <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  9. <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />
  10. </launch>


运行launch文件

$ roslaunch robot1_description display.launch model:="`rospack find robot1_description`/urdf/robot1.urdf"

注:把文件直接拖进终端就可以直接显示文件位置信息。


显示如下: 

ROS_chap11_A.png

默认状态下画面中什么都没有,此时需要做出调整。在左下角的add按钮中添加RobotModel,然后将Fixed Frame选为base_link。

ROS_chap11_B.png


六、添加基座臂、连接臂和夹持臂

补充urdf文件

在</robot>前增添以下代码:

  1. <link name="arm_base">
  2. <visual>
  3. <geometry>
  4. <box size="0.1 .1 .1"/>
  5. </geometry>
  6. <origin rpy="0 0 0" xyz="0 0 0.1"/>
  7. <material name="white">
  8. <color rgba="1 1 1 1"/>
  9. </material>
  10. </visual>
  11. <collision>
  12. <geometry>
  13. <box size="0.1 .1 .1"/>
  14. </geometry>
  15. </collision>
  16. <inertial>
  17. <mass value="1"/>
  18. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  19. </inertial>
  20. </link>
  21. <joint name="base_to_arm_base" type="continuous">
  22. <parent link="base_link"/>
  23. <child link="arm_base"/>
  24. <axis xyz="0 0 1"/>
  25. <origin xyz="0 0 0"/>
  26. </joint>
  27. <link name="arm_1">
  28. <visual>
  29. <geometry>
  30. <box size="0.05 .05 0.5"/>
  31. </geometry>
  32. <origin rpy="0 0 0" xyz="0 0 0.25"/>
  33. <material name="white">
  34. <color rgba="1 1 1 1"/>
  35. </material>
  36. </visual>
  37. <collision>
  38. <geometry>
  39. <box size="0.05 .05 0.5"/>
  40. </geometry>
  41. </collision>
  42. <inertial>
  43. <mass value="1"/>
  44. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  45. </inertial>
  46. </link>
  47. <joint name="arm_1_to_arm_base" type="revolute">
  48. <parent link="arm_base"/>
  49. <child link="arm_1"/>
  50. <axis xyz="1 0 0"/>
  51. <origin xyz="0 0 0.15"/>
  52. <limit effort ="1000.0" lower="-1.0" upper="1.0" velocity="0.5"/>
  53. </joint>
  54. <link name="arm_2">
  55. <visual>
  56. <geometry>
  57. <box size="0.05 0.05 0.5"/>
  58. </geometry>
  59. <origin rpy="0 0 0" xyz="0.06 0 0.15"/>
  60. <material name="white">
  61. <color rgba="1 1 1 1"/>
  62. </material>
  63. </visual>
  64. <collision>
  65. <geometry>
  66. <box size="0.05 .05 0.5"/>
  67. </geometry>
  68. </collision>
  69. <inertial>
  70. <mass value="1"/>
  71. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  72. </inertial>
  73. </link>
  74. <joint name="arm_2_to_arm_1" type="revolute">
  75. <parent link="arm_1"/>
  76. <child link="arm_2"/>
  77. <axis xyz="1 0 0"/>
  78. <origin xyz="0.0 0 0.45"/>
  79. <limit effort ="1000.0" lower="-2.5" upper="2.5" velocity="0.5"/>
  80. </joint>
  81. <joint name="left_gripper_joint" type="revolute">
  82. <axis xyz="0 0 1"/>
  83. <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
  84. <origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/>
  85. <parent link="arm_2"/>
  86. <child link="left_gripper"/>
  87. </joint>
  88. <link name="left_gripper">
  89. <visual>
  90. <origin rpy="0 0 0" xyz="0 0 0"/>
  91. <geometry>
  92. <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
  93. </geometry>
  94. </visual>
  95. <collision>
  96. <geometry>
  97. <box size="0.1 .1 .1"/>
  98. </geometry>
  99. </collision>
  100. <inertial>
  101. <mass value="1"/>
  102. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  103. </inertial>
  104. </link>
  105. <joint name="left_tip_joint" type="fixed">
  106. <parent link="left_gripper"/>
  107. <child link="left_tip"/>
  108. </joint>
  109. <link name="left_tip">
  110. <visual>
  111. <origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/>
  112. <geometry>
  113. <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
  114. </geometry>
  115. </visual>
  116. <collision>
  117. <geometry>
  118. <box size="0.1 .1 .1"/>
  119. </geometry>
  120. </collision>
  121. <inertial>
  122. <mass value="1"/>
  123. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  124. </inertial>
  125. </link>
  126. <joint name="right_gripper_joint" type="revolute">
  127. <axis xyz="0 0 -1"/>
  128. <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
  129. <origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/>
  130. <parent link="arm_2"/>
  131. <child link="right_gripper"/>
  132. </joint>
  133. <link name="right_gripper">
  134. <visual>
  135. <origin rpy="-3.1415 0 0" xyz="0 0 0"/>
  136. <geometry>
  137. <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>
  138. </geometry>
  139. </visual>
  140. <collision>
  141. <geometry>
  142. <box size="0.1 .1 .1"/>
  143. </geometry>
  144. </collision>
  145. <inertial>
  146. <mass value="1"/>
  147. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  148. </inertial>
  149. </link>
  150. <joint name="right_tip_joint" type="fixed">
  151. <parent link="right_gripper"/>
  152. <child link="right_tip"/>
  153. </joint>
  154. <link name="right_tip">
  155. <visual>
  156. <origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/>
  157. <geometry>
  158. <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/>
  159. </geometry>
  160. </visual>
  161. <collision>
  162. <geometry>
  163. <box size="0.1 .1 .1"/>
  164. </geometry>
  165. </collision>
  166. <inertial>
  167. <mass value="1"/>
  168. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  169. </inertial>
  170. </link>


运行launch文件

$ roslaunch robot1_description display.launch model:="`rospack find robot1_description`/urdf/robot1.urdf"


显示如下:

ROS_rviz.png


七、使机器人模型运动

最常用的关节是转动关节。例如,我们在 arm_1_to_arm_base 上使用的就是,其代码如下所示:

  1. <joint name="arm_1_to_arm_base" type="revolute">
  2. <parent link="arm_base"/>
  3. <child link="arm_1"/>
  4. <axis xyz="1 0 0"/>
  5. <origin xyz="0 0 0.15"/>
  6. <limit effort ="1000.0" lower="-1.0" upper="1.0" velocity="0.5"/>
  7. </joint>
  • <axis xyz="1 0 0"/>旋转转动轴来运动。
  • limit 标签用于选择以下属性:effort(关节所承受的最大力),lower(赋值给关节的下限,旋转关节的单位是弧度,移动关节的单位是米),upper(赋值给关节的上限),velocity(强制关节的最大速度)。

要判断关节的轴或转动限值是否合适,有一种好的办法就是使用 joint_state_publisher GUI 运行 rviz(加上了gui:=true):

$ roslaunch robot1_description display.launch model:="`rospack find robot1_description`/urdf/robot1.urdf" gui:=true

joint_state_publisher GUI 运行界面显示如下:

ROS_chap11_C.png

urdf文件中每一个axis对应一个调节器,joint_state_publisher应该是ros中自带的调节joint的功能,所以直接调用就可以。另外界面中的每个滑块都能控制一个关节。


八、物理属性和碰撞属性

如果你想要在 gazebo 或者其他仿真软件上进行机器人仿真,就需要添加物理属性和碰撞属性。这意味着我们需要设定几何尺寸来计算可能的碰撞,例如设定重量我们才能够计算惯性等。

你需要保证模型文件中的所有连接都有这些参数,否则就无法对这些机器人进行仿真。

在下面的代码中,你会看到我们向名为 base_link 的连接添加这两个属性:

  1. <link name="base_link">
  2. ...
  3. <collision>
  4. <geometry>
  5. <box size="0.2 .3 0.1"/>
  6. </geometry>
  7. </collision>
  8. <inertial>
  9. <mass value="100"/>
  10. <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
  11. </inertial>
  12. </link>

对于其他的连接也要这么做。记住,要为所有连接添加 collision 和 inertial 属性,因为如果你不这样做的话,gazebo 将无法使用这些模型。

你能够在 robot1_description/urdf/robot1_physics.urdf 中查看带有所有参数的完整文件。


参考: 

ROS-URDF仿真


转载于:https://www.cnblogs.com/linuxAndMcu/p/10874789.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/700193
推荐阅读
相关标签
  

闽ICP备14008679号