ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法

这篇具有很好参考价值的文章主要介绍了ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设备

杉川-3a激光雷达

win10笔记本电脑

ubuntu18.04

ros-melodic

问题

ros机器人在move_base下导航,有静态图层与动态图层,静态图层显示之前已经建立好的地图,而动态层显示现在激光雷达实时扫描到的障碍物。

假设机器人雷达最大范围为8m,在某一时刻,以机器人为原点,在机器人前方5m有一障碍物,在障碍物后方,距离机器人10m远有一堵墙。

在导航中机器人可以识别并标记5m处的障碍物,并在动态层显示障碍物,此时将障碍物平行移动至距离机器人5m处的另一个位置。发现原来位置的动态层处的障碍物位置信息并没有被更新,此时出现了两个障碍物标记,实际只有一个障碍物,但却出现了两个标记。

如果此时人从机器人5m处经过,会留下一排标记且无法更新

原因

move_base导航时,动态图更新时需要可用的激光雷达数据,当障碍物在5m时程序接受到正确的5m的数据,更新了动态层,但当障碍物移动时,原方向上只有10m外的有一堵墙,此时激光雷达无法捕捉到墙的距离信息,因为激光雷达的范围是8m,所以在原方向输出的数据为inf,即无穷大这并不算程序能处理的数据,所以程序认为此方向没有数据,故无法更新该方向上的障碍物标记信息。

解决方法

先查看原激光雷达数据信息

rostopic echo -n 1 /scan

ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法

此处雷达信息有多个inf,无穷大

我们打开雷达的功能包,找到输出雷达数据的段落

    for (size_t i = 0; i < node_count; i++)
    {
        size_t current_angle = floor(nodes[i].angle);
        //printf("current_angle = %d\r\n", current_angle);
        if(current_angle >= 360.0)
        {
            //printf("lidar angle over rang\n");
            continue;
        }
        float read_value = (float) nodes[i].distance;
        if (read_value > scan_msg.range_max || read_value < scan_msg.range_min)
        //如果雷达数据比最大值大,比最小值小,即在雷达范围外
            scan_msg.ranges[360 - 1 - current_angle] = std::numeric_limits<float>::infinity();
            //将此方向上的数据输出为无限大,std::numeric_limits<float>::infinity()这句话可以理解为一个无限大的值,赋给/scan节点
        else
            scan_msg.ranges[360 - 1 - current_angle] = read_value;
    }

由于move_base程序无法处理无限大,则修改为

    for (size_t i = 0; i < node_count; i++)
    {
        size_t current_angle = floor(nodes[i].angle);
        //printf("current_angle = %d\r\n", current_angle);
        if(current_angle >= 360.0)
        {
            //printf("lidar angle over rang\n");
            continue;
        }
        float read_value = (float) nodes[i].distance;
        if (read_value > scan_msg.range_max || read_value < scan_msg.range_min)
        //如果雷达数据比最大值大,比最小值小,即在雷达范围外
            //scan_msg.ranges[360 - 1 - current_angle] = std::numeric_limits<float>::infinity();
            scan_msg.ranges[360 - 1 - current_angle] = 0.0;
            //将0.0赋值给/scan节点
        else
            scan_msg.ranges[360 - 1 - current_angle] = read_value;
    }

在catkin_make后在运行激光雷达并监听

ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法

确保你的数据是0.0,便可以开始下一步

如果你之前用的是sudo apt install ros-melodic-navigation下载的navigotion请卸载他

sudo apt remove ros-melodic-navigation

然后下载源码版的navigation

新建工作空间,并下载源码

mkdir ~/navigation/src
cd ~/navigation/src
git clone https://github.com/ros-planning/navigation.git 
cd ~/navigation
catkin_make
cd 
gedit .bashrc
将source ~/navigation/devel/setup.bash加入

如果提示报错一般是缺少功能包,运行

sudo apt install ros-melodic-功能包名

注意功能包名的下划线改连字符 _ 号改成 - 号

打开~/navigation/src/navigation/costmap_2d/plugins/obstacle_layer.cpp

找到第272行

