ipa 功能包调试,分区算法,覆盖算法测试

参考

wiki 流网络 flow network 解释

相关文章

ipa 分区算法 ipa 分区算法总结,部分算法图解

环境

ubuntu20,ros 版本 noetic

运行测试

按照 readme 提示进行测试,跳过第一个步骤,并不需要 turtlebot3。

执行第三个 launch 报错:

看下 room_exploration_client.launch 文件

<?xml version="1.0"?>
<launch>

        <arg name="env_pack" default="$(find cob_default_env_config)" />
        <arg name="robot_env" default="$(optenv ROBOT_ENV !!NO_ROBOT_ENV_SET!!)"/>
        <arg name="robot_radius" default="0.5"/>
        <arg name="coverage_radius" default="0.5"/>
        <arg name="use_test_maps" default="true"/>

        <!--  -->
        <node ns="room_exploration" pkg="ipa_room_exploration" type="room_exploration_client" name="room_exploration_client" output="screen">
                <rosparam file="$(arg env_pack)/envs/$(arg robot_env)/map.yaml" command="load" />
                <param name="env_pack" value="$(arg env_pack)"/>
                <param name="robot_env" value="$(arg robot_env)"/>
                <param name="robot_radius" value="$(arg robot_radius)"/>
                <param name="coverage_radius" value="$(arg coverage_radius)"/>
                <param name="use_test_maps" value="$(arg use_test_maps)"/>
        </node>


</launch>

env_pack:ipa 的配置功能包,实践中将程序和系统配置分离,相关功能配置可能是在项目中专门配置功能包中。

robot_env:机器环境,在 env_pack 包中,对多个机器(差速轮底盘,阿克曼底盘等)有多个不同的配置,需要根据机器分别配置参数。

robot_radius:???作用

coverage_radius:机器的覆盖半径。

use_test_maps:是否用 ipa 官方的测试地图。

默认的配置功能包是 cob_default_env_config ,我们自己的项目中不存在这个功能包,所以要创建一个新功能包来完成 ipa 配置功能包即可。

在 ipa_coverage_planning 文件包内创建 ipa_env 功能包,用 tree 查看目录如下

➜  ipa_coverage_planning git:(develop) ✗ tree -L 1
.
├── ipa_building_msgs
├── ipa_building_navigation
├── ipa_coverage_planning
├── ipa_env
├── ipa_room_exploration
├── ipa_room_segmentation
└── README.md

ipa_env 包目录如下:

第 3 个 launch 指令执行需要修改 env_pack 参数值,如下:

roslaunch ipa_room_exploration room_exploration_client.launch env_pack:=ipa_env robot_env:=ipa_robot use_test_maps:=false

执行后依旧报错:

room_exploration_client.launch 的 env_pack 默认值修改为存在的其他功能包名,如下:

<arg name="env_pack" default="$(find ipa_room_exploration)" />

执行后没有“not found cob_default_env_config” 的错误了。

!!!注意!!!

这里说明 xml 中标签 <arg> 的默认值执行是在终端赋值之前的执行的!

但有了其他问题,rosparam 找不到 map.yaml 文件:

在 map.yaml 文件目录下执行 pwd 查看路径:

路径是正确的。

仔细看看 xml,发现 file 是用 $(arg env_pack) 拼接的,说明变量 env_pack 需要包含 ipa 配置功能包在系统中的绝对路径,而我们的传参仅仅传递了 ipa 配置功能包名。

修改 launch 如下,让 file 自动寻找 env_pack 功能包在系统的绝对路径,下面只显示修改的部分:

  <arg name="env_pack" default="ipa_room_exploration" />
  <node ns="room_exploration" pkg="ipa_room_exploration" type="room_exploration_client" name="room_exploration_client" output="screen">
    <rosparam file="$(find $(arg env_pack))/envs/$(arg robot_env)/map.yaml" command="load" />
    <param name="env_pack" value="$(find env_pack)"/>
  </node>

