ROS机器人描述——URDF,SRDF和XACRO

本文详细介绍了URDF(统一机器人描述格式)的基本概念、组成元素及其应用,并展示了如何使用URDF描述机器人的结构、位置及形状等特性。此外,还讲解了如何利用RVIZ工具显示URDF文件,并引入了SRDF文件的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、URDF

URDF(Unified Robot Description Format)是一种特殊的XML文件格式。
URDF形成通常有三种途径:

  1. 直接使用URDF的XML tag进行文件编写。
  2. 使用XACRO建模后转为URDF文件。
  3. 使用SolidWorks进行三维建图后使用SW2URDF插件转换为URDF文件。

URDF文件介绍:

1. link和joint
这里写图片描述

URDF描述上图机器人结构:

<robot name="test_robot">
  <link name="link1" />
  <link name="link2" />
  <link name="link3" />
  <link name="link4" />

  <joint name="joint1" type="continuous">
    <parent link="link1"/>
    <child link="link2"/>
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
  </joint>

  <joint name="joint3" type="continuous">
    <parent link="link3"/>
    <child link="link4"/>
  </joint>
</robot>

2.位置
定义好机器人的骨架后,我们需要进一步用origin子标签对link所在的位置进行定义。link的位置由joint决定,因此该子标签定义在joint内。

<robot name="test_robot">
  <link name="link1" />
  <link name="link2" />
  <link name="link3" />
  <link name="link4" />


  <joint name="joint1" type="continuous">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz=".5 .3 0.7" rpy="0 0 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-.2 .5 -0.3" rpy="0 0 1.57" />
  </joint>

  <joint name="joint3" type="continuous">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0.2" rpy="0 0 -1.57" />
  </joint>
</robot>

上述位置关系定义如下图所示:
这里写图片描述

3.形状
通过visual标签和geometry标签定义link的形状。下面示例了一些常用的形状, 以及可能会导入的一些奇形怪状的东西. 不但可以导入stl格式的文件, 还可以导入dae格式。下述示例中导入了一个小刀。

<?xml version="1.0"?>
<robot name="test_robot">
  <link name="link1">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </visual>
  </link>

  <link name="link2">
    <visual>
      <geometry>
        <box size="0.6 0.2 .1" />
      </geometry>
    </visual>
  </link>

  <link name="link3" >
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="link4" >
    <visual>
      <origin rpy="0 -1.57 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_csdn/urdf/mesh/knife.stl"/>
      </geometry>
    </visual>
  </link>


  <joint name="joint1" type="fixed">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0.22 0 0.6" rpy="0 1.57 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-0.1 0.5 0" />
  </joint>

  <joint name="joint3" type="fixed">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0" rpy="0 0 -1.57" />
  </joint>
</robot>

4.collision和joint限制
为了避免link之间发生碰撞,所以针对每一个link,还有一个collision标签,和visual标签内容完全一样。
还可以对joint的运动进行限制。比如,我们限制joint只能沿着y轴旋转,可以定义标签<axis xyz="0 1 0"/>。我们也可以限制joint的运动范围,速度,力矩进行限制,则可以添加<limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>

<?xml version="1.0"?>
<robot name="test_robot">
  <link name="link1">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </visual>
    <collision>
      <origin xyz="0.0 0 0.0" rpy="0 0 0" />
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </collision>
  </link>

  <link name="link2">
    <visual>
      <geometry>
        <box size="0.6 0.2 .1" />
      </geometry>
    </visual>
  </link>

  <link name="link3" >
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="link4" >
    <visual>
      <origin rpy="0 -1.57 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_csdn/urdf/mesh/knife.stl"/>
      </geometry>
    </visual>
  </link>


  <joint name="joint1" type="fixed">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0.22 0 0.6" rpy="0 1.57 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-0.1 0.5 0" />
    <axis xyz="0 1 0"/>
    <limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>
  </joint>

  <joint name="joint3" type="fixed">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0" rpy="0 0 -1.57" />
  </joint>
</robot>

5.可视化
通过rviz显示URDF文件,可以使用命令:

roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf

如上述内容,进行显示之后,,可以得到下图所示内容。 坐标系图示,需要添加TF条目进行显示。值得注意的地方,将Global Options中的fixed frame设定为link1。
这里写图片描述
如果设置了可移动joint,你想查看joint移动的效果和设定,可以使用命令:

roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf gui:=true

SRDF

<?xml version="1.0"?>
<robot name="excavator_real_model">
	<group name="manipulator">
		<chain base_link="base_link" tip_link="end_effector" />
	</group>
</robot>

用rviz显示URDF

标准roslaunch文件:

<launch>
	<arg name="model" default="$(find excavator_proj)/rbt_desc/excavator_robot.urdf" />
	<arg name="gui" default="true" />

	<param name="use_gui" value="$(arg gui)" />
	<param name="robot_description" textfile="$(arg model)" />
	
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
	<node name="rviz" pkg="rviz" type="rviz" required="true" />

</launch>

如果有SRDF文件,则可以像下面那样写:

<launch>
	<arg name="model" default="$(find excavator_proj)/rbt_desc/excavator_robot.urdf" />
	<arg name="gui" default="true" />

	<!-- The semantic description -->
	<param name="robot_description_semantic" textfile="$(find excavator_real_model)/urdf/excavator_real_model.srdf" />

	<param name="use_gui" value="$(arg gui)" />
	<param name="robot_description" textfile="$(arg model)" />
	
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
	<node name="rviz" pkg="rviz" type="rviz" required="true" />

</launch>
### MoveIt与Gazebo联合仿真实现教程 #### 配置概述 为了实现MoveIt与Gazebo的联合仿真,通常需要完成以下几个方面的配置:加载机器人URDF/SRDF模型到ROS参数服务器、设置控制器插件以及启动相应的节点来同步MoveIt规划场景Gazebo物理引擎的状态。这些操作可以通过编写自定义的launch文件并结合已有的功能包来完成。 #### 功能包准备 在使用MoveIt Setup Assistant工具完成机械臂的初始配置之后,会生成一个特定名称的功能包[^3]。此功能包包含了用于描述机器人几何结构、关节限制以及其他必要信息的所有文件。例如,在某个案例中创建了一个名为`left_arm_moveit_config`的工作空间目录下的功能包。 #### Launch 文件示例 下面提供了一段典型的 launch 文件代码片段,它展示了如何通过组合多个子组件来构建完整的模拟环境: ```xml <launch> <!-- 加载 URDF 到参数服务器 --> <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" /> <!-- 启动 Gazebo 并传入世界文件 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot_gazebo)/worlds/my_world.world"/> <arg name="paused" default="false"/> <arg name="use_sim_time" default="true"/> </include> <!-- 插入机器人实体 --> <node pkg="gazebo_ros" type="spawn_model" args="-urdf -model robot -param robot_description"/> <!-- 发布时钟信号给其他依赖时间戳运行的服务 --> <node pkg="ros_control_boilerplate" type="joint_state_controller" output="screen"/> <!-- 运行 move_group 节点 --> <include file="$(find left_arm_moveit_config)/launch/move_group.launch"> <arg name="allow_trajectory_execution" value="true"/> <arg name="fake_execution" value="true"/> <!-- 设置为 true 表示仅执行而不实际移动硬件 --> </include> </launch> ``` 上述XML脚本实现了几个重要目标: - 将代表整个系统的URDF字符串上传至全局命名空间内的键路径'/robot_description'之下; - 使用标准方法调用空旷世界的实例化服务,并允许调整暂停状态或者启用仿真模式的时间轴管理选项; - 把预先设定好的虚拟对象放置于指定坐标系原点附近的位置处; - 定义了一些基本类型的控制回路单元以便后续环节能够正常运转起来; - 最终激活了负责处理高层次任务请求的核心模块——即'move_group'. #### 控制器配置 对于具体的运动学求解部分,则需参照官方文档说明进一步完善对应的yaml格式配置表单内容。比如针对某些特殊需求可能涉及到PID增益调节等方面的知识点[^2]. #### 注意事项 尽管存在所谓的“无脑配置”,但深入了解背后机制有助于解决潜在问题及优化性能表现。此外还需注意不同版本间可能存在兼容性差异等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值