【ROS2】中级:URDF-重新开始构建可见呆板人模子

诗林  金牌会员 | 2024-7-19 17:08:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 686|帖子 686|积分 2058

URDF(同一呆板人形貌格式)是一种用于在 ROS 中指定呆板人几何和组织的文件格式。
  

  • 重新开始构建可见呆板人模子
  • 构建一个可移动的呆板人模子
  • 添加物理和碰撞属性
  • 使用 Xacro 清理您的代码
  •  使用 URDF 与 robot_state_publisher
  • 天生 URDF 文件
  重新开始构建visual呆板人模子

  目标:学习怎样构建一个可以在 Rviz 中查看的呆板人visual模子
  教程级别:中级
   时间:20 分钟
   目录
  

  •  一种形状
  •  多种形状
  •  开端
  •  材质女孩
  •  完成模子
   便条
  本教程假设您知道怎样编写格式良好的 XML 代码
  在本教程中,我们将构建一个大致看起来像 R2D2 的呆板人视觉模子。在后续教程中,您将学习怎样表达模子 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/URDF/Building-a-Movable-Robot-Model-with-URDF.html ,添加一些物理属性 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/URDF/Adding-Physical-and-Collision-Properties-to-a-URDF-Model.html ,并使用 xacro 天生更整洁的代码 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/URDF/Using-Xacro-to-Clean-Up-a-URDF-File.html ,但如今,我们将专注于使视觉几何精确。
  在继续之前,请确保已安装 joint_state_publisher 软件包https://index.ros.org/p/joint_state_publisher 。假如您安装了 urdf_tutorial 二进制文件 https://index.ros.org/p/urdf_tutorial/ ,这应该已经是这种情况。假如没有,请更新您的安装以包含该软件包(使用 rosdep 举行查抄)。
  本教程中提到的所有呆板人模子(以及源文件)都可以在 urdf_tutorial 包中找到。https://github.com/ros/urdf_tutorial/tree/ros2/  源码下载
   一种形状

  首先,我们将探索一个简单的形状。这是你能制作的最简单的 urdf 之一。[来源:01-myfirst.urdf]
  1. <?xml version="1.0"?> <!-- 声明 XML 版本为 1.0 -->
  2. <robot name="myfirst"> <!-- 定义一个名为 "myfirst" 的机器人 -->
  3.   <link name="base_link"> <!-- 定义一个名为 "base_link" 的链接 -->
  4.     <visual> <!-- 定义视觉元素 -->
  5.       <geometry> <!-- 定义几何形状 -->
  6.         <cylinder length="0.6" radius="0.2"/> <!-- 定义一个长度为 0.6,半径为 0.2 的圆柱体 -->
  7.       </geometry>
  8.     </visual>
  9.   </link>
  10. </robot>
复制代码
要将 XML 翻译成英文,这是一个名为 myfirst 的呆板人,它只包含一个Link(即部分),其视觉组件只是一个长 0.6 米、半径 0.2 米的圆柱体。这对于一个简单的“hello world”类型的示例来说,可能看起来有很多封闭标签,但它会变得更复杂,信赖我。
  要查抄模子,请启动 display.launch.py 文件:
  1. from launch import LaunchDescription  # 从launch模块导入LaunchDescription类
  2. from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription  # 从launch.actions模块导入DeclareLaunchArgument和IncludeLaunchDescription类
  3. from launch.substitutions import LaunchConfiguration, PathJoinSubstitution  # 从launch.substitutions模块导入LaunchConfiguration和PathJoinSubstitution类
  4. from launch_ros.substitutions import FindPackageShare  # 从launch_ros.substitutions模块导入FindPackageShare类
  5. def generate_launch_description():  # 定义一个名为generate_launch_description的函数
  6.     ld = LaunchDescription()  # 创建一个LaunchDescription对象
  7.     urdf_tutorial_path = FindPackageShare('urdf_tutorial')  # 查找urdf_tutorial包的共享路径
  8.     default_model_path = PathJoinSubstitution(['urdf', '01-myfirst.urdf'])  # 拼接默认的URDF模型路径
  9.     default_rviz_config_path = PathJoinSubstitution([urdf_tutorial_path, 'rviz', 'urdf.rviz'])  # 拼接默认的RViz配置文件路径
  10.     # 这些参数是为了向后兼容而保留的
  11.     gui_arg = DeclareLaunchArgument(name='gui', default_value='true', choices=['true', 'false'],
  12.                                     description='Flag to enable joint_state_publisher_gui')  # 声明一个名为gui的启动参数,默认值为true,可选值为true或false,描述为启用joint_state_publisher_gui的标志
  13.     ld.add_action(gui_arg)  # 将gui_arg添加到LaunchDescription对象中
  14.     rviz_arg = DeclareLaunchArgument(name='rvizconfig', default_value=default_rviz_config_path,
  15.                                      description='Absolute path to rviz config file')  # 声明一个名为rvizconfig的启动参数,默认值为default_rviz_config_path,描述为RViz配置文件的绝对路径
  16.     ld.add_action(rviz_arg)  # 将rviz_arg添加到LaunchDescription对象中
  17.     # 这个参数的含义与以前的版本略有不同
  18.     ld.add_action(DeclareLaunchArgument(name='model', default_value=default_model_path,
  19.                                         description='Path to robot urdf file relative to urdf_tutorial package'))  # 声明一个名为model的启动参数,默认值为default_model_path,描述为相对于urdf_tutorial包的机器人URDF文件路径
  20.     ld.add_action(IncludeLaunchDescription(
  21.         PathJoinSubstitution([FindPackageShare('urdf_launch'), 'launch', 'display.launch.py']),  # 包含另一个启动文件display.launch.py
  22.         launch_arguments={
  23.             'urdf_package': 'urdf_tutorial',  # 设置urdf_package参数为urdf_tutorial
  24.             'urdf_package_path': LaunchConfiguration('model'),  # 设置urdf_package_path参数为model启动参数的值
  25.             'rviz_config': LaunchConfiguration('rvizconfig'),  # 设置rviz_config参数为rvizconfig启动参数的值
  26.             'jsp_gui': LaunchConfiguration('gui')}.items()  # 设置jsp_gui参数为gui启动参数的值
  27.     ))
  28.     return ld  # 返回LaunchDescription对
