首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于ROS的机器人建图与导航仿真全过程

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

原创
作者头像
一点人工一点智能
发布于 2023-03-02 07:30:53
发布于 2023-03-02 07:30:53
1.7K05
代码可运行
举报
运行总次数:5
代码可运行

作者:☆下山☆@CSDN

原文:https://blog.csdn.net/qq_45152498/article/details/124296963

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

01  引言

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

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

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

02  环境

2.1 机器人建模

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

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

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

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

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

2.2 运动控制器配置

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

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

代码语言:python
代码运行次数:3
运行
AI代码解释
复制
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文件添加以下内容便可以加载这些控制器:

2.3 world创建

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

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

2.4 launch文件启动并测试

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

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

03  建图

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

3.1 参数配置

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

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
<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等并建图:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
<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(配置的方法很简单的,就是添加一些东西)。

3.2 launch文件启动并建图

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

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

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

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

04  导航

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

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

4.1 代价地图的配置

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

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

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

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

4.2 本地规划器的配置

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

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

4.3 launch文件启动并导航

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

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

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

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

1. 书籍推荐-《机器人编程:使用树莓派3和Python构建和控制自主机器人》

2. 书籍推荐-《机器人感知与认知中的深度学习》

3. 从ChatGPT思考自动驾驶将如何前行

4. 一文带你了解机器人是如何通过视觉实现目标跟踪的!

5. 激光雷达中是如何做到和GPS时间同步的?

6. BEV感知中的视觉-毫米波雷达融合综述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用controller控制实际机器人
  本系列博文的第一篇,我们完成了双臂机器人 Rob 的建模工作;第二篇博文则详细介绍 MoveIt 模块的配置工具 Setup Assistant Tool 的使用,并配置了一个简单的使用环境。具体在程序结构上如图1所示,我们已经完成了两处红色椭圆圈出的部分,即完成了ROS Param Server (建模)的工作,同时利用系统工具配置了move_group节点。
芯动大师
2025/08/05
880
利用controller控制实际机器人
机器人工程毕业设计☞开源学习(扫地)
zhangrelay / turtlebot3_cleaner · GitCode
zhangrelay
2022/05/01
4830
机器人工程毕业设计☞开源学习(扫地)
ROS专题----机器人模型urdf简明笔记
版权声明:本文为zhangrelay原创文章,有错请轻拍,转载请注明,谢谢... https://blog.csdn.net/ZhangRelay/article/details/60959642
zhangrelay
2019/01/23
2.1K0
ROS2机器人实验报告提示05➡寻路⬅Nav2
对比ros2 launch nav2_bringup tb3_simulation_launch.py和ros2 launch sam_bot_description display.launch.py。
zhangrelay
2021/12/02
8500
ROS2机器人实验报告提示05➡寻路⬅Nav2
一篇文章读懂myAGV如何建图导航
myAGV 大象首款移动机器人,采用竞赛级麦克纳姆轮,全包裹金属车架;ROS开发平台内置两种slam算法,满足建图、导航方向的学习;提供丰富的扩展接口,可搭载my系列机械臂,实现移动抓取,完成更多应用。
大象机器人
2022/09/23
7330
ROS机器人URDF建模
所有内容均在ROS1 indigo,kinetic,melodic,noetic以及ROS2 dashing,foxy等测试通过。
zhangrelay
2020/09/16
2.1K0
ROS机器人URDF建模
ROS2机器人实验报告提示04➡开山⬅Nav2
如果不熟悉,请看直播回放,并且依据回放中的方法进行练习,注意直播时ROS2版本为foxy,镜像中是 galactic。
zhangrelay
2021/12/02
3690
ROS2机器人实验报告提示04➡开山⬅Nav2
计算机操作系统(OS)安装机器人操作系统(ROS)实现物联网功能
博客中大量介绍了将Ubuntu等Linux系统借助机器人操作系统ROS实现机器人控制设计开发和物联网功能案例,并可基于OpenAI等实现人工智能相关训练。
zhangrelay
2021/03/03
2.2K0
深度相机+激光雷达实现SLAM建图与导航
随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用3D相机进行物体识别,行为识别,场景建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D)想比较,又有哪些差别?深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。
一点人工一点智能
2023/03/05
4.6K0
深度相机+激光雷达实现SLAM建图与导航
ROS联合webots实战案例(五)导航功能包入门2
在前面几章中分别介绍了在webots中如何创建自己的机器人、添加传感器以及使用手柄或键盘驱动它在仿真环境中移动。在本章中,你会学习到ROS系统最强大的特性之一,它能够让你的机器人自主导航和运动。
锡城筱凯
2021/02/07
1.7K0
ROS联合webots实战案例(五)导航功能包入门2
ROS机器人虚拟仿真挑战赛本地电脑环境配置记录
上述过程是一个详细的步骤列表,用于在ROS Noetic环境中设置并运行Tianbot的Tianracer项目。这个过程涉及多个方面,包括更新软件包、安装ROS包、克隆源代码、构建工作空间、配置环境以及启动仿真。以下是对整个过程的详细总结:
zhangrelay
2024/05/25
3780
ROS机器人虚拟仿真挑战赛本地电脑环境配置记录
TIAGo ROS模拟教程2 - 自主机器人导航
TIAGo ROS Simulation Tutorial 2 – Autonomous robot navigation
zhangrelay
2022/04/28
7570
TIAGo ROS模拟教程2 - 自主机器人导航
机器人导航仿真
           全局地图的实现,通常使用slam建图也称为(CML)的方式,即即时定位和地图构建、并发建图和定位。具体的slam建图的方法gmapping、hector_slam、cartographer、rgbdslam、ORB_SLAM ....。并且slam建图必须还要依靠自身的激光雷达或者摄像头。当然建好的地图保存需要使用到map_server这个包。
