百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

技术分享 | 为什么学习rrt_exploration实现自主建图容易掉坑?

toyiye 2024-07-15 01:36 16 浏览 0 评论

在无人车领域当中,SLAM和导航两个部分一直是研究人员关注的重点,无人车作为移动机器人,这两个功能也十分重要,无人车到一个未知的环境中,人为控制无人车进行建图,建立好地图后,再使用导航,这是目前在无人车应用场景中十分常见的场景,但在实际应用过程中,还是存在局限性,很多应用场景下需要无人车在未知环境下自主地探索建图,而不是人为控制的情况下建图,自主探索也就由此而生。

rrt_exploration是基于RRT路径规划算法实现的搜索算法。之所以使用RRT算法是因为RRT对于未知区域有着强烈的倾向,在RRT exploration中,RRT主要用于生成边界点,这样对于探索边界点是很有好处的。所谓的边界点就是已经探索过的和未知的区域的交界点。

在ros当中使用rrt_exploration来实现自主建图,官方文档

(http://wiki.ros.org/rrt_exploration)说得比较清楚,这里简单地讲解一下流程,主要是针对一些容易掉进坑的地方说明一下,给大家排排雷。

一.下载rrt_exploration功能包

1.打开终端

2.进入你的工作空间/src文件下

cd catkin_ws/src

#将命令中的catkin_ws更换为你个人的工作空间名

3.下载rrt_exploration功能包

git clone

https://github.com/hasauino/rrt_exploration.git

二.下载相关依赖包(ros版本为kinetic)

OpenCV(cv2)

sudo apt-get install python-opencv

Numpy

sudo apt-get install python-numpy

Sklearn

sudo apt-get install python-scikits-learn

gmapping

sudo apt-get install ros-kinetic-gmapping

navigation

sudo apt-get install ros-kinetic-navigation

三.编译工作空间

1.进入你的工作空间

cd catkin_ws #将命令中的catkin_ws更换为你个人的工作空间名

2.编译

catkin_make

到这一个步骤,如果没有错误,那么rrt_exploration功能包的下载安装已经全部完成,接下来就到了使用阶段,在此,我推荐创建一个launch文件来达到使用自主探索建图功能的目的。我把自主探索建图功能分为两个模块,一个是自主探索功能,一个是建图功能,自主探索功能需要rrt_exploration和move_base,建图这里就采用gmapping。因此你的launch文件内需要包含3个内容:

① rrt_exploration

② move_base

③ gmapping

四.创建自主建图launch文件

1.随意在一个功能包内创建launch文件夹,并在launch文件夹中建立一个rrt_slam.launch文件

文件内容如下:

<include file="$(find rrt_exploration)/launch/simple.launch"/>

<include file="$(find tiprobot_slam)/launch/tiprobot_gmapping.launch"/>



<node pkg="rviz" type="rviz" name="rviz" required="true" args="-d $(find tiprobot_slam)/rviz/tiprobot_explore.rviz"/>



<node pkg="move_base" type="move_base" respawn="false" name="move_base_node" output="screen">

  <param name="footprint_padding" value="0.01" />

  <param name="controller_frequency" value="5.0" />

  <param name="controller_patience" value="3.0" />

  <param name="oscillation_timeout" value="30.0" />

  <param name="oscillation_distance" value="0.5" />

  <param name="planner_patience" value="1" />

  <param name="controller_patience" value="1" />

  <param name="recovery_behavior_enabled" value="false" />

  <rosparam file="$(find tiprobot_slam)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />

  <rosparam file="$(find tiprobot_slam)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />

  <rosparam file="$(find tiprobot_slam)/config/local_costmap_params.yaml" command="load" />

  <rosparam file="$(find tiprobot_slam)/config/global_costmap_params.yaml" command="load" />

  <rosparam file="$(find tiprobot_slam)/config/base_local_planner_params.yaml" command="load" />

  <param name="global_costmap/global_frame" value="/map"/>

  <param name="global_costmap/robot_base_frame" value="/base_link"/>

  <param name="global_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="global_costmap/laser_scan_sensor/topic" value="/scan"/>    

  <param name="local_costmap/global_frame" value="/map"/>

  <param name="local_costmap/robot_base_frame" value="/base_link"/>

  <param name="local_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="local_costmap/laser_scan_sensor/topic" value="/scan"/>

  <param name="local_costmap/obstacle_layer/laser_scan_sensor/topic" value="/scan"/>

  <remap from="cmd_vel" to="cmd_vel"/>

</node>

2.文件内容讲解

rrt_exploration

直接使用include包含就行,simple.launch是单机器人使用rrt_exploration的launch文件。

gmapping

也是直接使用include包含就行,gmapping的配置各种参考文档都很多,这里不过多讲解。

move_base

这部分要重点讲解一下,虽然rrt_exploration为单机器人创建了simple.launch文件,但大部分人使用依然会出现问题。原因这里就直接说明了。

大部分使用出现问题都在于这一句,注意到

name="move_base_node"这一段,这就是问题根源,

rrt_exploration作者是根据这一个命名来写代码的,但大部分ros使用者都是使用move_base这个命名,而作者的源代码采用的是move_base_node,而且没有在launch文件中给出接口来更改move_base的命名,因此大部分人在使用rrt_exploration的时候会发现move_base无法和rrt_exploraiton连接,导致自主探索功能失败,有两种解决办法:

①在launch文件中将move_base节点命名为move_base_node,这是最简单快捷的方法,也是推荐的方法。

②在源代码中修改move_base_node名,这个不推荐,因为需要修改的的地方很多,效率不高,还容易出错。

move_base配置部分:

  <param name="controller_frequency" value="5.0" />

  <param name="controller_patience" value="3.0" />

  <param name="oscillation_timeout" value="30.0" />

  <param name="oscillation_distance" value="0.5" />

  <param name="planner_patience" value="1" />

  <param name="controller_patience" value="1" />

  <param name="recovery_behavior_enabled" value="false" />

        这一段是作者配置的参数,应该是作者根据算法作出的调试,建议大家就使用作者默认的这一套参数。

        <param name="global_costmap/global_frame" value="/map"/>

  <param name="global_costmap/robot_base_frame" value="/base_link"/>

  <param name="global_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="global_costmap/laser_scan_sensor/topic" value="/scan"/>    

  <param name="local_costmap/global_frame" value="/map"/>

  <param name="local_costmap/robot_base_frame" value="/base_link"/>

  <param name="local_costmap/laser_scan_sensor/sensor_frame" value="/base_scan"/>

  <param name="local_costmap/laser_scan_sensor/topic" value="/scan"/>

        这一段是全局代价地图和本地代价地图的设置

全局代价地图和本地代价地图的参数类似

它们前四个参数分别代表

全局坐标名:在作者的设置中全局代价地图采用的是map,本地代价地图采用的是odom,我测试之后感觉本地代价地图改为map效果要好一些,所以我这里采用的是map。

机器人基坐标:这个基本上大家都类似,一般都是base_link或者base_footprint。

传感器坐标名:这个可能会有些区别,可以使用rosrun rqt_tf_tree rqt_tf_tree命令来查看激光的tf名,根据自己机器人的命名情况来修改。

传感器数据话题名:这个大部分应该都是scan,也是根据自己机器人的命名情况来修改。

五.使用基于rrt_exploration的自主探索功能

这里简单地给大家展示一下,跑一跑流程。我这里采用的是turtlebot3的仿真来测试一下。

1.启动turtlebot3仿真

roslaunch turtlebot3_gazebo turtlebot3_stage_4.launch

roslaunch turtlebot3_bringup turtlebot3_remote.launch

2.启动rrt_slam.launch

roslaunch rrt_exploration rrt_slam.launch

我这里是把这个launch文件放在rrt_exploration功能包里面的,根据个人情况调整命令即可。

通过rviz中的Publish Point设置四个点(推荐为一个矩形区域的四个顶点)为探索的范围,第五个点设置在机器人附近。

效果展示:

自主探索建图的效果还是不错的。

  • End -

技术发展的日新月异,阿木实验室将紧跟技术的脚步,不断把机器人行业最新的技术和硬件推荐给大家。看到经过我们培训的学员在技术上突飞猛进,是我们培训最大的价值。如果你在机器人行业,就请关注我们的公众号,我们将持续发布机器人行业最有价值的信息和技术。

本文由博客一文多发平台 OpenWrite 发布!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码