复制代码
  1. # display.launch.py
  2. from launch import LaunchDescription
  3. from launch.actions import DeclareLaunchArgument
  4. from launch.actions import IncludeLaunchDescription
  5. from launch.conditions import IfCondition, UnlessCondition
  6. from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
  7. from launch_ros.actions import Node
  8. from launch_ros.substitutions import FindPackageShare
  9. # 生成启动描述函数
  10. def generate_launch_description():
  11.     ld = LaunchDescription()  # 创建一个LaunchDescription对象
  12.     urdf_launch_package = FindPackageShare('urdf_launch')  # 查找urdf_launch包的共享路径
  13.     # 添加启动参数,用于启用joint_state_publisher_gui
  14.     ld.add_action(DeclareLaunchArgument(name='jsp_gui', default_value='true', choices=['true', 'false'],
  15.                                         description='Flag to enable joint_state_publisher_gui'))
  16.     # 设置rviz配置文件的默认路径
  17.     default_rviz_config_path = PathJoinSubstitution([urdf_launch_package, 'config', 'urdf.rviz'])
  18.     ld.add_action(DeclareLaunchArgument(name='rviz_config', default_value=default_rviz_config_path,
  19.                                         description='Absolute path to rviz config file'))
  20.     # 由于https://github.com/ros2/launch/issues/313,需要手动传递配置
  21.     ld.add_action(IncludeLaunchDescription(
  22.         PathJoinSubstitution([urdf_launch_package, 'launch', 'description.launch.py']),
  23.         launch_arguments={
  24.             'urdf_package': LaunchConfiguration('urdf_package'),
  25.             'urdf_package_path': LaunchConfiguration('urdf_package_path')}.items()
  26.     ))
  27.     # 根据gui参数,启动joint_state_publisher或joint_state_publisher_gui
  28.     ld.add_action(Node(
  29.         package='joint_state_publisher',
  30.         executable='joint_state_publisher',
  31.         condition=UnlessCondition(LaunchConfiguration('jsp_gui'))
  32.     ))
  33.     ld.add_action(Node(
  34.         package='joint_state_publisher_gui',
  35.         executable='joint_state_publisher_gui',
  36.         condition=IfCondition(LaunchConfiguration('jsp_gui'))
  37.     ))
  38.     # 启动rviz2节点
  39.     ld.add_action(Node(
  40.         package='rviz2',
  41.         executable='rviz2',
  42.         output='screen',
  43.         arguments=['-d', LaunchConfiguration('rviz_config')],
  44.     ))
  45.     return ld  # 返回LaunchDescription对象
复制代码
  1. ros2 launch urdf_tutorial display.launch.py model:=urdf/01-myfirst.urdf