再执行 launch,map.yaml 文件已经可以找到了,但出现新问题,xml 中 $() 不让嵌套使用,报语法错误。゚(TヮT)゚。

最后还是改成下面这样:

<?xml version="1.0"?>
<launch>

        <arg name="env_pack" default="$(find ipa_env)" />
        <arg name="robot_env" default="$(optenv ROBOT_ENV !!NO_ROBOT_ENV_SET!!)"/>
        <arg name="robot_radius" default="0.5"/>
        <arg name="coverage_radius" default="0.5"/>
        <arg name="use_test_maps" default="true"/>

        <!--  -->
        <node ns="room_exploration" pkg="ipa_room_exploration" type="room_exploration_client" name="room_exploration_client" output="screen">
                <rosparam file="$(arg env_pack)/envs/$(arg robot_env)/map.yaml" command="load" />
                <param name="env_pack" value="$(arg env_pack)"/>
                <param name="robot_env" value="$(arg robot_env)"/>
                <param name="robot_radius" value="$(arg robot_radius)"/>
                <param name="coverage_radius" value="$(arg coverage_radius)"/>
                <param name="use_test_maps" value="$(arg use_test_maps)"/>
        </node>


</launch>

执行 launch 也不需要修改 env_pack 变量值了:

roslaunch ipa_room_exploration room_exploration_client.launch robot_env:=ipa_robot use_test_maps:=false

程序运行成功!

测试地图
ipa 默认覆盖算法

覆盖算法测试

ipa_room_exploration/ros/launch/room_exploration_action_server_params.yaml 文件中的 room_exploration_algorithm 参数来选择覆盖算法。重启 ipa 服务端,重新加载参数,执行

roslaunch ipa_room_exploration room_exploration_action_server.launch

执行后发现覆盖路径无明显变化。

服务端 log 如下:

log 显示启动 server.launch 后,覆盖算法已经修改为 6 局部能量最小覆盖算法。

注意这里的 room_exploration/path_planning_algorithm 的 room_exploration 并非参数空间前缀,而是代码这么写的。一开始还被误导以为是参数空间名对不上导致的问题。

之后再启动 client.launch,触发了动态参数服务器,将覆盖算法改为了 8,牛耕算法变种。

ipa_room_exploration/ros/src/room_exploration_action_client.cpp 的 121 行发现这段代码,这里创建了动态参数服务器的客户端,修改了参数:

屏蔽这段代码,编译 ipa_room_exploration 功能包,重新执行服务器 launch 和客户端 launch。

成功执行了局部能量最小覆盖算法!

ipa 新覆盖算法

下面展示所有的覆盖算法路径效果,这里的测试仅修改了 room_exploration_algorithm 服务器参数,其他参数是官方默认参数

  • room_exploration_algorithm 参数值之 grid point explorator

对应论文的 Grid-based Traveling Salesman Coverage Path Planning 基于栅格旅行商覆盖路径算法,用 TSP 旅行商算法来计算地图中所有空闲栅格的遍历顺序。

该算法十分耗时,作者甚至给它做了个进度条,用一张 gif 来感受一下有多慢:

ipa TSP 遍历覆盖算法

  • room_exploration_algorithm 参数值之 boustrophedon explorator

对应论文的 Boustrophedon Coverage Path Planning 牛耕覆盖路径算法

ipa 牛耕覆盖算法

  • room_exploration_algorithm 参数值之 neural network explorator

神经网络覆盖算法

ipa 神经网络覆盖算法

  • room_exploration_algorithm 参数值之 convexSPP explorator

Convex Sensor Placement Coverage Path Planning 凸传感器放置覆盖路径算法

Log 有点多 ...

ipa 凸包 SPP 覆盖算法

  • room_exploration_algorithm 参数值之 flowNetwork explorator

论文参考文献和源码中都找不到相关论文。注释有这么一句:

This class provides a coverage path planning algorithm based on a flow network.

