注:本篇博文全部源码下载地址为:Git Repo传送门。 1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译。 2. 源码是在 Ubuntu14.04 + Indigo 环境下编写。
前面博文已经介绍了机器人平台的机械结构设计、嵌入式硬件平台的搭建等内容,从本片开始介绍本开源机器人平台ROS系统的相关程序,主要有:
- ROS系统建模;
- Gazebo仿真;
- ROS系统机器人SLAM框架;
- SLAM中Gmapping和地图构建;
- SLAM中AMCL算法;
- 机器人正逆运动学;
- 路径规划;
- ROS系统与机器人视觉;
- ROS系统与语音交互;
- 。。。
随着本开源项目展开,所有的代码都会公开源码且GitHub托管。需要注明的是:
- 这里的开源的代码全部是基于X86平台的Linux开发的;
- 代码中很多是和嵌入式平台(小车运控板)交互的内容,小车的嵌入式软件所有的源代码后面也会分几篇博文介绍并全部公开。
OK,现在开始介绍机器人在ROS系统的建模方法,这里可以参考博主之前写的一篇双臂机器人的ROS建模方法(传送门),在开始动手自己建模之前,强烈推荐先精读ROS系统最基本的建模相关的语法介绍:
经过这两篇文章的学习,基本可以掌握ROS系统的模型描述文件的基本语法,本开源平台仍然采用Xacro文件进行模型建立。
一、模型描述文件中网格(mesh)文件的生成
前面的文章已经介绍了本开源机器人平台的机械结构设计(传送门),下面简单讲解一下模型描述文件中的引用三维网格文件的生成。Urdf/Xacro文件中支持两种网格三维文件类型:.STL文件类型和 .DAE文件类型。
- 生成 .STL文件类型:
我们利用SolidWorks创建机器人三维模型之后,首先可以直接保存成STL文件类型。 Tips:SW中从装配体(或零件)保存到STL文件时可以先创建参考坐标系,然后另存为的时候,在选项中选择参考坐标系就可以在模型上自定义坐标系的位置。
- 生成 .DAE文件类型:
在上一步生成的STL的基础上,利用三维动画制作软件Blender生成 .DAE文件,很简单,只需要在“文件”下拉菜单中“导入”菜单经文件导入,然后用“导出”菜单选择导出成 .DAE格式的文件即可。
二、 模型描述文件的编写
本开源机器人建模文件集成在homerobot_description软件包(package)里面,可以在本篇文章开头给出的代码仓下载,该package的文件树结构如图1所示:
图1 homerobot_description包文件树
其中模型描述文件名称为:homerobot.xacro,这里截取几个比较重要的片段解释一下。 1. 开始的一些宏定义和声明就不做解释了,base_footprint相关定义如下:
<link name="base_footprint">
<visual>
<geometry>
<box size="0.001 0.001 0.001"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
</visual>
</link>
<joint name="base_footprint_joint" type="fixed">
<origin xyz="0 0 0.084" />
<parent link="base_footprint" />
<child link="base_link" />
</joint>
这个坐标系(base_footprint)不是必须的,而是习惯性的写法,它是人为定义出来的一个可以称作为“影子”的坐标系,它和base_link唯一的不同点就是Z坐标上的值不同。这里我们先绘制了一个非常小的正方体(geometry)作为连杆(link),然后规定了关节(joint)的属性,即base_link和base_footprint的连接关系。 2. 关于base_link的定义
<link name="base_link">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<mesh filename="package://homerobot_description/meshes/base_link.dae"/>
</geometry>
<material name="green" />
</visual>
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<mesh filename="package://homerobot_description/meshes/base_link.dae"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="5"/>
</link>
这里就涉及到引用.dae文件的语法了:
<mesh filename="package://homerobot_description/meshes/base_link.dae"/>
由于我们的三维网格文件base_link.dae提前就生成好了,所以这里直接引用就可以了,后面我们会通过可视化工具看到,这里link和joint的语法参考文章前面给出的详解文档,此外,这里有一个宏定义的引用语句:
<xacro:inertial_matrix mass="5"/>
这里引用开头定义的宏:转动惯量矩阵计算,然后将质量参数(mass=”5″)传入宏就指明了base_link的惯量矩阵。<collision>语句指出了base_link的碰撞检测范围,这里可以引用本体,也可以人为扩大一个范围。 3. 主动轮的定义
<joint name="L_Wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="L_Wheel_link"/>
<origin xyz="-0.075 0.1885 -0.034" rpy="1.5707963 0 0" />
<axis xyz="0 0 -1" />
<limit effort="100" velocity="100"/>
<!-- velocity: m/s for prismatic, rad/s for revolute -->
<!-- <dynamics damping="50" friction="1"/> -->
<dynamics damping="0.1" friction="0.5"/>
<!-- friction: N for prismatic joints, N.m for revolute joints -->
</joint>
<link name="L_Wheel_link">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<mesh filename="package://homerobot_description/meshes/L_wheel.dae"/>
</geometry>
<material name="Black" />
</visual>
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<mesh filename="package://homerobot_description/meshes/L_wheel.dae"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
这里有几个参数值得注意: <axis xyz=”0 0 -1″ /> 指定了转轴为Z轴; <limit effort=”100″ velocity=”100″/> 最大的驱动力矩和最大转速均设定为100,这里可以根据不同平台修改,其中,速度单位对于移动副来说是m/s,对于转动副来说是rad/s,这里joint的类型type是continuous,即连续转动,因此这里单位是后者。 4. Xacro文件的include用法 在Xacro文件中同样可以引用外部的一些设置文件,在这里有一句:
<xacro:include filename="$(find homerobot_description)/urdf/homerobot.gazebo" />
这里引用了homerobot_description包下面的homerobot.gazebo文件,这个文件是对机器人在gazebo仿真环境下的一些仿真参数设置,后面分一篇博文详细讲讲ROS系统与Gazebo仿真环境。
三、ROS系统和Rviz可视化工具
ROS系统非常好的集成了Rviz这一可视化调试工具,大大方便了机器人开发调试的工作(除了偶尔会crash,这个工具真的非常赞)。这里我们当然要用可视化工具看看上面编写完成的机器人模型描述文件,编写launch文件,名称为:description.launch,内容如下:
<launch>
<arg name="model" />
<!-- Parsing xacro and setting robot_description parameter -->
<param name="robot_description" textfile="$(find homerobot_description)/urdf/homerobot.xacro"/>
<!-- Setting gui parameter to true for display joint slider -->
<param name="use_gui" value="true"/>
<!-- Starting Joint state publisher node which will publish the joint values -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
<!-- Starting robot state publish which will publish tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>
<!-- Launch visualization in rviz -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find homerobot_description)/launch/urdf.rviz" required="true"/>
</launch>
关于如何理解launch文件,请参考官方文档(传送门)。如果一切正常的话就会看到下面的图示效果。 图2 机器人平台在Rviz中
四、ROS系统的tf tree(空间坐标变换树)
这里tf应该是transform的缩写,是指空间中两个三维坐标系的转换关系,这种转换关系一般可以分为:平移和旋转。表征这些转换关系的方法也有很多,比较常用的就是:
- 齐次转换矩阵
- 欧拉角(RPY)
- 四元数
其实他们这件是可以相互转化的。 前面有一篇博文:ROS系统MoveIt玩转双臂机器人系列(五)–浅议机器人运动学与D-H建模(传送门)中有简单介绍了空间坐标系的基础知识。 具体到ROS系统中,它提出了tf tree的概念,也就是在建模的时候你就已经指定了一个机器人一共有几个坐标系,各个坐标系之间的转换关系是如何的(上面xacro文件中的link和joint定义的时候就已经说明了各个零部件之间的位置关系和运动关系),如果有信息缺失则tf tree一定是有缺失的。ROS系统提供了tf查看工具,在命令行运行:
rosrun rqt_tf_tree rqt_tf_tree
就可以得到下图所示的效果,我们可以直观的看出各个link之间的转换关系。
图3 tf树截图
<– 本篇完 –>