给local map增加超声波传感器数据的各个步骤

本文介绍了如何在ROS的move_base框架下,为local costmap集成超声波传感器数据。首先定义urdf文件,接着读取传感器数据并发布到特定topic,然后在costmap_2d中增加一个layer监听该topic。详细步骤包括修改配置文件、设置layer参数,以及理解costmap数据处理和更新机制。通过这些操作,可以将超声波数据有效地整合到local costmap中。

1.首先要定义urdf。定义好要使用的sensor的角度,位置,和frame名字。

2.然后将sensor数据在kobuki底座中读取出来,发送到一个topic上。

3.costmap2d中增加一个layer监听上述topic.

一些修改配置文件的资料可见:

http://wiki.ros.org/navigation/Tutorials/RobotSetup



costmap背景介绍:

move_base package包含了planner,用于根据指定的目的地规划路径。他含有两个costmap,一个global的,一个local的。

planner_costmap_ros_ =new costmap_2d::Costmap2DROS("global_costmap", tf_);

controller_costmap_ros_= new costmap_2d::Costmap2DROS("local_costmap", tf_);

就超声波而言,只需要将数据发送到move_base的一localcostmap就可以了。

costmap2dros



如何给localcostmap增加一个layer:

雷达收到的数据,发送到/scan这个topic,该数据会被保存到layeredCostmaplayer里面,layerdCostmap里面有若干layer,每个layer是一个plugin.比如ObstacleLayer就是一个plugin.如果需创建一个新layer,需要修改配置文件/turtlebot_navigation/param/costmap_common_params.yaml,在其中定义一个layer.(注意所添加的layer的参数,中比如 min_obstacle_height:0.25代表了障碍物的最低高度,如果你的sensor的高度比这个还要低,那么这个sensor发出的数据没有办法保存到此layer里面。我当初就是给rplidar定义layer时,给rplidar定义的urdf文件中指定了rplidar的高度是0.15,rplidar这个雷达只水平探测,那么他他呢到的点的高度肯定也是0.15了,但是其layer定义所支持的障碍物最低高度0.25,导致我的雷达数据始终无法发送到costmap里面,结果就是我用rviz看图时,永远看不到localmap,并且rostopic监听costmap以及costmap_update得到的都是map数据为0.)要指定该layer监听的observationtopic, 以及topic的消息类型。还有resolution,地图尺寸(voxel),还有障碍物的最大,最小高度等等。注意zresolutionzvoxel,需要确保z轴坐标/zrelution得到的数值小于zvoxel,否者该坐标被认为不再地图内部。zvoxel可以看作是地图z轴所能容纳的格子数目。







以还需要修改/turtlebot_navigation/param/local_costmap_params.yaml以指定新增的layer的名字和类型。



costmap地图数据是如何合成的,以及如何发送给rviz的:

costmap2dros建立一个线程Costmap2DROS::mapUpdateLoop,该线程不断循环获取当前的robot位置,并通知给layercostmap,并调用每个pluginlayerupdateBounds获取他们的bounds,以此bound作为localmap的大小,并取出每个plugin的数据(updateCosts),将多个layer数据合并或者覆盖在一起得到一个最终的map数据具体策略取决于上面建立layer时的一个flag:combination_method,这个最终的costmap就是layeredcostmap里的costmap,是一个char数组。costmap2dros会用一个costmap2dpublisher将此数据发送出去,发送给topic:/move_base/local_costmap/costmap, 以及topic:/move_base/local_costmap/costmap_update, 前者是整个map,后者是局部update.当只有打开了rviz时,才会发送这个数据到此topic上。否则如果没有人监听,就不会发送。

我们可以用rostopicinfo以及rostopicecho来查看该topic的发送,使用者,以及数据更新。



Costmap2dros是一个wrapper, 他包含了layeredcostmap,movebase使用。

costmap2dros建立的线程的调用栈:

Costmap2DROS::reconfigureCB()创建一thread:

map_update_thread_ = newboost::thread(boost::bind(&Costmap2DROS::mapUpdateLoop,this, map_update_frequency));

->void Costmap2DROS::mapUpdateLoop(doublefrequency) //thread loop 函数

->void Costmap2DROS::updateMap()

->void LayeredCostmap::updateMap

->voidVoxelLayer::updateBounds

->getMarkingObservations

-> getObservations

获取observation中的地图数据,并找到每个点的位置,并将数据更新到地图中:

costmap_[index] = LETHAL_OBSTACLE;//这里的costmap_是一个数组,是costmap2d构造函数中调用initmaps创建的。

ObstacleLayer 继承自CostmapLayer继承自costmap2d.

至此,callback将数据更新到layercostmap_缓冲中。




在ROS系统中实现自主导航避障和自主巡航功能,主要依赖于ROS提供的强大工具链和功能包集,尤其是`ros-navigation`这一核心导航功能包集。以下为具体方法和关键步骤: ### 1. 使用 `ros-navigation` 实现自主导航与避障 `ros-navigation` 是 ROS 中用于实现机器人自主导航的核心工具集,它提供了路径规划、定位、地图构建以及避障等功能[^1]。该功能包支持多种传感器输入(如激光雷达、深度相机等),并基于这些传感器数据构建代价地图(costmap),从而识别障碍物并进行动态避障。 关键模块包括: - **AMCL(自适应蒙特卡洛定位)**:用于实现机器人在已知地图中的精确定位。 - **move_base**:负责全局路径规划(使用A*或Dijkstra算法)和局部避障路径规划(如动态窗口法 DWA 或 Trajectory Rollout)。 - **costmap_2d**:构建二维代价地图,将传感器信息转化为可用于导航的障碍物表示。 - **map_server**:加载和发布静态地图。 通过配置参数文件(如`costmap_common_params.yaml`、`local_costmap_params.yaml`、`global_costmap_params.yaml`)可以定义传感器来源、障碍物检测范围、膨胀半径等参数。 ```yaml # 示例 costmap_common_params.yaml 片段 obstacle_range: 2.5 raytrace_range: 3.0 footprint: [[0.3, 0.3], [0.3, -0.3], [-0.3, -0.3], [-0.3, 0.3]] inflation_radius: 0.55 ``` ### 2. 避障算法实现方式 在ROS中,避障可以通过两种方式实现: - **基于代价地图的避障**:利用`costmap_2d`生成的障碍物地图,由`move_base`调用局部规划器(如DWA Planner)实时调整机器人的运动轨迹以避开障碍物[^5]。 - **自定义避障算法**:用户也可以根据传感器数据(如激光雷达超声波传感器)编写自定义避障逻辑。例如,通过订阅 `/scan` 消息,分析前方障碍物距离,并通过控制 `/cmd_vel` 发布速度指令实现紧急制动或转向避让[^2]。 ### 3. 实现自主巡航功能 自主巡航是指机器人按照预设路径或区域自动移动,无需人工干预。其实现主要包括以下几个方面: - **路径规划与跟踪**:使用`move_base`结合目标点列表实现路径点导航(Waypoint Navigation)。可编写脚本依次发送多个目标点,使机器人沿预定路线巡航。 - **地图构建与更新**:若环境未知,可通过SLAM(如`gmapping`、`cartographer`)实时构建地图,并在后续巡航中使用更新的地图进行定位与导航。 - **远程监控与任务调度**:结合ROS的远程通信机制(如ROS Bridge)与上位机平台(如Web界面或QGC软件),实现对机器人的远程任务下发与状态监控[^4]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值