复制代码
这做了三件事:
     

  • 加载指定的模子并将其保存为 robot_state_publisher 节点的参数。
  • 运行节点以发布 sensor_msgs/msg/JointState 和变换(稍后会具体先容)
  • 使用配置文件启动 Rviz
    启动 display.launch.py 后,您应该会看到 RViz 显示以下内容:
  

  

  •  注意事项:

    • 固定框架是网格中心所在的变换框架。在这里,它是由我们的一个链接 base_link 定义的框架。
    • 视觉元素(圆柱体)的原点默认位于其几何中心。因此,圆柱体的一半位于网格下方。

  

   多种形状

  如今让我们看看怎样添加多个形状/链接。假如我们只是向 urdf 中添加更多的链接元素,解析器将不知道将它们放在那里。因此,我们必须添加关节。关节元素可以指机动和不机动的关节。我们将从不机动的或固定的关节开始。[来源:02-multipleshapes.urdf]
  1. <?xml version="1.0"?>
  2. <!-- 定义XML版本 -->
  3. <robot name="multipleshapes">
  4.   <!-- 定义机器人名称为multipleshapes -->
  5.   <link name="base_link">
  6.     <!-- 定义一个名为base_link的链接 -->
  7.     <visual>
  8.       <!-- 定义视觉元素 -->
  9.       <geometry>
  10.         <!-- 定义几何形状 -->
  11.         <cylinder length="0.6" radius="0.2"/>
  12.         <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
  13.       </geometry>
  14.     </visual>
  15.   </link>
  16.   <link name="right_leg">
  17.     <!-- 定义一个名为right_leg的链接 -->
  18.     <visual>
  19.       <!-- 定义视觉元素 -->
  20.       <geometry>
  21.         <!-- 定义几何形状 -->
  22.         <box size="0.6 0.1 0.2"/>
  23.         <!-- 定义一个长方体,尺寸为0.6x0.1x0.2 -->
  24.       </geometry>
  25.     </visual>
  26.   </link>
  27.   <joint name="base_to_right_leg" type="fixed">
  28.     <!-- 定义一个名为base_to_right_leg的关节,类型为固定 -->
  29.     <parent link="base_link"/>
  30.     <!-- 定义父链接为base_link -->
  31.     <child link="right_leg"/>
  32.     <!-- 定义子链接为right_leg -->
  33.   </joint>
  34. </robot>
  35. <!-- 结束机器人定义 -->
复制代码


  • 注意我们怎样定义一个 0.6 米 x 0.1 米 x 0.2 米的盒子。
  • 关节是根据父节点和子节点来定义的。URDF 最终是一个具有一个根链接的树结构。这意味着腿的位置取决于 base_link 的位置。
  1. ros2 launch urdf_tutorial display.launch.py model:=urdf/02-multipleshapes.urdf
复制代码

  这两个形状相互重叠,因为它们共享雷同的原点。假如我们不希望它们重叠,我们必须定义更多的原点。
  原点 Origin 
  R2D2 的腿连接到躯干的上半部分,在侧面。所以我们将关节的原点指定在那里。别的,它不是连接到腿的中间,而是连接到上部,所以我们也必须为腿的原点设置偏移。我们还将腿旋转,使其竖立。[来源:03-origins.urdf]
  1. <?xml version="1.0"?>
  2. <robot name="origins">
  3.   <!-- 定义一个名为base_link的链接 -->
  4.   <link name="base_link">
  5.     <visual>
  6.       <geometry>
  7.         <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
  8.         <cylinder length="0.6" radius="0.2"/>
  9.       </geometry>
  10.     </visual>
  11.   </link>
  12.   <!-- 定义一个名为right_leg的链接 -->
  13.   <link name="right_leg">
  14.     <visual>
  15.       <geometry>
  16.         <!-- 定义一个长方体,尺寸为0.6 0.1 0.2 -->
  17.         <box size="0.6 0.1 0.2"/>
  18.       </geometry>
  19.       <!-- 设置视觉元素的原点,绕Y轴旋转90度,沿Z轴平移-0.3 -->
  20.       <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
  21.     </visual>
  22.   </link>
  23.   <!-- 定义一个名为base_to_right_leg的固定关节 -->
  24.   <joint name="base_to_right_leg" type="fixed">
  25.     <!-- 父链接为base_link -->
  26.     <parent link="base_link"/>
  27.     <!-- 子链接为right_leg -->
  28.     <child link="right_leg"/>
  29.     <!-- 设置关节的原点,沿Y轴平移-0.22,沿Z轴平移0.25 -->
  30.     <origin xyz="0 -0.22 0.25"/>
  31.   </joint>
  32. </robot>
复制代码


  • 让我们首先查抄关节的原点。它是根据父参考系定义的。因此,我们在 y 方向上是 -0.22 米(向我们的左边,但相对于轴向右),在 z 方向上是 0.25 米(向上)。这意味着子 link 的原点将向上和向右,无论子链接的视觉原点标签怎样。由于我们没有指定 rpy(滚转俯仰偏航)属性,子框架默认将具有与父框架雷同的方向。
  • 如今,看看腿的视觉原点,它有一个 xyz 和 rpy 偏移。这定义了视觉元素的中心相对于其原点的位置。由于我们希望腿部连接在顶部,我们通过将 z 偏移设置为 -0.3 米来向下偏移原点。由于我们希望腿的长部分与 z 轴平行,我们将视觉部分绕 Y 轴旋转 PI/2。
  1. ros2 launch urdf_tutorial display.launch.py model:=urdf/03-origins.urdf