用户10271432
2024/09/12
1140
ROS机器人程序设计(原书第2版)补充资料 (叁) 第三章 可视化和调试工具
书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用。
zhangrelay
2019/01/23
7370
ROS机器人TF基础(坐标相关概念和实践)
机器人建模和控制必须掌握坐标系和坐标变换等基础知识。机器人在空间中运动主要有两种形式:
zhangrelay
2020/09/06
1.6K0
ROS深入探索(六)——使用smartcar进行仿真
之前我们使用的都是urdf文件格式的模型,在很多情况下,ROS对urdf文件的支持并不是很好,使用宏定义的.xacro文件兼容性更好,扩展性也更好。所以我们把之前的urdf文件重新整理编写成.xacro文件。
CreateAMind
2018/07/24
6660
ROS深入探索(六)——使用smartcar进行仿真
差速轮式机器人仿真升级:Gazebo与Rviz集成及传感器仿真详解
本篇文章我们介绍的内容是差速轮式机器人进行升级 ,我们添加相关的物理属性,使用gazebo+rviz进行仿真。 通过编写机器人控制的程序,遥控机器人在gazeob仿真环境中移动,并通过rviz实时察看 camera,kinect和lidar三种传感器的仿真效果。
芯动大师
2025/05/15
2530
差速轮式机器人仿真升级:Gazebo与Rviz集成及传感器仿真详解
【2022】Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真【智能车】
【2022】Ubuntu18.04安装Gazebo9并与ROS连接(包括各种报错及解决方案)_QomolangmaH的博客-CSDN博客
Qomolangma
2024/07/30
5030
【2022】Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真【智能车】
ROS机械臂篇
从https://github.com/danfis/libccd下载源码,解压缩后进入主文件夹下的src,编译
算法之名
2023/10/16
1.4K0
ROS机械臂篇
ROS1云课→30导航仿真演示
/opt/ros/kinetic/share/turtlebot_stdr/maps
zhangrelay
2022/10/04
1.2K0
ROS1云课→30导航仿真演示
相关推荐
利用controller控制实际机器人
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档