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 namesstd::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(); // 敲空格测试下一张地图}} // forreturn 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 不分割算法

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络篇】数据链路层(10)在物理层扩展以太网

文章目录 &#x1f354;扩展站点与集线器之间的距离&#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 &#x1f354;扩展站点与集线器之间的距离 &#x1f6f8;扩展共享式以太网的覆盖范围和站点数量 以太网集线器一般具有8~32个接口&#xff0c;如果要连接的站点数量超过了…

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

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

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

人工智能生成图像的兴起:区分事实与虚构

人工智能生成图像的兴起&#xff1a;区分事实与虚构 概述 在人工智能 (AI) 已融入我们日常生活的时代&#xff0c;人工智能生成图像的快速发展引发了人们对数字内容真实性的担忧。最近&#xff0c;人工智能生成的图像甚至欺骗了最敏锐的眼睛&#xff0c;这引发了人们对批判性…

饥荒服务器搭建centos

服务器环境需要64位32位不可用 uname -r 查看服务器版本 更新yum sudo yum update 安装依赖环境 sudo yum -y install glibc.i686 libstdc.i686 libcurl4-gnutls-dev.i686 libcurl.i686 screen 安装steam cd /home && mkdir steamcmd && cd steamcmd 国…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b&#xff0c;求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如&#xff0c;a1024&#xff0c;b1032&#xff0c;则 a 和 b 之间共有 9 个数如下&#xff1a; 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次&#xff0c;1 出现…

创新指南|设计冲刺 – 更快找到成功的创新方案

“ 设计冲刺&#xff08;Design Sprint&#xff09;” 一词与跑步无关&#xff0c;而且不局限于设计&#xff0c;它与引导团队加速创新密切相关。设计冲刺旨在帮助创新团队在很短的时间内解决一个极有价值的问题。本文将深入解析这一法宝&#xff1a;设计冲刺是什么&#xff1f…

会声会影2024中文汉化补丁器附免费激活码序列号

会声会影是一款由加拿大Corel公司发布的视频编辑软件&#xff0c;它以其功能丰富和用户友好的界面而闻名。会声会影2024是该系列的最新版本&#xff0c;它不仅继承了之前版本的强大功能&#xff0c;还引入了一系列新的特性和工具&#xff0c;使得视频编辑更加简单、高效且富有创…

智慧安监中的物联网主机E6000

物联网主机E6000的研发背景主要源于我国对物联网技术在安全生产、环境监测、火灾预警与防控、人员定位与紧急救援等领域的迫切需求。近年来&#xff0c;随着物联网技术的飞速发展&#xff0c;我国政府对智慧安监的重视程度不断提升&#xff0c;相关的政策扶持力度也在加大。在这…

React 第二十七章 Hook useCallback

useCallback 是 React 提供的一个 Hook 函数&#xff0c;用于优化性能。它的作用是返回一个记忆化的函数&#xff0c;当依赖发生变化时&#xff0c;才会重新创建并返回新的函数。 在 React 中&#xff0c;当一个组件重新渲染时&#xff0c;所有的函数都会被重新创建。这可能会…

java基础知识点总结2024版(8万字超详细整理)

java基础知识点总结2024版&#xff08;超详细整理&#xff09; 这里写目录标题 java基础知识点总结2024版&#xff08;超详细整理&#xff09;java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …

探索数据结构:树与二叉树

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 树 1.1. 树的定义 树是一种非线性的数据结构&#xff0c;它是由n&a…

第五十二周:文献阅读+STHTNN

目录 摘要 Abstract 文献阅读&#xff1a;用于区域空气质量预测的时空分层传输神经网络 现有问题 提出方法 创新点 方法论 周期特征提取组件(PFEC) 场景动态图模块(SDGM) 时空特征提取组件&#xff08;STEC) 传输注意力模块(TransATT) STHTNN模型 研究实验 数据集…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

阿里云 物联网平台 MQTT连接、数据传输

阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机&#xff0c;读取设备、仪器、MES或者电子元器件的数据&#xff0c;MQTT传输至阿里云平台&#xff0c;可视化界面构建界面&#…

了解当前经济,VBA一键获取不同货币实时汇率

了解当前经济数据,VBA一键获取不同货币间实时汇率 当下较火的经济新闻:黄金价格、日元贬值、美元加息等,咱们不去分析了解这些经济变动背后的动机及原因,做一点本份的事,如何用VBA获取不同货币之间的实时汇率。这肯定是需要联网的,现从“外汇查询” 网站(https://www.wa…

C++高精度算法-加法

引子 在C++的运算中,难免会出现很大很大的数,下面是各个关键字的表示范围 但是如果要表示的数超过了long long可以表示的最大值( 2 64 2^{64} 264-1) 怎么办呢? 如果强制表示,就会溢出,这里的溢出大家可以自行百度,反正就是会出一些-5665434之类的数 现在,就要切入正…

云南区块链商户平台:抓包技术自制开票工具(一)

背景 云南区块链商户平台是全省统一区块链服务平台。依托于云南省发改委、阿里云及蚂蚁区块链的国内首个省级区块链平台——云南省区块链平台同步上线&#xff0c;助力数字云南整体升级。 网页版并不适合妈妈那辈人使用&#xff0c;没有记忆功能&#xff0c;于是打算自己开发…