基于ROS的机器人建图与导航仿真全过程

来源丨古月居

点击进入—>3D视觉工坊学习交流群

引言

之前一直想写一篇关于ROS机器人建图与导航仿真全过程的教程,终于有时间来做这个事啦,本人也拿过吉林省高校机器人大赛—ROS竞速组的冠军,第十六届全国智能车比赛—讯飞餐厅组线上赛二等奖,我想这个教程对接下来的一些参赛者多多少少也会有一些贡献。

当然我觉得你已经会ROS的一些基本操作了,本文章只是简单扼要的介绍这个过程,其中细节部分难免可能不会太详细还请见谅,当人后续也会有更多这方面的文章,也会传授一些ROS机器人建图与导航方面的经验,当然我也在学习的过程,难免一些不足之处,话不多说啦,让我先把这个全过程的思维导图放在下面。

a21e1e877661c68c1629b3db58dbd05c.png

文章所用的代码已经开源:https://gitee.com/xiaolong_ROS/Map_construction-Navigation_simulation.git

一、环境

1.机器人建模

我个人习惯把机器人本体放在单独的一个package下,让我们先看看里面的所有东西。

478abe00649c96254c85a7ffb981e0d4.png

可以看到这个机器人的URDF模型还有它所拥有的传感器,相机、惯性测量单元、激光雷达。


我们对URDF文件进行检查,check_urdf命令会解析URDF文件,并且显示解析过程中发现的错误,如果一切正常,就会显示如下信息:

b5122297dc9fb80db48e19dbd5ad727e.png

当然我们也可以在rviz中查看这个模型:

88b513f0131859c30db696034aa2a58d.png

也可以看看机器人的TF关系:

76404b96c1f55922a4cf2cbade858037.png

2.运动控制器配置

接下来我们主要在gazebo环境下操作,我们再创建一个单独的package,同样我们先看看完整的内容:

f45495eed9667419a8d464f691897790.png

我们在config下可以看到一个racecar_control.yaml文件:

racecar:


  left_rear_wheel_velocity_controller:
    type: effort_controllers/JointVelocityController
    joint: left_rear_axle
    pid: {p: 1000.0, i: 0.00, d: 0.0}




  right_rear_wheel_velocity_controller:
    type: effort_controllers/JointVelocityController
    joint: right_rear_axle 
    pid: {p: 1000.0, i: 0.00, d: 0.0}




  left_front_wheel_velocity_controller:
    type: effort_controllers/JointVelocityController
    joint: left_front_axle
    pid: {p: 1000.0, i: 0.00, d: 0.0}




  right_front_wheel_velocity_controller:
    type: effort_controllers/JointVelocityController
    joint: right_front_axle
    pid: {p: 1000.0, i: 0.00, d: 0.0}
    
  left_steering_hinge_position_controller:
    type: effort_controllers/JointPositionController
    joint: left_steering_joint
    pid: {p: 10000.0, i: 0.1, d: 500.0}
  
  right_steering_hinge_position_controller:
    type: effort_controllers/JointPositionController
    joint: right_steering_joint
    pid: {p: 10000.0, i: 0.1, d: 500.0}




  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50

这个文件便定义了机器人所有的运动控制器以及参数,我们通过launch文件添加以下内容便可以加载这些控制器:

00b7470ba23cf4760cc80052169b6bc3.png

3.world创建

world的创建方法有很多了,你可以自己画一个世界,也可以导入,这里可以给大家安利另外一个仿真神器:Webots,你会发现不一样的东西。

给大家看看比赛的官方赛道吧,使用gazebo racecar_runway_original.world 打开:

35753a63aae4de7fd6cfd5fd311fe8b7.png

4.launch文件启动并测试

我们先通过roslaunch racecar_gazebo racecar.launch 来打开小车所在的仿真环境:

258771e68506d7433d31cab8765308af.png

