前期基本按着ROS wiki 和《ROS by example vol1 indigo 》走了一遍,但是感觉对ROS还是似懂非懂的,有好多问题仍然不明白。一直在想ROS到底是怎样用在机器人上的。所以干脆从3D建模、传感器信息采集到SLAM、路径规划等把机器人的整个导航过程捋一遍。
本节主要实现移动机器人的3D建模,激光和相机的信息采集以及在gazebo仿真环境中简单地移动机器人。
机器人3D模型在ROS中通过URDF文件实现,标准化机器人描述格式(URDF)是一种描述机器人以及其部分结构、关节、自由度等的XML文件。xacro文件是一种更好的机器人建模方法,可以帮助我们压缩URDF的文件大小,并且增加文件的可读性和可维护性,并且允许复用模型。具体的关于URDF文件和xacro文件的介绍可参考《ROS by example vol2 indigo》 第四章和《Learning ROS for Robotics Programming II》第七章。我在仿真的过程中构建了一个小车模型,模型中包括机器人本体、摄像头和激光雷达。然后用gazebo搭建了一个简单的机器人工作环境。
机器人的模型文件如下:
myrobot.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"
xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
name="robot">
<xacro:property name="length_wheel" value="0.05" />
<xacro:property name="radius_wheel" value="0.05" />
<xacro:property name="camera_link" value="0.05" />
<xacro:macro name="default_inertial" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0"
iyy="1.0" iyz="0.0"
izz="1.0" />
</inertial>
</xacro:macro>
<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>
<xacro:default_inertial mass="0.0001"/>
</link>
<xacro:include filename="$(find nav_sim)/urdf/robot.gazebo" />
<gazebo reference="base_footprint">
<material>Gazebo/Green</material>
<turnGravityOff>false</turnGravityOff>
</gazebo>
<joint name="base_footprint_joint" type="fixed">
<origin xyz="0 0 0" />
<parent link="base_footprint" />
<child link="base_link" />
</joint>
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>
<origin rpy="0 0 1.54" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.2 .3 0.1"/>
</geometry>
</collision>
<xacro:default_inertial mass="10"/>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
</geometry>
<!-- <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/> -->
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="${length_wheel}" radius="${radius_wheel}"/>
</geometry>
</collision>
<xacro:default_inertial mass="1"/>
</link>
<link name="wheel_2">
<visual>
<geometry>