URDF的基本定义可以参考这篇文章:
https://blog.csdn.net/qq_32761549/article/details/102580674
里面是古月居的视频内容,很详细。
什么是URDF:
Unified Robot Description Format,统一机器人描述格式
ROS中一个非常重要的机器人模型描述格式
可以解析URDF文件中使用XML格式描述的机器人模型
ROS同时也提供URDF文件的C++解析器(可以在C++代码中直接解析URDF机器人模型,好处:在基于模型的计算算法中,可以在代码中调用模型的信息,方便计算)
这是一个基本的URDF程序,可以看到使用的是xml格式
从上面可以大概看到如何创建一个机器人模型
创建机器人模型需要将机器人拆解开,分成很多个部分
拆开的部分大概可以分为两大类
一类是link(连杆,刚体),视觉上可以感知的,比如人的大臂、小臂可以称之为两个连杆,连杆直接需要通过一定的关节来连接也就是joint(关节)。
整个机器人可以是 n个link + n个 joint 组成
URDF机器人建模
link
描述机器人某个刚体部分的外观和物理属性;
尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞属性(collision properties)等。
主要以下面xml的格式来描述
< visual >:描述机器人link部分的外观参数, 尺寸、颜色、形状等的外观信息
< inertial >:描述link的惯性参数,主要用到机器人动力学的运算部分
< collision >:描述link的碰撞属性,
如下图
展示了三个子标签的相关内容
首先绿色椭圆形是直观上去看到的是visual表达的
另外一个惯性参数 比如质心 是在蓝色的坐标下面,可以通过一些三维仿真软件、三维设计软件可以计算惯性矩阵参数
外侧红色的框是碰撞参数,一但该link和其它link或环境在红色框中发生交叉,代表和其它部分发生了碰撞。为了计算方便,会把碰撞属性做简化。
link还有一个比较关键的部分 就是坐标系
上图中 Link origin 是起始坐标,整个link创建的时候都是相对 Link origin坐标系创建的
joint
joint就是用来连接两个具体的link部分的
描述机器人关节的运动学和动力学属性
包括关节运动的位置和速度限制
根据关节的运动形式,可以将其分为六种类型。
关节类型 描述
continuous 旋转关节,可以围绕单轴无限旋转
revolute 旋转关节,类似于continuous,但是有旋转的角度限制
prismatic 滑动关节,沿某一轴线移动的关节,带有位置极限
planar 平面关节,允许在平面正交方向上平移或者旋转
floating 浮动关节,允许进行平移、旋转运动
fixed 固定关节,不允许运动的特殊关节
下面图中,蓝色关节表示出一个运动的轴,蓝色关节是可以围绕该轴旋转的,也就是child这个link是可以围绕joint上下旋转。
joint是连接两个link,需要分一个主次关系,主关节是parent link,子关节是child link, 在xml形式的描述中 这个两个 link是必须存在的
joint 标签
robot
整个一个机器人的完整模型可以用link和joint两种标签来描述
这两种标签需要包含到更大的标签中去 就是robot
完整机器人模型的最顶层标签
< link > 和 < joint >标签必须包含在 < robot > 标签内
实例:
在原来的文件夹下新建一个文件夹:
$ cd cd ~/exper/src
$ catkin_create_pkg exper4231 urdf xacro
然后进入该文件夹,创建几个新的文件夹,用来放我们新建的文件:
首先我们在launch文件夹中创建一个launch文件,名字为exper_urdf.launch,并添加下面内容:
<launch>
<!-- param是要加载ros的一个参数:robot_description (描述机器人的具体模型) 参数的具体内容是.urdf文件 ,将路径下的.urdf文件内容让到robot_description -->
<param name="robot_description" textfile="$(find exper4231)/urdf/exper_urdf.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 ,而且可以通过UI界面对joint进行控制 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf ,整理成三维姿态信息发布 -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 运行rviz可视化界面 通过 args加载参数 .rviz文件 作用:默认打开rviz没有任何显示插件 通过保存配置文件的形式保存设置好的插件 保存在config下 配置文件是可以通过rviz保存得到的 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find exper4231)/config/exper_urdf.rviz" required="true" />
</launch>
这里最好把注释去掉,因为当时我添加的注释后启动launch文件报错了,我把注释删掉后就没问题了。
另外这里如果启动时报错:Could not find the GUI, install the ‘joint_state_publisher_gui’ package,可以执行下面命令:
$ sudo apt-get install ros-kinetic-joint-state-publisher-gui
这时候可能还会存在一个警告,如果有的话把launch文件中的joint_state_publisher用joint_state_publisher_gui全部替换,当时我是替换后才可以的。
然后在urdf文件夹下建立一个urdf文件,名字为exper_urdf.urdf(与launch文件第一行的文件名称一致),并添加下列内容:
<?xml version="1.0" ?>
<!-- 机器人名字:mbot -->
<robot name="mbot">
<!-- 一般在ros中会把机器人主体声明为base_link -->
<link name="base_link">
<!-- 通过visual子标签 描述link可视化的效果-->
<visual>
<!-- 本link的坐标 xyz单位是米 rpy单位是弧度-->
<origin xyz=" 0 0 0" rpy="0 0 0" />
<!-- geometry 几何 -->
<geometry>
<!-- cylinder 圆柱体 -->
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<!-- rgba a代表透明度 1不透明 -->
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
</robot>
保存,然后可以在终端输入:
$ roscore
$ roslaunch exper4231 exper_urdf.launch
就可以看到rviz中会有一个圆柱体。但是这里我出现过一个小问题,就是我打开了rviz终端也没有错误警告但是我的rviz中并没有显示出圆柱体,这时可以手动添加一下:点击rviz中左下方的add按钮添加robotmodel,然后将global options中的fixed frame 改为base_link,就可以正常显示了。
进一步,再加入一点别的结构,可以在urdf文件中继续添加新的内容:
<!-- 左轮link -->
<link name="left_wheel_link">
<visual>
<!-- 在x轴方向旋转90度 -->
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<!-- 左轮joint -->
<joint name="left_wheel_joint" type="continuous">
<!-- joint坐标偏移 (注意child link也就是left_wheel_link 没有偏移) -->
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<!--child link(沿x轴转了90度)在该joint下 在y轴方向旋转 -->
<axis xyz="0 1 0"/>
</joint>
注意:要想建立两个元件的关系需要添加joint。这样我们就可以得到两个相关联的物体了:
更多的代码可以参考上面文章开头的链接,给出了视频中比较全的代码。
这里也可以看出urdf的一些缺点,一个个的建模比较麻烦,代码也会很长,维护会不方便。