复制代码

  

  • 启动文件运行包,这些包将根据您的 URDF 为模子中的每个链接创建 TF 框架。Rviz 使用这些信息来确定显示每个形状的位置。
  • 假如给定的 URDF 链接不存在 TF 框架,那么它将被放置在原点处显示为白色(参考相关题目)。
  材质女孩

  “好吧,”我听到你说。“那很可爱,但不是每个人都有 B21。我的呆板人和 R2D2 不是赤色的!” 这是一个很好的观点。让我们看看材质标签。[来源:04-materials.urdf]
  1. <?xml version="1.0"?>
  2. <!-- 定义XML版本 -->
  3. <robot name="materials">
  4.   <!-- 定义机器人名称为materials -->
  5.   <material name="blue">
  6.     <!-- 定义一个名为blue的材质 -->
  7.     <color rgba="0 0 0.8 1"/>
  8.     <!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
  9.   </material>
  10.   <material name="white">
  11.     <!-- 定义一个名为white的材质 -->
  12.     <color rgba="1 1 1 1"/>
  13.     <!-- 定义颜色为白色,RGBA值为(1, 1, 1, 1) -->
  14.   </material>
  15.   <link name="base_link">
  16.     <!-- 定义一个名为base_link的链接 -->
  17.     <visual>
  18.       <!-- 定义视觉元素 -->
  19.       <geometry>
  20.         <!-- 定义几何形状 -->
  21.         <cylinder length="0.6" radius="0.2"/>
  22.         <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
  23.       </geometry>
  24.       <material name="blue"/>
  25.       <!-- 使用名为blue的材质 -->
  26.     </visual>
  27.   </link>
  28.   <link name="right_leg">
  29.     <!-- 定义一个名为right_leg的链接 -->
  30.     <visual>
  31.       <!-- 定义视觉元素 -->
  32.       <geometry>
  33.         <!-- 定义几何形状 -->
  34.         <box size="0.6 0.1 0.2"/>
  35.         <!-- 定义一个长方体,尺寸为0.6x0.1x0.2 -->
  36.       </geometry>
  37.       <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
  38.       <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转1.57075弧度,绕z轴旋转0度,位置为(0, 0, -0.3) -->
  39.       <material name="white"/>
  40.       <!-- 使用名为white的材质 -->
  41.     </visual>
  42.   </link>
  43.   <joint name="base_to_right_leg" type="fixed">
  44.     <!-- 定义一个名为base_to_right_leg的关节,类型为固定 -->
  45.     <parent link="base_link"/>
  46.     <!-- 定义父链接为base_link -->
  47.     <child link="right_leg"/>
  48.     <!-- 定义子链接为right_leg -->
  49.     <origin xyz="0 -0.22 0.25"/>
  50.     <!-- 定义关节的原点,位置为(0, -0.22, 0.25) -->
  51.   </joint>
  52.   <link name="left_leg">
  53.     <!-- 定义一个名为left_leg的链接 -->
  54.     <visual>
  55.       <!-- 定义视觉元素 -->
  56.       <geometry>
  57.         <!-- 定义几何形状 -->
  58.         <box size="0.6 0.1 0.2"/>
  59.         <!-- 定义一个长方体,尺寸为0.6x0.1x0.2 -->
  60.       </geometry>
  61.       <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
  62.       <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转1.57075弧度,绕z轴旋转0度,位置为(0, 0, -0.3) -->
  63.       <material name="white"/>
  64.       <!-- 使用名为white的材质 -->
  65.     </visual>
  66.   </link>
  67.   <joint name="base_to_left_leg" type="fixed">
  68.     <!-- 定义一个名为base_to_left_leg的关节,类型为固定 -->
  69.     <parent link="base_link"/>
  70.     <!-- 定义父链接为base_link -->
  71.     <child link="left_leg"/>
  72.     <!-- 定义子链接为left_leg -->
  73.     <origin xyz="0 0.22 0.25"/>
  74.     <!-- 定义关节的原点,位置为(0, 0.22, 0.25) -->
  75.   </joint>
  76. </robot>
  77. <!-- 结束机器人定义 -->
复制代码


  • 如今身体是蓝色的。我们定义了一种称为“蓝色”的新质料,其赤色、绿色、蓝色和 alpha 通道分别定义为 0、0、0.8 和 1。所有值都可以在 [0,1] 范围内。然后,该质料由 base_link 的视觉元素引用。白色质料的定义类似。
  • 您还可以在视觉元素中定义质料标签,甚至在其他链接中引用它。不过,纵然您重新定义它,也不会有人抱怨。
  • 您还可以使用纹理来指定用于为对象着色的图像文件
  1. ros2 launch urdf_tutorial display.launch.py model:=urdf/04-materials.urdf