Wiki 对流网络 flow network 的解释如下(有些资料叫 network flow 网络流):
在图论中,流网络是一个有向图,每条边都有一个容量,每条边接收一个流。边的流量不能超过边的容量。在运筹学 operations research 中,有向图通常称为网络,顶点称为节点,边称为弧。流必须满足流入节点的流量等于流出节点的流量的限制,除非它是只有流出的源 S,或者只有流入的汇 t。

流网络,源 S,汇 t

Log 刷屏非常多,似乎在第三方库中,源码搜索不到相关日志。程序陷入死循环一直没有结束,该算法应该未完成。

  • room_exploration_algorithm 参数值之 energyFunctional explorator

对应论文 Grid-based Local Energy Minimization 基于栅格的局部能量最小算法

ipa 局部能量最小覆盖算法

  • room_exploration_algorithm 参数值之 voronoi explorator

对应论文 Contour Line-based Coverage Path Planning 基于轮廓线的覆盖路径算法

执行后没有规划成功,服务端 log:

把服务器参数 revisit_areas 设置为 true,再次测试...还是规划失败。

客户端 log:

没有其他 log 提示了,初步判断是地图没有封闭空间导致的,给地图增加一圈黑边(障碍物)再测试。

规划成功!说明用 voronoi explorator 算法需要地图有封闭边界!

ipa 轮廓线覆盖算法

  • room_exploration_algorithm 参数值之 boustrophedon variant explorator

牛耕法变种,改进了牛耕法中细胞分解后,对相同主轴的分区进行合并,减少区域的碎片化。没找到对应的论文信息。

ipa 牛耕法变种覆盖算法

分区算法测试

分区算法在 ipa_room_segmentation 功能包中,也是分为客户端和服务端两部分运行:

服务端 room_segmentation_action_server.launch 和客户端 room_segmentation_action_client.launch

分区算法的参数配置在 ipa_room_segmentation/ros/launch/room_segmentation_action_server_params.yaml 中。

同样,客户端代码也修改了动态参数服务器的参数,先屏蔽了 ipa_room_segmentation/ros/src/room_segmentation_client.cpp 的部分代码:

编译后分别运行服务端和客户端的 launch。

测试的地图不对,测试的还是官方的测试地图:

ipa 分区测试默认地图

而我的地图是:

ipa 分区测试用户地图

从 log 看参数配置的生效了。再看看分区客户端代码是怎么写的...

客户端是直接把测试地图名写入一个 vector 变量 map_names 中,然后在 for 循环中在指定地址获取相应的地图地址,把地图转为地图话题数据,再装入 goal 中发送给服务端。

流程大概如下:


int main(int argc, char **argv)
{
  ros::init(argc, argv, "room_segmentation_client");
  ros::NodeHandle nh;

  // map names
  std::vector< std::string > map_names;
  map_names.push_back("lab_ipa"); // 这就是测试的第一张默认地图
  map_names.push_back("lab_c_scan");
  ... // 加了很多地图

  for (size_t image_index = 0; image_index<map_names.size(); ++image_index) {
    // 在 ipa_room_segmentation 功能包的指定位置搜索地图
    std::string image_filename = ros::package::getPath("ipa_room_segmentation") + "/common/files/test_maps/" + map_names[image_index] + ".png";
    cv::Mat map = cv::imread(image_filename.c_str(), 0); // cv 读地图
    ...
    cv_image.toImageMsg(labeling); // 数据转换
    actionlib::SimpleActionClient<ipa_building_msgs::MapSegmentationAction> ac("room_segmentation_server", true);
    ... // goal 数据装包
    ac.sendGoal(goal); // 目标发送到服务端
    bool finished_before_timeout = ac.waitForResult(ros::Duration()); // 等待结果

    if (finished_before_timeout) {
      ... // 数据转换到 cv 格式
      cv::imshow("segmentation", colour_segmented_map); // cv 显示地图
      cv::waitKey(); // 敲空格测试下一张地图
    }
  } // for
  return 0;
}

