前言
经过ROS的保姆级教程之后,相信大家对ROS应该有一个基本的认识了!关于各种工具的使用其实等到真正有所需求之后再去查找即可,roswiki始终是最好的最一手的信息来源。本系列的博客主要用来记录如何让在ROS的环境下进行机器人的建模与仿真,学完之后,就可以称得上是入了ROS的坑了~
什么是urdf
在如今的开发中我们通常使用xacro来进行建模,之后在进行gazebo仿真时将其转换成相应的urdf格式即可,另一种方式是使用专门的三维建模软件诸如solidworks、catia、ug来建模,然后导出urdf文件。虽说早已不再直接使用urdf的格式,但是学习一下还是很有必要的。
首先要了解的什么是urdf?定义如下图所示:
整个组织的描述形式是xml格式的,在ros中的很多配置文件(比如launch文件等)都是使用的这种格式,可以很方便的使用标签属性来描述各个相关信息,组织起来方便,看上去也比较直观。
link刚体属性
用于描述机器人某个刚体部分的外观和物理属性,包括 尺寸(size)颜色(color)形状(shap)惯性矩阵(inertial matrix)碰撞参数(collision properties)<visual>
标签用于描述机器人link部分的外观参数
<inertial>
标签用于描述link的惯性参数,
<collision>
标签用于描述link的碰撞属性
由图中可以看出collision的区域要大于visual的区域,这就意味着只要有其它物体与collision区域相交,就认为link发生碰撞
joint关节属性
(关节)
描述机器人关节的运动学与动力学属性包括关节运动的位置和速度限制根据关节运动形式,可以将其分为六种类型
完整的robot属性
完整机器人模型的最顶层标签 和标签都必须包含在标签内 一个完整的机器人模型由一系列的link和joint组成实际操作
创建功能包
有关功能包的知识可以参考这篇博客。
依旧在我们的catkin_ws中的src文件夹下创建功能包:
catkin_create_pkg mbot_description urdf xacro
在功能包中创建几个文件夹
urdf:存放机器人模型的URDF或xacro文件meshes:放置URDF中引用的模型渲染文件launch:保存相关启动文件config:用来保存相关功能包的配置文件,这里用来保存rviz的配置文件
在launch文件夹下创建文件display_mbot_base_urdf.launch,并写入代码
<launch><param name="robot_description" textfile="$(find mbot_description)/urdf/urdf/mbot_base.urdf" /><!-- 设置GUI参数,显示关节控制插件 --><param name="use_gui" value="true"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态 --><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可视化界面 --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" /></launch>
joint_state_publisher
:发布每个joint(除fixed类型)的状态,而且可以通过UI界面对joint进行控制
robot_state_publisher
:将机器人各个links、joints之间的关系,通过TF的形式,整理成三维姿态信息发布
在urdf文件夹下创建mbot文件夹,并在mbot文件夹下创建文件mbot_base.urdf,并写入代码,创建我们的小车:
<?xml version="1.0" ?><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><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><link name="left_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"><color rgba="1 1 1 0.9"/></material></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="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"><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></robot>
这里可能会报错:
看原因也很简单,主要是缺少了一些相关的包,所以只要输入以下命令安装即可:
sudo apt-get install ros-kinetic-joint-state-publisher-gui
加入摄像头:
<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>
再次使用roslaunch mbot_description display_mbot_base_urdf.launch
查看模型;
在urdf文件夹下打开终端,输入命令查看urdf模型的整体结构:
urdf_to_graphiz mbot_base.urdf
可以看见生成了对应的文件:
URDF建模存在的问题
模型冗长,重复内容过多;参数的修改过于麻烦,不便于二次开发;没有参数计算的功能;那么该如何优化这样存在着诸多不足的URDF模型呢,且看下回分解。