void ObstacleLayer::laserScanValidInfCallback(const sensor_msgs::LaserScanConstPtr& raw_message,
                                              const boost::shared_ptr<ObservationBuffer>& buffer)
{
  // Filter positive infinities ("Inf"s) to max_range.
  float epsilon = 0.0001;  // a tenth of a millimeter
  sensor_msgs::LaserScan message = *raw_message;
  for (size_t i = 0; i < message.ranges.size(); i++)
  {
    float range = message.ranges[ i ];
    if (!std::isfinite(range) && range > 0)
    {
      message.ranges[ i ] = message.range_max - epsilon;
    }
  }

改成

void ObstacleLayer::laserScanValidInfCallback(const sensor_msgs::LaserScanConstPtr& raw_message,
                                              const boost::shared_ptr<ObservationBuffer>& buffer)
{
  // Filter positive infinities ("Inf"s) to max_range.
  float epsilon = 0.0001;  // a tenth of a millimeter
  sensor_msgs::LaserScan message = *raw_message;
  for (size_t i = 0; i < message.ranges.size(); i++)
  {
    float range = message.ranges[ i ];
    if (!std::isfinite(range) && range > 0||(range == 0.0))
    // 当雷达数据等于0.0时,认为此时激光雷达为最大范围
    {
      message.ranges[ i ] = message.range_max - epsilon;
    }
  }

回到navigation目录下,catkin_make

打开你的导航配置功能包,找到costmap_common_params.yaml配置文件

robot_radius: 0.2
map_type: costmap

static_layer:
  enabled:              true
  unknown_cost_value: -1
  lethal_cost_threshold: 100
  
obstacle_layer:
  enabled:              true
  max_obstacle_height:  2.0
  origin_z:             0.0
  z_resolution:         0.2
  z_voxels:             10
  unknown_threshold:    10
  mark_threshold:       0
  combination_method:   1
  track_unknown_space:  false  
  publish_voxel_map: false
  observation_sources:  scan 
  scan:
    data_type: LaserScan
    topic: scan
    marking: true
    clearing: true
    min_obstacle_height: -0.1
    max_obstacle_height: 1.5
    obstacle_range: 4.0
    raytrace_range: 4.0
    inf_is_valid: true  #scan的无穷远数据是否有效
 
inflation_layer:
  enabled:              true
  cost_scaling_factor:  10 
  inflation_radius:     0.11  

在obstacle_layer:  /    scan:  /  中添加 inf_is_valid: true使数据有有效

问题解决

 文章来源地址https://www.toymoban.com/news/detail-459864.html

到了这里,关于ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 冰达ROS机器人使用-实现slam建模、自主导航、避障

    1.在windows中下载好远程连接工具: xshell 、 puty 1 2.机器人有两种模式: 模式 说明 AP模式 机器人自己创建一个热点,电脑端连接该热点,实现局域网互通 WiFi模式 机器人和电脑同时连接一个路由器,实现局域网通信 ps:本文使用AP模式,因为用起来比较方便 3.在机器人AP模式下

    2023年04月08日
    浏览(45)
  • (无人机方向)ros学习之路ROS 机器人系统仿真_导航仿真概述

    一:导航仿真概述 导航是机器人系统中最重要的模块之一,比如现在较为流行的服务型室内机器人,就是依赖于机器人导航来实现室内自主移动的,本章主要就是介绍仿真环境下的导航实现,主要内容有: 导航相关概念 导航实现:机器人建图(SLAM)、地图服务、定位、路径规划…

    2024年02月02日
    浏览(58)
  • 【ROS2机器人入门到实战】使用API进行导航

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn Navigation 2 对外提供了动作服务用于导航调用。动作通信是 ROS 2 四

    2024年02月03日
    浏览(49)
  • ROS2机器人任务级导航仿真系统设计与实现(预告)

    前一篇: ​​​​​ROS2工业机械臂抓取仿真系统设计与实现(预告) ROS2机器人任务级导航仿真系统设计与实现 一、背景与意义 随着机器人技术的不断发展和智能化需求的提高,机器人在各个领域中的应用越来越广泛。其中,机器人导航系统是实现机器人自主移动、完成各

    2024年01月24日
    浏览(51)
  • 【ROS2机器人入门到实战】Nav2导航框架介绍与安装

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 上一节我们对机器人导航过程中所用到的2D地图进行了介绍,本节

    2024年02月04日
    浏览(40)
  • 【运动规划算法项目实战】如何实现机器人多目标点导航(附ROS C++代码)

    在ROS机器人应用中,实现机器人多目标点导航是非常常见的需求。本文将介绍如何使用ROS和actionlib来实现机器人的多目标点导航,目标点信息将被记录在YAML文件中。 我们可以通过使用MoveBaseAction来实现机器人的导航功能。MoveBaseAction是一个ROS中的action类型,它提供了控制机器

    2024年02月10日
    浏览(43)
  • 无人驾驶动态避障策略调研 | 机器人动态避障策略 | 行人轨迹预测 | 机器人导航

    最近在研究机器人协同路径规划策略,发现现有paper中的obstacle都是静态的,但是在实际场景中,常有动态障碍的情形,如走动的行人等等。 为了更好的了解相关技术,我开始调研无人驾驶领域中的动态避障策略: 无人驾驶技术是多个技术的集成,包括了传感器、定位与深度

    2023年04月08日
    浏览(37)
  • 机器人操作系统ROS(11)Turtlebot3自动避障及其地图构建和导航

    该节需要完成前面一节内容实现turtlebot3正常创建新地图,才可以实现本节的自动避障和导航 启动虚拟机器人有环境的仿真 键盘控制 打开新端口 3. 自动避障 打开新端口 4. 调用rviz 注意:可以通过修改size来变化激光扫描边缘的粗细 之前已经启动无需再起世界地图 启动好后可

    2024年02月02日
    浏览(43)
  • ROS2下使用TurtleBot3-->SLAM导航(仿真)RVIZ加载不出机器人模型

    在使用台式机进行仿真时,大部分例程很顺利,但在SLAM导航时,在RVIZ中却一直加载不出机器人模型,点击Navigation2 Goal选择目标点进行导航时,无响应。 启动后在RVIZ2和终端看到一个错误 按照官网的指令试了多次,一直无法加载,在网上赵的解决方案都是修改RVIZ里的各种设

    2024年02月09日
    浏览(53)
  • ROS学习笔记08、机器人导航仿真(slam、map_server、amcl、move_base与导航消息介绍)

    马上开学,目前学校很多实验室都是人工智能这块,大部分都是和机器人相关,然后软件这块就是和cv、ros相关,就打算开始学习一下。 本章节是虚拟机安装Ubuntu18.04以及安装ROS的环境。 学习教程:【Autolabor初级教程】ROS机器人入门,博客中一些知识点是来源于赵老师的笔记

    2023年04月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包