我们可以看到racecar_gazebo/scripts下有一个XL_keyboard_remote.py的,我们可以通过rosrun racecar_gazebo XL_keyboard_remote.py运行它,然后我们的机器人就可以前后左右移动并且转向啦(注意运行之后弹出来的窗口需要鼠标点击一下再控制机器人)。

2b43d005355753df3b38c66a8494e774.png

二、建图

建图的话我们以Gmapping算法功能包为例子进行地图构建,当然可以用其它的算法,比如:hector,cartographer等。

1.参数配置

首先我们创建一个gmapping.launch,这个主要是负责配置参数的:

<launch>
    <arg name="scan_topic" default="scan" />


    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
        <param name="odom_frame" value="odom"/>
        <param name="map_update_interval" value="5.0"/>
        <!-- Set maxUrange < actual maximum range of the Laser -->
        <param name="maxRange" value="5.0"/>
        <param name="maxUrange" value="4.5"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <param name="lstep" value="0.05"/>
        <param name="astep" value="0.05"/>
        <param name="iterations" value="5"/>
        <param name="lsigma" value="0.075"/>
        <param name="ogain" value="3.0"/>
        <param name="lskip" value="0"/>
        <param name="srr" value="0.01"/>
        <param name="srt" value="0.02"/>
        <param name="str" value="0.01"/>
        <param name="stt" value="0.02"/>
        <param name="linearUpdate" value="0.5"/>
        <param name="angularUpdate" value="0.436"/>
        <param name="temporalUpdate" value="-1.0"/>
        <param name="resampleThreshold" value="0.5"/>
        <param name="particles" value="80"/>
        <param name="xmin" value="-1.0"/>
        <param name="ymin" value="-1.0"/>
        <param name="xmax" value="1.0"/>
        <param name="ymax" value="1.0"/>
        <param name="delta" value="0.05"/>
        <param name="llsamplerange" value="0.01"/>
        <param name="llsamplestep" value="0.01"/>
        <param name="lasamplerange" value="0.005"/>
        <param name="lasamplestep" value="0.005"/>
        <remap from="scan" to="$(arg scan_topic)"/>
    </node>
</launch>

然后我们需要创建一个gmapping_demo.launch用来打开gazebo,rviz等并建图:

<launch>


    <include file="$(find racecar_gazebo)/launch/gmapping.launch"/>


    <include file="$(find racecar_gazebo)/launch/racecar.launch"/>
  
    <!-- keyboard_remote node -->
    <node name="XL_keyboard_remote" pkg="racecar_gazebo" type="XL_keyboard_remote.py" output="screen">
    </node>


    <!-- 启动rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find racecar_gazebo)/rviz/gmapping.rviz"/>


</launch>

代码第一块就是建图参数的配置,第二块就是打开之前的gazebo环境等,第三块是打开键盘控制,第四块是打开一个已经配置好的rviz(配置的方法很简单的,就是添加一些东西)。

2.launch文件启动并建图

之所以创建一个gmapping_demo.launch是想直接启动一个launch就可以开始建图,我们直接在终端输入roslaunch racecar_gazebo racecar.launch就可以开始建图啦:

6202067e70c34dae4755d5c1ac80676b.png

建图过程需要有耐心,最好速度不要太快,当然不同的算法适应性也不太一样,我们可以看看建图效果还是可以的:

0736ae340cf1d2132f1e951b4bd9f46d.png

 最后建成的地图我们需要及时保存。保存的地图一共有两个文件,map.pgm和map.yaml。

让我们看一下建好的地图效果还是蛮不错的:

94cb86268b80eb91f06fe6eefd7d6fcb.png

三、导航

我们先来看一下导航的launch启动文件,第4行就是启动之前的launch文件;第6~8行是加载配置好的rviz;第10行是加载地图;注意第13行,我们加载了一个amcl.xml文件,这个是我们配置的定位方法参数。

