使用move_base实现双激光差动式移动机器人导航仿真
一、引言
本文主要对move_base做个基本介绍,并基于《ROS机器人高效编程》一书的代码实现仿真。本篇为自我学习记录的笔记,内容相当简单,没有深入讨论的算法实现原理。
二、加载机器人模型
之间看过易科实验室翻译的《ROS机器人高效编程》,直接在里面的例子上进行测试仿真,但实践过程中也发现不少问题。吐槽一下,很多英翻中的教材存在许多问题,表达理解及其费劲,但同时也表示理解,挑战难度确实很大。回归主题。
首先,加载机器人模型,使得机器人可以在gazebo和rviz中显示。因为要用到两个激光,所以要将机器人模型做一个更改,在.xacro描述文件中增加新的关节,并更改坐标变换。
<joint name="hokuyo_joint_2" type="fixed">
<axis xyz="0 1 0" />
<origin xyz="-0.125 -0.05 0.125" rpy="0 0 3.92699"/>
<parent link="base_link"/>
<child link="hokuyo_link_2"/>
</joint>
<!-- Hokuyo Laser -->
<link name="hokuyo_link_2">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://robot1_description/meshes/hokuyo.dae"/>
</geometry>
</visual>
<inertial>
<mass value="1e-5" />
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
</inertial>
</link>
增加轮子驱动插件,使得机器人接收到速度命令可以运动起来。
<gazebo>
<plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
<updateRate>100.0</updateRate>
<robotNamespace>/</robotNamespace>
<leftFrontJoint>base_to_wheel1</leftFrontJoint>
<rightFrontJoint>base_to_wheel3</rightFrontJoint>
<leftRearJoint>base_to_wheel2</leftRearJoint>
<rightRearJoint>base_to_wheel4</rightRearJoint>
<wheelSeparation>4</wheelSeparation>
<wheelDiameter>0.1</wheelDiameter>
<torque>1</torque>
<!--订阅的速度命令,twist型的-->
<topicName>cmd_vel</topicName>
<!--发布的里程信息话题,move_base会订阅-->
<odometryTopic>odom</odometryTopic>
<odometryFrame>odom</odometryFrame>
<robotBaseFrame>base_footprint</robotBaseFrame>
<broadcastTF>1</broadcastTF>
</plugin>
</gazebo>
为方便启动,写出launch文件。
<?xml version="1.0"?>
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="true"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="false"/>
<arg name="headless" default=