复制代码

  完成模子 

  如今我们用一些更多的形状来完成模子:脚、轮子和头。最值得注意的是,我们添加了一个球体和一些网格。我们还会添加一些其他的部件,以便以后使用。[来源:05-visual.urdf]
  1. <?xml version="1.0"?>
  2. <!-- 定义XML版本 -->
  3. <robot name="visual">
  4.   <!-- 定义机器人名称为visual -->
  5.   <material name="blue">
  6.     <!-- 定义一个名为blue的材质 -->
  7.     <color rgba="0 0 0.8 1"/>
  8.     <!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
  9.   </material>
  10.   <material name="black">
  11.     <!-- 定义一个名为black的材质 -->
  12.     <color rgba="0 0 0 1"/>
  13.     <!-- 定义颜色为黑色,RGBA值为(0, 0, 0, 1) -->
  14.   </material>
  15.   <material name="white">
  16.     <!-- 定义一个名为white的材质 -->
  17.     <color rgba="1 1 1 1"/>
  18.     <!-- 定义颜色为白色,RGBA值为(1, 1, 1, 1) -->
  19.   </material>
  20.   <link name="base_link">
  21.     <!-- 定义一个名为base_link的链接 -->
  22.     <visual>
  23.       <!-- 定义视觉元素 -->
  24.       <geometry>
  25.         <!-- 定义几何形状 -->
  26.         <cylinder length="0.6" radius="0.2"/>
  27.         <!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
  28.       </geometry>
  29.       <material name="blue"/>
  30.       <!-- 使用名为blue的材质 -->
  31.     </visual>
  32.   </link>
  33.   <link name="right_leg">
  34.     <!-- 定义一个名为right_leg的链接 -->
  35.     <visual>
  36.       <!-- 定义视觉元素 -->
  37.       <geometry>
  38.         <!-- 定义几何形状 -->
  39.         <box size="0.6 0.1 0.2"/>
  40.         <!-- 定义一个长方体,尺寸为0.6x0.1x0.2 -->
  41.       </geometry>
  42.       <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
  43.       <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转1.57075弧度,绕z轴旋转0度,位置为(0, 0, -0.3) -->
  44.       <material name="white"/>
  45.       <!-- 使用名为white的材质 -->
  46.     </visual>
  47.   </link>
  48.   <joint name="base_to_right_leg" type="fixed">
  49.     <!-- 定义一个名为base_to_right_leg的关节,类型为固定 -->
  50.     <parent link="base_link"/>
  51.     <!-- 定义父链接为base_link -->
  52.     <child link="right_leg"/>
  53.     <!-- 定义子链接为right_leg -->
  54.     <origin xyz="0 -0.22 0.25"/>
  55.     <!-- 定义关节的原点,位置为(0, -0.22, 0.25) -->
  56.   </joint>
  57.   <link name="right_base">
  58.     <!-- 定义一个名为right_base的链接 -->
  59.     <visual>
  60.       <!-- 定义视觉元素 -->
  61.       <geometry>
  62.         <!-- 定义几何形状 -->
  63.         <box size="0.4 0.1 0.1"/>
  64.         <!-- 定义一个长方体,尺寸为0.4x0.1x0.1 -->
  65.       </geometry>
  66.       <material name="white"/>
  67.       <!-- 使用名为white的材质 -->
  68.     </visual>
  69.   </link>
  70.   <joint name="right_base_joint" type="fixed">
  71.     <!-- 定义一个名为right_base_joint的关节,类型为固定 -->
  72.     <parent link="right_leg"/>
  73.     <!-- 定义父链接为right_leg -->
  74.     <child link="right_base"/>
  75.     <!-- 定义子链接为right_base -->
  76.     <origin xyz="0 0 -0.6"/>
  77.     <!-- 定义关节的原点,位置为(0, 0, -0.6) -->
  78.   </joint>
  79.   <link name="right_front_wheel">
  80.     <!-- 定义一个名为right_front_wheel的链接 -->
  81.     <visual>
  82.       <!-- 定义视觉元素 -->
  83.       <origin rpy="1.57075 0 0" xyz="0 0 0"/>
  84.       <!-- 定义视觉元素的原点,绕x轴旋转1.57075弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  85.       <geometry>
  86.         <!-- 定义几何形状 -->
  87.         <cylinder length="0.1" radius="0.035"/>
  88.         <!-- 定义一个圆柱体,长度为0.1,半径为0.035 -->
  89.       </geometry>
  90.       <material name="black"/>
  91.       <!-- 使用名为black的材质 -->
  92.     </visual>
  93.   </link>
  94.   <joint name="right_front_wheel_joint" type="fixed">
  95.     <!-- 定义一个名为right_front_wheel_joint的关节,类型为固定 -->
  96.     <parent link="right_base"/>
  97.     <!-- 定义父链接为right_base -->
  98.     <child link="right_front_wheel"/>
  99.     <!-- 定义子链接为right_front_wheel -->
  100.     <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  101.     <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.133333333333, 0, -0.085) -->
  102.   </joint>
  103.   <link name="right_back_wheel">
  104.     <!-- 定义一个名为right_back_wheel的链接 -->
  105.     <visual>
  106.       <!-- 定义视觉元素 -->
  107.       <origin rpy="1.57075 0 0" xyz="0 0 0"/>
  108.       <!-- 定义视觉元素的原点,绕x轴旋转1.57075弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  109.       <geometry>
  110.         <!-- 定义几何形状 -->
  111.         <cylinder length="0.1" radius="0.035"/>
  112.         <!-- 定义一个圆柱体,长度为0.1,半径为0.035 -->
  113.       </geometry>
  114.       <material name="black"/>
  115.       <!-- 使用名为black的材质 -->
  116.     </visual>
  117.   </link>
  118.   <joint name="right_back_wheel_joint" type="fixed">
  119.     <!-- 定义一个名为right_back_wheel_joint的关节,类型为固定 -->
  120.     <parent link="right_base"/>
  121.     <!-- 定义父链接为right_base -->
  122.     <child link="right_back_wheel"/>
  123.     <!-- 定义子链接为right_back_wheel -->
  124.     <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  125.     <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(-0.133333333333, 0, -0.085) -->
  126.   </joint>
  127.   <link name="left_leg">
  128.     <!-- 定义一个名为left_leg的链接 -->
  129.     <visual>
  130.       <!-- 定义视觉元素 -->
  131.       <geometry>
  132.         <!-- 定义几何形状 -->
  133.         <box size="0.6 0.1 0.2"/>
  134.         <!-- 定义一个长方体,尺寸为0.6x0.1x0.2 -->
  135.       </geometry>
  136.       <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
  137.       <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转1.57075弧度,绕z轴旋转0度,位置为(0, 0, -0.3) -->
  138.       <material name="white"/>
  139.       <!-- 使用名为white的材质 -->
  140.     </visual>
  141.   </link>
  142.   <joint name="base_to_left_leg" type="fixed">
  143.     <!-- 定义一个名为base_to_left_leg的关节,类型为固定 -->
  144.     <parent link="base_link"/>
  145.     <!-- 定义父链接为base_link -->
  146.     <child link="left_leg"/>
  147.     <!-- 定义子链接为left_leg -->
  148.     <origin xyz="0 0.22 0.25"/>
  149.     <!-- 定义关节的原点,位置为(0, 0.22, 0.25) -->
  150.   </joint>
  151.   <link name="left_base">
  152.     <!-- 定义一个名为left_base的链接 -->
  153.     <visual>
  154.       <!-- 定义视觉元素 -->
  155.       <geometry>
  156.         <!-- 定义几何形状 -->
  157.         <box size="0.4 0.1 0.1"/>
  158.         <!-- 定义一个长方体,尺寸为0.4x0.1x0.1 -->
  159.       </geometry>
  160.       <material name="white"/>
  161.       <!-- 使用名为white的材质 -->
  162.     </visual>
  163.   </link>
  164. <joint name="left_base_joint" type="fixed">
  165.   <!-- 定义一个名为left_base_joint的关节,类型为固定 -->
  166.   <parent link="left_leg"/>
  167.   <!-- 定义父链接为left_leg -->
  168.   <child link="left_base"/>
  169.   <!-- 定义子链接为left_base -->
  170.   <origin xyz="0 0 -0.6"/>
  171.   <!-- 定义关节的原点,位置为(0, 0, -0.6) -->
  172. </joint>
  173. <link name="left_front_wheel">
  174.   <!-- 定义一个名为left_front_wheel的链接 -->
  175.   <visual>
  176.     <!-- 定义视觉元素 -->
  177.     <origin rpy="1.57075 0 0" xyz="0 0 0"/>
  178.     <!-- 定义视觉元素的原点,绕x轴旋转1.57075弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  179.     <geometry>
  180.       <!-- 定义几何形状 -->
  181.       <cylinder length="0.1" radius="0.035"/>
  182.       <!-- 定义一个圆柱体,长度为0.1,半径为0.035 -->
  183.     </geometry>
  184.     <material name="black"/>
  185.     <!-- 使用名为black的材质 -->
  186.   </visual>
  187. </link>
  188. <joint name="left_front_wheel_joint" type="fixed">
  189.   <!-- 定义一个名为left_front_wheel_joint的关节,类型为固定 -->
  190.   <parent link="left_base"/>
  191.   <!-- 定义父链接为left_base -->
  192.   <child link="left_front_wheel"/>
  193.   <!-- 定义子链接为left_front_wheel -->
  194.   <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  195.   <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.133333333333, 0, -0.085) -->
  196. </joint>
  197. <link name="left_back_wheel">
  198.   <!-- 定义一个名为left_back_wheel的链接 -->
  199.   <visual>
  200.     <!-- 定义视觉元素 -->
  201.     <origin rpy="1.57075 0 0" xyz="0 0 0"/>
  202.     <!-- 定义视觉元素的原点,绕x轴旋转1.57075弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  203.     <geometry>
  204.       <!-- 定义几何形状 -->
  205.       <cylinder length="0.1" radius="0.035"/>
  206.       <!-- 定义一个圆柱体,长度为0.1,半径为0.035 -->
  207.     </geometry>
  208.     <material name="black"/>
  209.     <!-- 使用名为black的材质 -->
  210.   </visual>
  211. </link>
  212. <joint name="left_back_wheel_joint" type="fixed">
  213.   <!-- 定义一个名为left_back_wheel_joint的关节,类型为固定 -->
  214.   <parent link="left_base"/>
  215.   <!-- 定义父链接为left_base -->
  216.   <child link="left_back_wheel"/>
  217.   <!-- 定义子链接为left_back_wheel -->
  218.   <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  219.   <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(-0.133333333333, 0, -0.085) -->
  220. </joint>
  221. <joint name="gripper_extension" type="fixed">
  222.   <!-- 定义一个名为gripper_extension的关节,类型为固定 -->
  223.   <parent link="base_link"/>
  224.   <!-- 定义父链接为base_link -->
  225.   <child link="gripper_pole"/>
  226.   <!-- 定义子链接为gripper_pole -->
  227.   <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
  228.   <!-- 定义关节的原点,位置为(0.19, 0, 0.2) -->
  229. </joint>
  230. <link name="gripper_pole">
  231.   <!-- 定义一个名为gripper_pole的链接 -->
  232.   <visual>
  233.     <!-- 定义视觉元素 -->
  234.     <geometry>
  235.       <!-- 定义几何形状 -->
  236.       <cylinder length="0.2" radius="0.01"/>
  237.       <!-- 定义一个圆柱体,长度为0.2,半径为0.01 -->
  238.     </geometry>
  239.     <origin rpy="0 1.57075 0" xyz="0.1 0 0"/>
  240.     <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转1.57075弧度,绕z轴旋转0度,位置为(0.1, 0, 0) -->
  241.   </visual>
  242. </link>
  243. <joint name="left_gripper_joint" type="fixed">
  244.   <!-- 定义一个名为left_gripper_joint的关节,类型为固定 -->
  245.   <origin rpy="0 0 0" xyz="0.2 0.01 0"/>
  246.   <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.2, 0.01, 0) -->
  247.   <parent link="gripper_pole"/>
  248.   <!-- 定义父链接为gripper_pole -->
  249.   <child link="left_gripper"/>
  250.   <!-- 定义子链接为left_gripper -->
  251. </joint>
  252. <link name="left_gripper">
  253.   <!-- 定义一个名为left_gripper的链接 -->
  254.   <visual>
  255.     <!-- 定义视觉元素 -->
  256.     <origin rpy="0.0 0 0" xyz="0 0 0"/>
  257.     <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  258.     <geometry>
  259.       <!-- 定义几何形状 -->
  260.       <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
  261.       <!-- 使用外部网格文件定义几何形状,文件路径为package://urdf_tutorial/meshes/l_finger.dae -->
  262.     </geometry>
  263.   </visual>
  264. </link>
  265. <joint name="left_tip_joint" type="fixed">
  266.   <!-- 定义一个名为left_tip_joint的关节,类型为固定 -->
  267.   <parent link="left_gripper"/>
  268.   <!-- 定义父链接为left_gripper -->
  269.   <child link="left_tip"/>
  270.   <!-- 定义子链接为left_tip -->
  271. </joint>
  272. <link name="left_tip">
  273.   <!-- 定义一个名为left_tip的链接 -->
  274.   <visual>
  275.     <!-- 定义视觉元素 -->
  276.     <origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/>
  277.     <!-- 定义视觉元素的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.09137, 0.00495, 0) -->
  278.     <geometry>
  279.       <!-- 定义几何形状 -->
  280.       <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
  281.       <!-- 使用外部网格文件定义几何形状,文件路径为package://urdf_tutorial/meshes/l_finger_tip.dae -->
  282.     </geometry>
  283.   </visual>
  284. </link>
  285. <joint name="right_gripper_joint" type="fixed">
  286.   <!-- 定义一个名为right_gripper_joint的关节,类型为固定 -->
  287.   <origin rpy="0 0 0" xyz="0.2 -0.01 0"/>
  288.   <!-- 定义关节的原点,绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.2, -0.01, 0) -->
  289.   <parent link="gripper_pole"/>
  290.   <!-- 定义父链接为gripper_pole -->
  291.   <child link="right_gripper"/>
  292.   <!-- 定义子链接为right_gripper -->
  293. </joint>
  294. <link name="right_gripper">
  295.   <!-- 定义一个名为right_gripper的链接 -->
  296.   <visual>
  297.     <!-- 定义视觉元素 -->
  298.     <origin rpy="-3.1415 0 0" xyz="0 0 0"/>
  299.     <!-- 定义视觉元素的原点,绕x轴旋转-3.1415弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0, 0, 0) -->
  300.     <geometry>
  301.       <!-- 定义几何形状 -->
  302.       <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
  303.       <!-- 使用外部网格文件定义几何形状,文件路径为package://urdf_tutorial/meshes/l_finger.dae -->
  304.     </geometry>
  305.   </visual>
  306. </link>
  307. <joint name="right_tip_joint" type="fixed">
  308.   <!-- 定义一个名为right_tip_joint的关节,类型为固定 -->
  309.   <parent link="right_gripper"/>
  310.   <!-- 定义父链接为right_gripper -->
  311.   <child link="right_tip"/>
  312.   <!-- 定义子链接为right_tip -->
  313. </joint>
  314. <link name="right_tip">
  315.   <!-- 定义一个名为right_tip的链接 -->
  316.   <visual>
  317.     <!-- 定义视觉元素 -->
  318.     <origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/>
  319.     <!-- 定义视觉元素的原点,绕x轴旋转-3.1415弧度,绕y轴旋转0度,绕z轴旋转0度,位置为(0.09137, 0.00495, 0) -->
  320.     <geometry>
  321.       <!-- 定义几何形状 -->
  322.       <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
  323.       <!-- 使用外部网格文件定义几何形状,文件路径为package://urdf_tutorial/meshes/l_finger_tip.dae -->
  324.     </geometry>
  325.   </visual>
  326. </link>
  327. <link name="head">
  328.   <!-- 定义一个名为head的链接 -->
  329.   <visual>
  330.     <!-- 定义视觉元素 -->
  331.     <geometry>
  332.       <!-- 定义几何形状 -->
  333.       <sphere radius="0.2"/>
  334.       <!-- 定义一个球体,半径为0.2 -->
  335.     </geometry>
  336.     <material name="white"/>
  337.     <!-- 使用名为white的材质 -->
  338.   </visual>
  339. </link>
  340. <joint name="head_swivel" type="fixed">
  341.   <!-- 定义一个名为head_swivel的关节,类型为固定 -->
  342.   <parent link="base_link"/>
  343.   <!-- 定义父链接为base_link -->
  344.   <child link="head"/>
  345.   <!-- 定义子链接为head -->
  346.   <origin xyz="0 0 0.3"/>
  347.   <!-- 定义关节的原点,位置为(0, 0, 0.3) -->
  348. </joint>
  349. <link name="box">
  350.   <!-- 定义一个名为box的链接 -->
  351.   <visual>
  352.     <!-- 定义视觉元素 -->
  353.     <geometry>
  354.       <!-- 定义几何形状 -->
  355.       <box size="0.08 0.08 0.08"/>
  356.       <!-- 定义一个长方体,尺寸为0.08x0.08x0.08 -->
  357.     </geometry>
  358.     <material name="blue"/>
  359.     <!-- 使用名为blue的材质 -->
  360.   </visual>
  361. </link>
  362. <joint name="tobox" type="fixed">
  363.   <!-- 定义一个名为tobox的关节,类型为固定 -->
  364.   <parent link="head"/>
  365.   <!-- 定义父链接为head -->
  366.   <child link="box"/>
  367.   <!-- 定义子链接为box -->
  368.   <origin xyz="0.1814 0 0.1414"/>
  369.   <!-- 定义关节的原点,位置为(0.1814, 0, 0.1414) -->
  370. </joint>
  371. </robot>
  372. <!-- 结束机器人定义 -->