自主定位即机器人在任意状态下都可以推算出自己在地图中所处的位置,ROS为开发者提供了一种自适应(或kld采样)的蒙特卡罗定位方法(amcl),这是一种概率统计方法,针对已有地图使用粒子滤波器跟踪一个机器人的姿态;第16~32行是导航需要的配置文件;第34行是一个导航脚本(自定义的一个ROS节点),初学者可以不用深究其内容。

804bfbd8352189b34a067073dba9fc3b.png

1.代价地图的配置

导航功能包使用两种代价地图存储周围环境中的障碍信息:一种用于全局路径规划(global_costmap),一种用于本地路径规划和实时避障(local_costmap)。

两种代价地图需要使用一些共用的或独立的配置文件:通用配置文件、全局规划配置文件和本地规划配置文件。config/navigation下这三个文件分别与之对应。

20f8facd9936e135ddb1a380a4552a73.png

代价地图用来存储周围环境的障碍信息,其中需要声明地图关注的机器人传感器消息,以便于地图信息的更新。

针对两种代价地图通用的配置选项,创建名为costmap_common_params.yaml的配置文件。全局规划配置文件用于存储配置全局代价地图的参数,命名为global_costmap_params.yaml,本地规划配置文件用来存储本地代价地图的配置参数,命名为local_costmap_params.yaml。

2.本地规划器的配置

比赛一般都需要实时避障的,我们导航所用的地图都是加上锥桶的,当然我们在建图的时候是不允许扫描锥桶的信息的,所以我们需要配置本地规划器,我们通过gazebo racecar_runway.world 打开环境如下:

e197b0ec48854b3b4690d818490d58d2.png

常用的本地规划算法有TEB算法和DWA算法,这篇教程主要用的TEB算法,本地规划器当然也是用的TEB算法的参数,具体可以查看最后一个配置文件teb_local_planner_params.yaml。

3.launch文件启动并导航

我们通过roslaunch racecar_gazebo racecar_navigation.launch来开始导航前所有准备工作:

290f463a0c78cb88f494fba569ff68bd.png

 通过rviz上2D Nav Goal来给机器人发布导航终点信息,可以看出机器人已经开始实时扫描信息并规划路径向着终点出发啦:

6e40513aae3d7d0825f62ac8de77e95d.png

我们可以通过rosrun rqt_tf_tree rqt_tf_tree来查看导航过程中的TF树:

3e2b8940f6c5b0a728de0474899a6b67.png

 也可以通过rosrun rqt_graph rqt_graph来查看导航过程中的各节点:

f3211024c92374c80ab740cf9f9cd3f2.png

本文仅做学术分享,如有侵权,请联系删文。

点击进入—>3D视觉工坊学习交流群

干货下载与学习

后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

后台回复:3D视觉课程,即可学习3D视觉领域精品课程

3D视觉工坊精品课程官网:3dcver.com

1.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
2.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
3.国内首个面向工业级实战的点云处理课程
4.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
5.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
6.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
7.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

8.从零搭建一套结构光3D重建系统[理论+源码+实践]

9.单目深度估计方法:算法梳理与代码实现

10.自动驾驶中的深度学习模型部署实战

11.相机模型与标定(单目+双目+鱼眼)

12.重磅!四旋翼飞行器:算法与实战

13.ROS2从入门到精通:理论与实战

14.国内首个3D缺陷检测教程:理论、源码与实战

15.基于Open3D的点云处理入门与实战教程

16.透彻理解视觉ORB-SLAM3:理论基础+代码解析+算法改进

17.机械臂抓取从入门到实战

重磅!粉丝学习交流群已成立

交流群主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、ORB-SLAM系列源码交流、深度估计、TOF、求职交流等方向。

扫描以下二维码,添加小助理微信(dddvisiona),一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

60ba00268d6db2025432682a7b301192.jpeg

▲长按加微信群或投稿,微信号:dddvisiona

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看,3天内无条件退款

bf4a48c5dfd7ed0d37139814904134f7.jpeg

高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

  • 8
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值