清洁机器人规划控制方案
清洁机器人规划控制方案
| 作者 | 联系方式 |
|---|---|
| Forrest | 709335543@qq.com |
文章目录
- 清洁机器人规划控制方案
- 方案简介
- 方案设计
- 模块链路
- 坐标变换
- 算法框架
- 功能设计
- 定点自主导航
- 固定路线清洁
- 区域覆盖清洁
- 贴边沿墙清洁
- 自主返航回充
- 仿真测试
- 仿真测试准备
- 定点自主导航测试
- 固定路线清洁测试
- 区域覆盖清洁测试
- 贴边沿墙清洁测试
方案简介
室内商用扫地/洗地机器人规划控制(PNC)方案。有以下功能包组成:
- clean_msg:功能消息定义
- clean_pnc:规划控制算法
- clean_rviz:rviz仿真测试插件
目前PNC方案支持以下功能:
- 定点自主导航
- 固定路线清洁
- 区域覆盖清洁
- 贴边沿墙清洁
- 自主返航回充
PNC方案在满足清洁机器人常见场景需求,除此之外,还支持以下特性:
- 断点续接清洁
- 清洁区域补漏
- 虚拟墙设置
- 禁止清洁区域设置
- 动/静态覆盖清洁设置
- 左/右沿墙清扫设置
- 动态调节速度(根据距离障碍物远近调节)
- 清洁数据统计(清洁轨迹、清洁率、面积、耗时等)
- 不同底盘形状碰撞支持
- 扫地/洗地清洁设备控制支持
- …
方案设计
模块链路
PNC模块相关输出/输出关系如上图所示:
- 输入
- 传感器数据、如lidar、camera等
- 定位位姿
- 地图数据
- TF变化
- 输出
- 机器人控制指令
- 清洁设备控制指令
- 清洁任务数据,如状态、报告等
坐标变换
整体方案运行,需要相关TF支持,相关TF关系定义如下:
注意:这里引入
odom_linkframe主要是有些底盘运动电机没有安装在底盘中心
算法框架
- task_manager:清洁任务执行管理器。接收上层发过来的任务队列,挨个进行执行。
- task:导航任务定义描述,现支持以下五个导航任务:
- pose_navigator:定点自主导航任务。可实现A到B点功能。
- path_follower:固定路线清洁任务。可用于预定义路线清洁。
- area_cleaner:区域覆盖清洁任务。可用于固定区域覆盖式清洁。
- wall_follower:贴边沿墙清洁任务。可用于沿墙贴边清洁。
- auto_charger:自主返航回充任务。机器人低电量时自主返航回充。
- tasker:导航任务实现抽象。上述每个导航任务都是一个tasker,一般每个tasker由以下三部分组成:
- planner:规划器。一个tasker可根据要实现的功能搭配多个planner,比如实现pose_navigator要搭配astar_path_planner和dwa_path_planner。现支持的planner有:
- astar_path_planner:A*全局路径规划算法。用于A到B点路径生成
- dwa_path_planner:DWA局部路径规划算法。用于路径跟踪。
- clean_path_planner:覆盖路径规划算法。用于区域覆盖清洁路线生成。
- contours_path_planner:沿墙路径规划算法。用于沿墙贴边清洁路径生成。
- decider:决策器。一个tasker可根据要实现的功能搭配多个decider,比如实现pose_navigator要搭配global_plan_decider和local_plan_decider。现支持的decider有:
- global_plan_decider:全局规划决策器。用于判断是否需要进行全局路径重规划。
- local_plan_decider:局部规划决策器。用于局部路径规划失败处理。
- path_follow_decider:路径跟踪决策器。用于路径跟踪停障等待和绕障处理。
- navi_logic:导航逻辑。一个tasker可根据要实现的功能配合planner和decider进行调用逻辑组合,从而实现对应功能。
- planner:规划器。一个tasker可根据要实现的功能搭配多个planner,比如实现pose_navigator要搭配astar_path_planner和dwa_path_planner。现支持的planner有:
- task:导航任务定义描述,现支持以下五个导航任务:
- cost_map:代价地图。用于障碍物碰撞检测。
- footprint_model:机器人碰撞模型描述。可根据机器人形状进行定义。
- global_cost_map:全局代价地图。可用于全局规划路径和清洁规划路径生成。
- local_cost_map:局部代价地图。可用于局部规划路径生成。
- fuction_map:功能地图。用于相关清洁功能实现,比如禁止清洁区域。
- forbidden_clean_area:禁止清洁区域。限定清洁环境中,某些区域只允许经过,不可以清洁。
- task_cleaned_area:已清洁区域。用于清洁任务中,已经清洁区域统计,生成相关清洁报告。
- clean_system:清洁设备控制器。用于扫地/洗地清洁设备开关控制。
功能设计
定点自主导航
定点自主导航任务,可实现A到B点功能。功能设计如下图所示:
- 由astar_path_planner生成机器人当前位置到导航目标点全局路径。
- 得到全局路径后,dwa_path_planner则进行跟踪控制。
- 在导航过程中,global_plan_decider会判断全局路径可达性,如果当前全局路径不可达,则重新进行全局路径规划。
- 在导航过程中,local_plan_decider会根据dwa_path_planner规划状态,进行局部路径规划失败处理。
固定路线清洁
固定路线清洁任务,可用于预定义路线清洁。功能设计如下图所示:
- 首先机器人会根据pose_navigator一样的逻辑导航到离清洁路线最近点,然后开始清洁路线跟踪。
- 清洁路线跟踪使用dwa_path_planner。
- 在开始清洁路线跟踪后,path_follow_decider判断跟踪路线是否需要停障。
- 如果遇到障碍物则进行停障等待。
- 停障等待超时后,进行绕障继续跟踪清洁路线。
- 在清洁路线跟踪过程中,local_plan_decider会根据dwa_path_planner规划状态,进行局部路径规划失败处理。
区域覆盖清洁
区域覆盖清洁任务,可用于固定区域覆盖式清洁。功能设计如下图所示:
- 首先机器人会根据pose_navigator一样的逻辑导航到离清洁区域内最近点。
- 到达清洁区域内后,使用clean_path_planner进行清洁路线覆盖规划,并进行跟踪。
- 清洁路线跟踪使用dwa_path_planner。
- 在开始清洁路线跟踪后,path_follow_decider判断跟踪路线是否需要停障
- 如果遇到障碍物则进行停障等待
- 停障等待超时后,进行绕障继续跟踪清洁路线
- 在清洁路线跟踪过程中,local_plan_decider会根据dwa_path_planner规划状态,进行局部路径规划失败处理。
贴边沿墙清洁
贴边沿墙清洁任务,可用于沿墙贴边清洁。功能设计如下图所示:
- 首先机器人会根据pose_navigator一样的逻辑导航到离沿墙清洁路径上最近点。
- 到达最近后,使用contours_path_planner进行沿墙清洁路径规划,并进行跟踪。
- 沿墙清洁路线跟踪使用dwa_path_planner。
- 在清洁路线跟踪过程中,local_plan_decider会根据dwa_path_planner规划状态,进行局部路径规划失败处理。
自主返航回充
自主返航回充任务,机器人低电量时自主返航回充。功能设计如下图所示:
- 首先机器人会根据pose_navigator一样的逻辑导航到充电桩前方位置。
- 然后进行充电桩对接控制。
仿真测试
功能仿真测试视频:
清洁机器人PNC方案演示
仿真测试准备
-
安装部署好工程
-
仿真地图确认:仿真地图放在
cleanbot/clean_pnc/data/map目录下,目前该目录下有测试地图demo,如果想更换地图可按如下步骤:-
将要更换的地图放到
cleanbot/clean_pnc/data/map目录下 -
更改仿真器中
cleanbot/clean_pnc/launch/pnc_simulator.launch的test_map_name参数:<launch><node name="clean_pnc_simulator" pkg="clean_pnc" type="clean_pnc_simulator" output="screen"><param name="map_file_dir" value="$(find clean_pnc)/data/map/"/><param name="test_map_name" value="demo"/></node> </launch>
-
-
启动仿真程序:启动成功后,可看到如下rviz界面:
roslaunch clean_pnc simulation_wash_robot.launch
-
初始化机器人位姿:在
rviz软件显示窗口上,点击2D Pose Estimate按钮在地图上相应位置进行机器人位姿初始化
-
任务暂停/取消:在
rviz软件显示窗口左下角,可进行任务暂停/取消操作
定点自主导航测试
- 下发导航目标点:在
rviz软件显示窗口上,点击2D Nav Goal按钮在地图上相应位置进行导航目标点下发

