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>
### TurtleBot3 Gazebo Simulation Arm Grasping Modeling Tutorial #### 1. 安装依赖项环境设置 为了在Gazebo中模拟TurtleBot3并集成机械臂抓取功能,需安装必要的软件包。这包括ROS机器人操作系统)、Gazebo仿真器以及特定的TurtleBot3支持文件。 ```bash sudo apt-get update && sudo apt-get install ros-noetic-turtlebot3* \ ros-noetic-gazebo-ros-pkgs ros-noetic-moveit python-catkin-tools git wget ``` 上述命令会下载所有必需组件来启动项目[^2]。 #### 2. 获取TurtleBot3模型资源 通过克隆官方GitHub仓库获取最新的TurtleBot3描述文件其他辅助工具: ```bash cd ~/catkin_ws/src/ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git ``` 此操作提供了用于创建自定义场景的基础结构[^1]。 #### 3. 添加机械臂到TurtleBot3 要使TurtleBot3具备手臂动作能力,可以采用URDF(统一机器人描述格式)扩展现有平台设计。一种方法是从其他开源项目借用成熟的上肢设计方案,比如Fetch或Rethink Robotics公司的Sawyer型号,并调整尺寸使之适应小型移动底盘的要求。 对于具体实施细节,在`turtlebot3_description`包内编辑相应的`.urdf.xacro`模板文档,加入额外关节服务接口声明以便后续控制逻辑调用[^3]。 #### 4. 配置MoveIt! 运动规划框架 为了让机器人的末端执行器能够完成精确的任务目标——即物体拾起放置过程中的路径计算与碰撞检测等功能,则需要配置好MoveIt!插件。按照官方指南逐步完成初始化流程后,记得针对新添加的手部装置重新生成SRDF语义约束表单,从而确保整个系统的协调运作。 #### 5. 编写控制器脚本 最后一步涉及编写Python/C++程序片段用来发送指令给硬件驱动层面上下位机通信协议栈;同时监听传感器反馈数据流以评估当前状态是否满足预期效果。利用ROS话题发布订阅机制简化跨进程间消息传递方式,提高开发效率的同时也增强了代码可读性维护便利性。 ```python import rospy from sensor_msgs.msg import JointState from std_srvs.srv import Empty def move_arm_to_pose(): # 初始化节点 rospy.init_node('move_turtlebot3_arm') # 发布关节位置设定值 pub_joint_states = rospy.Publisher('/joint_states', JointState, queue_size=10) rate = rospy.Rate(10) # 设置循环频率 while not rospy.is_shutdown(): try: joint_msg = JointState() joint_msg.header.stamp = rospy.Time.now() # 假设这里填入具体的关节角度数值列表 joint_msg.position = [0.0, -1.57, 0.0] pub_joint_states.publish(joint_msg) break except KeyboardInterrupt: pass if __name__ == '__main__': move_arm_to_pose() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值