复制代码
  1. ros2 launch urdf_tutorial display.launch.py model:=urdf/05-visual.urdf
复制代码

  怎样添加球体应该是相当不言自明的
  1. <link name="head">
  2.   <visual>
  3.     <geometry>
  4.       <sphere radius="0.2"/>
  5.     </geometry>
  6.     <material name="white"/>
  7.   </visual>
  8. </link>
复制代码
这里的网格是从 PR2 借来的。它们是单独的文件,你必须指定路径。你应该使用 package://NAME_OF_PACKAGE/path 符号。本教程的网格位于 urdf_tutorial 包中的一个名为 meshes 的文件夹中。
  1. <link name="left_gripper">
  2.   <visual>
  3.     <origin rpy="0.0 0 0" xyz="0 0 0"/>
  4.     <geometry>
  5.       <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
  6.     </geometry>
  7.   </visual>
  8. </link>
复制代码


  • 这些网格可以以多种不同的格式导入。STL 是相当常见的,但引擎也支持 DAE,它可以有自己的颜色数据,这意味着你不必指定颜色/质料。通常这些在单独的文件中。这些网格引用了网格文件夹中的 .tif 文件。
  • 网格也可以使用相对缩放参数或边界框大小举行调解。
  • 我们也可以引用一个完全不同包中的网格。
  

  就是这样。一个类似 R2D2 的 URDF 模子。如今你可以继续下一步,让它动起来。https://docs.ros.org/en/jazzy/Tutorials/Intermediate/URDF/Building-a-Movable-Robot-Model-with-URDF.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表