-
下发成功后可在rviz看到如下界面:

-
如果想在测试过程中增加障碍物,可在
rviz软件显示窗口上,点击Publish Point按钮在地图上相应位置进行障碍物设置:
固定路线清洁测试
-
设定清洁路线:在
rviz软件显示窗口上,点击custom_path按钮在地图上相应位置进行清洁路线标注- 按下键盘上的
Enter按键下发任务 - 按下键盘上的
d按键重新绘制路线

- 按下键盘上的
-
下发成功后可在rviz看到如下界面:

-
如果想在测试过程中增加障碍物,可在
rviz软件显示窗口上,点击Publish Point按钮在地图上相应位置进行障碍物设置:
注意:任务完成后,机器人会主动导航返回任务起始点
区域覆盖清洁测试
-
设定清洁区域:在
rviz软件显示窗口上,点击clean_polygon按钮在地图上相应位置进行清洁区域标注- 按下键盘上的
Enter按键下发任务 - 按下键盘上的
d按键重新绘制区域

- 按下键盘上的
-
下发成功后可在rviz看到如下界面:

-
如果想在测试过程中增加障碍物,可在
rviz软件显示窗口上,点击Publish Point按钮在地图上相应位置进行障碍物设置:

注意:任务完成后,机器人会主动导航返回任务起始点
贴边沿墙清洁测试
-
设定清洁区域:在
rviz软件显示窗口上,点击along_wall按钮在地图上相应墙体位置进行沿墙启点下发
-
下发成功后可在rviz看到如下界面:

