URDF实例
可以看到使用的是xml格式
从上面可以大概看到如何创建一个机器人模型
创建机器人模型需要将机器人拆解开,分成很多个部分
拆开的部分大概可以分为两大类
一类是link(连杆,刚体),视觉上可以感知的,比如人的大臂、小臂可以称之为两个连杆,连杆直接需要通过一定的关节来连接也就是另一类
另一类是joint(关节)。
整个机器人可以是 n个link + n个 joint 组成
如下图
展示了三个子标签的相关内容
首先绿色椭圆形是直观上去看到的是visual表达的
另外一个惯性参数 比如质心 是在蓝色的坐标下面,可以通过一些三维仿真软件、三维设计软件可以计算惯性矩阵参数
外侧红色的框是碰撞参数,一但该link和其它link或环境在红色框中发生交叉,代表和其它部分发生了碰撞。为了计算方便,会把碰撞属性做简化。
link还有一个比较关键的部分 就是坐标系
上图中 Link origin 是起始坐标,整个link创建的时候都是相对 Link origin坐标系创建的
joint就是用来连接两个具体的link部分的
关节类型 | 描述 |
---|---|
continuous | 旋转关节,可以围绕单轴无限旋转 |
revolute | 旋转关节,类似于continuous,但是有旋转的角度限制 |
prismatic | 滑动关节,沿某一轴线移动的关节,带有位置极限 |
planar | 平面关节,允许在平面正交方向上平移或者旋转 |
floating | 浮动关节,允许进行平移、旋转运动 |
fixed | 固定关节,不允许运动的特殊关节 |
下面图中,蓝色关节表示出一个运动的轴,蓝色关节是可以围绕该轴旋转的,也就是child这个link是可以围绕joint上下旋转。
joint是连接两个link,需要分一个主次关系,主关节是parent link,子关节是child link, 在xml形式的描述中 这个两个 link是必须存在的
joint 标签
整个一个机器人的完整模型可以用link和joint两种标签来描述
这两种标签需要包含到更大的标签中去 就是robot
创建一个机器人建模的功能包
进入工作空间中的src 功能包目录下
$ cd ./catkin_ws/src/
输入创建功能包命令
$ catkin_create_pkg mbot_description urdf xacro
机器人模型、描述文件在ROS里 通常的以 机器人名_description
并且需要urdf 依赖功能呢包 和 xacro(优化urdf用的)依赖
主要是加载urdf 并在rviz中显示
下面launch文件是在rviz中显示机器人的一种固定形态
想显示机器人基本上修改第一行 urdf文件的路径和最后一行rviz配置文件的路径就行
<launch>
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
<param name="use_gui" value="true"/>
<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" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
launch>
在urdf文件夹下 创建mbot_base.urdf文件
注意在运行launch文件时,.urdf里的注释要去掉,否正会报错误
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
material>
visual>
link>
robot>
可以先看下这个link显示的效果
执行刚写的launch文件
$ roslaunch display_mbot_base_urdf.launch
在base_link下继续加
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
visual>
link>
在base_link与left_wheel_link 中间加入joint :left_wheel_joint
类型是 continuous无限旋转 详见joint介绍
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
joint>
左轮添加完成,可以看下效果
其中的下面这个插件
可以来做旋转测试
对应launch文件中的
和左轮类似 有的参数镜像就行 : joint 处 y轴与左轮相反
<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="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
material>
visual>
link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
material>
visual>
link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 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">
<color rgba="0 0 0 0.95"/>
material>
visual>
link>
摄像头
以黑色正方块表示
<link name="camera_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.03 0.04 0.04" />
geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
material>
visual>
link>
<joint name="camera_joint" type="fixed">
<origin xyz="0.17 0 0.10" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="camera_link"/>
joint>
激光雷达
<link name="laser_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
geometry>
<material name="black"/>
visual>
link>
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.105" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="laser_link"/>
joint>
kinect
<link name="kinect_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 1.5708"/>
<geometry>
<mesh filename="package://mbot_description/meshes/kinect.dae" />
geometry>
visual>
link>
<joint name="laser_joint" type="fixed">
<origin xyz="0.15 0 0.11" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="kinect_link"/>
joint>
这样一个可视化的机器人就创建完成了
在urdf文件夹下执行 urdf_to_graphiz+要检查的urdf文件
$ urdf_to_graphiz mbot_with_kinect.urdf
会在当前路径下创建一个pdf文件
可以看到机器人所以的link和joint的关系分析出来
wiki.ros.org/urdf/Tutorials
如何优化urdf模型,放在下次博客