所以只需要修改客户端的测试地图名称和测试地图所在的路径即可。

根据自己的测试环境修改这两部分代码,编译后测试 ok。

下面展示所有的分割算法分区效果,这里的测试仅修改了 room_segmentation_algorithm 服务器参数,其他参数是官方默认参数

  • room_segmentation_algorithm 参数值之 morphological segmentation

对应论文的 Morphological Segmentation 形态分割算法

ipa 形态分割算法

  • room_segmentation_algorithm 参数值之 distance segmentation

对应论文 Distance Transform-based Segmentation 距离变换分割算法

ipa 距离变换分割算法

  • room_segmentation_algorithm 参数值之 Voronoi segmentation

对应论文 Voronoi Graph-based Segmentation Voronoi 图分割算法

ipa Voronoi 图分割算法

  • room_segmentation_algorithm 参数值之 semantic segmentation

在《Room Segmentation: Survey, Implementation, and Analysis.》称为Feature-based Segmentation 特征/语义分割

ipa 语义分割算法

  • room_segmentation_algorithm 参数值之 voronoi random field segmentation

对应论文 Voronoi Random Fields Segmentation Voronoi 随机势场分割

ipa Voronoi 随机势场分割算法

  • room_segmentation_algorithm 参数值之 passthrough segmentation

不分割算法,正如其名...

ipa 不分割算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/617471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第02章 计算机网络概述

2.1 本章目标 了解计算机网络的定义了解计算机网络的功能了解计算机网络的分类了解计算机网络的组成 2.2 计算机网络的定义 2.3 计算机网络的功能 2.4 计算机网络的分类 物理拓扑结构分类&#xff1a;总线型、环型、星型 2.5 计算机网络的组成 网络适配器(NIC)接口规格分类&a…

事件高级。

一、注册事件&#xff08;绑定事件&#xff09; 就是给元素添加事件 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 1 传统注册方式 方法监听注册事件 2、 addEventListener 事件监听方式 里面的事件类型是字符串&#xff0c;必定加引号&#xff0c;而且不带o…

【busybox记录】【shell指令】ls

目录 内容来源&#xff1a; 【GUN】【ls】指令介绍 【busybox】【ls】指令介绍 【linux】【ls】指令介绍 使用示例-默认输出&#xff1a; 列出目录内容 - 默认输出 列出目录内容 - 不忽略以.开头的文件 列出目录内容 - 不忽略以.开头的文件&#xff0c;只忽略.和..文件…

机器学习笔记导航(吴恩达版)

01.机器学习笔记01&#xff1a;机器学习前置概念导入、线性回归、梯度下降算法 02.机器学习笔记02&#xff1a;多元线性回归、多元梯度下降算法、特征缩放、均值归一化、正规方程 03.机器学习笔记03&#xff1a;octave安装、创建矩阵 04.机器学习笔记04&#xff1a;octave中移动…

量化之王西蒙斯:那些投资“神迹”和难言的“身后事”

投资大师总是相偕而来&#xff0c;又相伴而去。 美国当地时间2024年5月10日&#xff0c;量化投资大师西蒙斯&#xff08;James Harris Simons&#xff09;骤然去世&#xff0c;享年86岁。 此时距离芒格离世不到半年。 西蒙斯拥有数学家、投资家、慈善家、量化行业开拓者、密…

17_基于Flash和RAM的的文件系统选择

嵌入式系统常见文件系统 本文主要讲述在嵌入式系统中,常见的基于flash和内存(RAM)的文件系统类型,具体选择要结合实际需求灵活选配。 一、基于 Flash 的文件系统 基于 Flash 的文件系统主要包括 JFFS2、 YAFFS、 Cramfs 和 Romfs 等,各种文件系统具有不同的特点,本文将分…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具&#xff0c;该工具支持复刻一个现实场景中完整功能的Botnet测试环境&#xff0c;广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制&#xff0c;以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