-
如果想在测试过程中增加障碍物,可在
rviz软件显示窗口上,点击Publish Point按钮在地图上相应位置进行障碍物设置:
注意:任务完成后,机器人会主动导航返回任务起始点
相关文章:
清洁机器人规划控制方案
清洁机器人规划控制方案 作者联系方式Forrest709335543qq.com 文章目录 清洁机器人规划控制方案方案简介方案设计模块链路坐标变换算法框架 功能设计定点自主导航固定路线清洁区域覆盖清洁贴边沿墙清洁自主返航回充 仿真测试仿真测试准备定点自主导航测试固定路线清洁测试区域…...
设计模式 - 工厂模式
一、 简单工厂(Simple Factory Pattern) 1、概念 一个工厂对象决定创建出哪一种产品类的实力,但不属于GOF23种设计模式。 简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创…...
elementUI this.$confirm 文字大小样式
dangerouslyUseHTMLString:true // message部分 以html片段处理 customClass //MessageBox 的自定义类名 整个comfirm框自定义类名 cancelButtonClass // 取消按钮的自定义类名 confirmButtonClass // 确定按钮的自定义类名<style> .addcomfirm{width: 500px; } .a…...
Kafka的TimingWheel
Kafka的TimingWheel是Kafka中的一个时间轮实现,用于管理和处理延迟消息。时间轮是一种定时器的数据结构,可以高效地管理和触发定时事件。 在Kafka中,TimingWheel用于处理延迟消息的重试。当Kafka生产者发送消息到Kafka集群,但由于某些原因导致消息发送失败,生产者会将这些…...
第2集丨webpack 江湖 —— 创建一个简单的webpack工程demo
目录 一、创建webpack工程1.1 新建 webpack工程目录1.2 项目初始化1.3 新建src目录和文件1.4 安装jQuery1.5 安装webpack1.6 配置webpack1.6.1 创建配置文件:webpack.config.js1.6.2 配置dev脚本1.7 运行dev脚本 1.8 查看效果1.9 附件1.9.1 package.json1.9.2 webpa…...
Python(Web时代)——初识flask
flask简介 介绍 Flask是一个用Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。它是BSD授权的,一个有少量限制的免费软件许可。它使用了 Werkzeug 工具箱和 Jinja2 模板引擎。 Flask 的设计理念是简单、灵活、易于扩展&a…...
二、SQL-5.DQL-8).案例练习
1、查询年龄为20,21,22,23岁的员工信息 select * from emp where age in(20, 21, 22, 23) and gender 女; 2、查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工 select * from emp where gender 男 && age between 2…...
浙大数据结构第五周之05-树7 堆中的路径
题目详情: 将一系列给定数字依次插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-1…...
C# Modbus TCP上位机测试
前面说了三菱和西门子PLC的上位机通信,实际在生产应用中,设备会有很多不同的厂家生产的PLC,那么,我们就需要一种通用的语言,进行设备之间的通信,工业上较为广泛使用的语言之一就是Modbus。 Modbus有多种连…...
instr字符查找函数(oracle用instr来代替like)
instr函数:字符查找函数。其功能是查找一个字符串在另一个字符串中首次出现的位置。 instr函数在Oracle/PLSQL中是返回要截取的字符串在源字符串中的位置。 语法 instr( string1, string2, start_position,nth_appearance ) 参数 string1:源字符串&am…...
trie树的一点理解
这个是最简单的数据结构:因为只需要记住两句话就能完美的写出简洁优雅的代码 1. 每次都是从根节点开始看(或者说从第零次插入的东西开始遍历,son[][]里面存的是第几次插入) 2每次遍历都是插入和查询的字符串 #include<iostream> using namespace …...
Linux CentOS监控系统的运行情况工具 - top/htop/glances/sar/nmon
在CentOS系统中,您可以使用以下工具来监控系统的运行情况: 1. top: top 是一个命令行工具,用于实时监控系统的进程、CPU、内存和负载情况。您可以使用以下命令来启动 top: top 输出 2. htop: htop 是一…...
Qt开发(2)——windows下调用外部程序
一、QProcess::start 1.阻塞性 start是非阻塞函数,但是这里的waitForFinished是阻塞的 2. 调用外部压缩程序7z // 目标压缩路径 QString zipFilePath destinationFolder "/" zipFileName; QStringList arguments{"a&qu…...
PostgreSQL查看数据库对象大小
PostgreSQL查看数据库对象大小 PostgreSQL查看数据库对象大小1、查看某个数据库大小2、查看多个数据库大小3、按顺序查看索引大小4、查看所有对象的大小 PostgreSQL查看数据库对象大小 1、查看某个数据库大小 select pg_size_pretty(pg_database_size(tzqdb));2、查看多个数据…...
给el-table实现列显隐
用过若依的都知道,在使用el-table 时候,实现列显隐效果是要给每个列加v-if 判断的,这种代码过于繁琐,于是翻看el-table包的代码,调试后发现内部的【插入】和【删除】两个方法可以达到我们要的效果。 项目不提供源码&a…...
为Android构建现代应用——应用架构
选择风格(Choosing a style) 我们将依照Google在《应用架构指南》中推荐的最佳实践和架构指南来构建OrderNow的架构。 这些定义包括通过各层定义组件的一些Clean Architecture原则。 层次的定义(Definition of the layers) 在应用程序中,我们将定义以下主要层次…...
49:字符串的新增方法
字符串的新增方法 String.fromCodePoint()String.raw()实例方法:codePointAt()实例方法:normalize()[实例方法:includes(), startsWith(), endsWith()](https://es6.ruanyifeng.com/#docs/string-methods#实例方法:includes(), s…...
Kaggle图表内容识别大赛TOP方案汇总
赛题名称:Benetech - Making Graphs Accessible 赛题链接:https://www.kaggle.com/competitions/benetech-making-graphs-accessible 赛题背景 数以百万计的学生有学习、身体或视力障碍,导致人们无法阅读传统印刷品。这些学生无法访问科学…...
DAY2,Qt(继续完善登录框,信号与槽的使用 )
1.继续完善登录框,当登录成功时,关闭登录界面,跳转到新的界面中,来回切换页面; ---mychat.h chatroom.h---两个页面头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> /…...
【设计模式】设计原则-开闭原则
单一职责原则 定义 当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。作用 1、方便测试;测试时只需要对扩展的代码进行测试。 2、提高代码的可复用性;粒…...
3种方案玩转赛博朋克2077存档修改:从入门到精通的技术指南
3种方案玩转赛博朋克2077存档修改:从入门到精通的技术指南 【免费下载链接】CyberpunkSaveEditor A tool to edit Cyberpunk 2077 sav.dat files 项目地址: https://gitcode.com/gh_mirrors/cy/CyberpunkSaveEditor 赛博朋克2077存档编辑器是一款专业级游戏数…...
“16QAM调制与解调系统的SystemView仿真及分析”
通信原理 systemview 16QAM调制与解调系统的仿真 16QAM调制解调系统与解调系统的仿真 用SystemView建立一个16QAM调制解调器电路,分析理解系统的各个模块功能,观察波形图 判断是不是实现了16QAM调制解调系统功能 基本要求: (1)在SystemView软 件中构建短波16QAM仿真…...
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程
从零搭建WebRTC SFU服务器:基于Mediasoup的1080P视频会议部署教程 视频会议已成为现代远程协作的核心工具,而WebRTC技术让浏览器间的实时音视频通信变得触手可及。但当你需要支持10人以上的高清会议时,单纯的P2P连接就会暴露出带宽和性能瓶颈…...
最小二乘问题详解15:束平差原理与基础实现
初始两帧的 E 矩阵分解可能存在错误解或尺度模糊;三角化结果受位姿误差和图像噪声影响;PnP 的位姿估计会继承并放大前期误差。 随着图像数量增加,这些局部误差会不断累积,导致最终重建结果出现尺度漂移、结构扭曲甚至拓扑错误。要…...
失业期PHP程序员玻璃心,伪勤奋,固守旧认知的庖丁解牛
“失业期 PHP 程序员的玻璃心、伪勤奋、固守旧认知”,这三者并非独立的性格缺陷,而是一套互为因果的“心理防御闭环”。 它们共同构成了一个**“认知牢笼”**:因为害怕面对真实的残酷(玻璃心),所以用低价值…...
2026届毕业生推荐的AI辅助写作网站实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 身为智能写作辅助工具的DeepSeek,于学术论文创作里呈现出明显效能,用…...
从电机到USB:一文搞懂嵌入式里的感性负载、容性负载与阻抗匹配(附功率因数校正实例)
从电机到USB:一文搞懂嵌入式里的感性负载、容性负载与阻抗匹配(附功率因数校正实例) 在嵌入式系统设计中,工程师常常需要同时面对两种看似截然不同的挑战:大功率电机驱动的强电控制和高速数字通信的弱电信号处理。当电…...
leetcode 困难题 1611. 使整数变为 0 的最少操作次数
Problem: 1611. 使整数变为 0 的最少操作次数 通过深度优先搜索函数dfs产出的ret数组,可以观察ret数组,可以发现,要去掉最左侧的1,需要pow(2, len -i)次操作,而且从左到右不同索引的1,索引从1开始ÿ…...
28_关于交叉学科的学习方法
1、费曼学习法 1.1 概念费曼学习法是一种以"以教代学"为核心的高效学习方法,由诺贝尔物理学奖得主理查德费曼(Richard Feynman) 提出。理查德费曼(1918-1988)是美国著名的理论物理学家,1965年因在…...
如何用OpCore Simplify解决黑苹果配置难题?——智能化EFI构建工具的革新性突破
如何用OpCore Simplify解决黑苹果配置难题?——智能化EFI构建工具的革新性突破 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题场景&a…...
