清洁机器人规划控制方案
清洁机器人规划控制方案
| 作者 | 联系方式 |
|---|---|
| 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、提高代码的可复用性;粒…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
