URDF模型
URDF建模方法
<!-- <link>连杆,主要用来描述机器人某个刚体部分的外观和物理属性 -->
<link name="link_4">
<!-- <visual>描述外观形态 -->
<visual>
<!-- <geometry>几何形状,导入solidworks中建好的stl文件 -->
<geometry>
<mesh filename="link_4.stl"/>
</geometry>
<!-- <origin>与坐标变化有关,xyz代表xyz三个方向的移动,米;roll/pitch/yaw表示绕xyz的转动,弧度 -->
<origin xyz="0 0 0" rpy="0 0 0"/>
</visual>
<!-- <collision>描述机器人的碰撞参数 -->
<collision>
<geometry>
<!-- 简化后的几何形状描述 -->
<cylinder length="0.5" radius="0.1"/>
</geometry>
<origin xyz="0 0 -0.05" rpy="0 0 0" />
<collision/>
<!-- <inertial>惯性矩阵,此处无 -->
</link>
在这里插入代码片
<!-- <joint>描述两个link之间的关系,有六种类型 -->
<joint name="joint_2" type="revolute">
<!-- 每个joint只能连接两个连杆 -->
<parent link="link_1"/>
<child link="link_2"/>
<!-- link_2相对于link_1坐标系的变换 -->
<origin xyz="0.2 0.2 0" rpy="0 0 0"/>
<!-- 围绕哪个轴旋转,0~1 -->
<axis xyz="0 0 1"/>
<!--旋转限制,最大弧度,最小弧度,旋转速度-->
<limit lower="-3.14" upper="3,14" velocity="1.0"/>
</joint>
robot
手写第一个机器人的URDF模型
创建功能包及文件夹
- 在src中创建功能包名为:first_robot_description,并添加依赖:urdf xacro
- 在功能包中创建文件夹:urdf(存放机器人的urdf或xacro文件);meshes(放置urdf中引用的模型渲染文件);launch(保存相关启动文件);config(保存rviz的配置文件)
创建urdf模型
<?xml version="1.0" ?>
<robot name="first_robot">
<!-- 提前定义颜色 -->
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 0.95"/>
</material>
<material name="Yellow">
<color rgba="1 0.4 0 1"/>
</material>
<!-- 底盘的link -->
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="Blue" />
</visual>
</link>
<!-- 创建左右轮 -->
<link name="left_wheel_link">
<visual>
<geometry>
<cylinder radius="0.06" length="0.025" />
</geometry>
<!-- 轮子相对于轮子坐标系的移动 -->
<!-- 1.5707是90度,将轮子立起来 -->
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<material name="Black" />
</visual>
</link>
<joint name="left_wheel_joint" type="continuous" >
<parent link="base_link"/>
<child link="left_wheel_link"/>
<!-- 子坐标系相对于父坐标系的移动 -->
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<!-- joint可以绕着y轴旋转 -->
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="White"/>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<!-- 创建支撑轮 -->
<link name="front_caster_link">
<visual>
<geometry>
<!-- 圆球 -->
<sphere radius="0.015"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="Yellow"/>
</visual>
</link>
<joint name="front_caster_joint" type="fixed">
<parent link="base_link"/>
<child link="front_caster_link"/>
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="back_caster_joint" type="fixed">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
</joint>
<!-- 创建kinect -->
<link name="kinect_link">
<visual>
<geometry>
<mesh filename="package://first_robot_description/meshes/kinect.dae" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 1.5708"/>
</visual>
</link>
<joint name="kinect_joint" type="fixed">
<parent link="base_link"/>
<child link="kinect_link"/>
<origin xyz="0.15 0 0.11" rpy="0 0 0"/>
</joint>
</robot>
launch文件
<launch>
<!-- 导入robot模型,这样在rviz中加入robotmodel才是该模型,Param name不能改变,因为它在parameter中的名字是固定的 -->
<param name="robot_description" textfile="$(find first_robot_description)/urdf/first_robot_kinect.urdf" />
<!-- 运行robot_state_publisher节点,启动tf树,这样才能将各个link和joint坐标系导入并联合 -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<param name="use_gui" value="true" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<!-- 打开rviz, 并从路径中打开由rviz保存的配置文件,避免下次打开rviz重复配置 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find first_robot_description)/config/first_robot_config.rviz" required="true" />
</launch>
meshes 文件
工具-检查urdf完整性
在urdf文件所在路径打开终端输入:
urdf_to_graphiz <文件名>
结果如下:
rviz中的相对坐标与绝对坐标
参考阅读
- URDF WIKI
- ROD URDF Tutorials
- URDF语法规范
- ROS探索总结(二十三)–解读URDF
- 《ROS机器人开发实践》第六章