halcon学习之一维测量基础

目录 创建测量矩形&#xff0c;获取测量句柄 gen_measure_rectangle2&#xff08;&#xff09; 使用句柄进行测量 measure_pos&#xff08;&#xff09; 修改参数Threshold 修改参数Transition 修改参数select 参数RowEdge&#xff0c;ColumnEdge&#xff0c;Distance …

Lab4: traps

RISC-V assembly Which registers contain arguments to functions? For example, which register holds 13 in mains call to printf? 根据RISC-V函数调用规范&#xff0c;函数的前8个参数使用a0-a7寄存器传递。 当main函数调用printf函数时&#xff0c;a2寄存器保存13 …

7.STL_string1.0(详细)

目录 1. 什么是STL 2. STL的版本 3. STL的六大组件 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类(了解) 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 reserve 3. string类对象…

C++入门必读-Qt的安装与配置

QT简介 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 QT下载 访问下载网站: Index of /archive/qt 安装编译器 QT安装 建议安装之前将网络断…

【回溯 字典树(前缀树)】212. 单词搜索 II

本文涉及知识点 回溯 字典树&#xff08;前缀树&#xff09; LeetCode212. 单词搜索 II 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元…

Android studio 打开Device Mirroring方便调试

巧合下发现一个很好用的工具&#xff0c;在平时调试真机的时候在每次run app后都要低头找找手机看看效果。但是&#xff0c;用了AS上的Device Mirroring&#xff0c;你会发现根本不需要再低头点手机&#xff0c;调试方便一万倍啊。 话不多说&#xff0c;上图。直接就可以在电脑…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈&#xff0c;栈是一种后进先出的结构&#xff0c;即LIFO&#xff0c;…

从JSON数据到Pandas DataFrame:如何解析出所需字段

目录 一、引言 二、JSON数据的基本结构 三、使用Pandas从JSON数据中读取数据 四、从DataFrame中解析出所需字段 解析对象字段 解析嵌套对象字段 解析数组字段 五、案例与代码示例 六、总结 一、引言 在数据分析和处理的日常工作中&#xff0c;我们经常需要从各种…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Table Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Table Widget的说明及介绍 文章编号&#…

【JS红宝书学习笔记】第3章 语言基础

第3章 语言基础 1. 语法 标识符&#xff08;变量、函数、属性或函数参数的名称&#xff09;&#xff1a;一般使用驼峰法命名&#xff0c;关键字、保留字、true、false 和 null 不能作为标识符。 标识符的第一个字符必须是一个字母、下划线&#xff08;_&#xff09;或美元符号…

乡村振兴与数字乡村建设:加强农村信息化建设,推动数字乡村发展,提升乡村治理和服务水平,构建智慧化的美丽乡村

目录 一、引言 二、数字乡村建设的必要性 1、推动农村经济转型升级 2、提升乡村治理水平 3、改善乡村民生福祉 三、数字乡村建设的现状与挑战 1、现状 2、挑战 四、数字乡村建设的未来发展路径 1、加强农村信息化基础设施建设 2、提升农民信息素养和技能水平 3、制…

软件设计师笔记和错题

笔记截图 数据库 模式是概念模式 模式/内模式 存在概念级和内部级之间&#xff0c;实现了概念模式和内模式的互相转换 外模式/模式映像 存在外部级和概念级之间&#xff0c;实现了外模式和概念模式的互相转换。 数据的物理独立性&#xff0c; 概念模式和内模式之间的映像…

JAVA抽象类,接口与内部类,常用API知识总结

文章目录 抽象类和抽象方法抽象类的定义格式抽象方法的定义格式注意事项 接口定义和使用成员特点和类之间的关系新增JDK8新增方法JDK9新增方法 总结设计模式 内部类使用场景分类成员内部类获取内部类对象访问成员变量 静态内部类局部内部类匿名内部类格式使用场景 示例 常用API…