深圳网站建设网站制作,大连建设工程,网络公司排名,wordpress linux 中文清洁机器人规划控制方案
作者联系方式Forrest709335543qq.com 文章目录 清洁机器人规划控制方案方案简介方案设计模块链路坐标变换算法框架 功能设计定点自主导航固定路线清洁区域覆盖清洁贴边沿墙清洁自主返航回充 仿真测试仿真测试准备定点自主导航测试固定路线清洁测试区域…清洁机器人规划控制方案
作者联系方式Forrest709335543qq.com 文章目录 清洁机器人规划控制方案方案简介方案设计模块链路坐标变换算法框架 功能设计定点自主导航固定路线清洁区域覆盖清洁贴边沿墙清洁自主返航回充 仿真测试仿真测试准备定点自主导航测试固定路线清洁测试区域覆盖清洁测试贴边沿墙清洁测试 方案简介
室内商用扫地/洗地机器人规划控制PNC方案。有以下功能包组成
clean_msg功能消息定义clean_pnc规划控制算法clean_rvizrviz仿真测试插件
目前PNC方案支持以下功能
定点自主导航固定路线清洁区域覆盖清洁贴边沿墙清洁自主返航回充
PNC方案在满足清洁机器人常见场景需求除此之外还支持以下特性
断点续接清洁清洁区域补漏虚拟墙设置禁止清洁区域设置动/静态覆盖清洁设置左/右沿墙清扫设置动态调节速度根据距离障碍物远近调节清洁数据统计清洁轨迹、清洁率、面积、耗时等不同底盘形状碰撞支持扫地/洗地清洁设备控制支持…
方案设计
模块链路 #mermaid-svg-YjSob5NaZls3ANfe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YjSob5NaZls3ANfe .error-icon{fill:#552222;}#mermaid-svg-YjSob5NaZls3ANfe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YjSob5NaZls3ANfe .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-YjSob5NaZls3ANfe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YjSob5NaZls3ANfe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YjSob5NaZls3ANfe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YjSob5NaZls3ANfe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YjSob5NaZls3ANfe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YjSob5NaZls3ANfe .marker.cross{stroke:#333333;}#mermaid-svg-YjSob5NaZls3ANfe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YjSob5NaZls3ANfe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YjSob5NaZls3ANfe .cluster-label text{fill:#333;}#mermaid-svg-YjSob5NaZls3ANfe .cluster-label span{color:#333;}#mermaid-svg-YjSob5NaZls3ANfe .label text,#mermaid-svg-YjSob5NaZls3ANfe span{fill:#333;color:#333;}#mermaid-svg-YjSob5NaZls3ANfe .node rect,#mermaid-svg-YjSob5NaZls3ANfe .node circle,#mermaid-svg-YjSob5NaZls3ANfe .node ellipse,#mermaid-svg-YjSob5NaZls3ANfe .node polygon,#mermaid-svg-YjSob5NaZls3ANfe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YjSob5NaZls3ANfe .node .label{text-align:center;}#mermaid-svg-YjSob5NaZls3ANfe .node.clickable{cursor:pointer;}#mermaid-svg-YjSob5NaZls3ANfe .arrowheadPath{fill:#333333;}#mermaid-svg-YjSob5NaZls3ANfe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YjSob5NaZls3ANfe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YjSob5NaZls3ANfe .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-YjSob5NaZls3ANfe .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-YjSob5NaZls3ANfe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YjSob5NaZls3ANfe .cluster text{fill:#333;}#mermaid-svg-YjSob5NaZls3ANfe .cluster span{color:#333;}#mermaid-svg-YjSob5NaZls3ANfe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YjSob5NaZls3ANfe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} lidar/camera/odom lidar/camera/odom robot pose clean task clean report ctrl vel clean ctrl sensor localization pnc map application robot PNC模块相关输出/输出关系如上图所示
输入 传感器数据、如lidar、camera等定位位姿地图数据TF变化 输出 机器人控制指令清洁设备控制指令清洁任务数据如状态、报告等
坐标变换
整体方案运行需要相关TF支持相关TF关系定义如下 #mermaid-svg-XvnvIupr1fEVtkCN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .error-icon{fill:#552222;}#mermaid-svg-XvnvIupr1fEVtkCN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XvnvIupr1fEVtkCN .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-XvnvIupr1fEVtkCN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XvnvIupr1fEVtkCN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XvnvIupr1fEVtkCN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XvnvIupr1fEVtkCN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XvnvIupr1fEVtkCN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XvnvIupr1fEVtkCN .marker.cross{stroke:#333333;}#mermaid-svg-XvnvIupr1fEVtkCN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XvnvIupr1fEVtkCN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .cluster-label text{fill:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .cluster-label span{color:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .label text,#mermaid-svg-XvnvIupr1fEVtkCN span{fill:#333;color:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .node rect,#mermaid-svg-XvnvIupr1fEVtkCN .node circle,#mermaid-svg-XvnvIupr1fEVtkCN .node ellipse,#mermaid-svg-XvnvIupr1fEVtkCN .node polygon,#mermaid-svg-XvnvIupr1fEVtkCN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XvnvIupr1fEVtkCN .node .label{text-align:center;}#mermaid-svg-XvnvIupr1fEVtkCN .node.clickable{cursor:pointer;}#mermaid-svg-XvnvIupr1fEVtkCN .arrowheadPath{fill:#333333;}#mermaid-svg-XvnvIupr1fEVtkCN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XvnvIupr1fEVtkCN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XvnvIupr1fEVtkCN .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-XvnvIupr1fEVtkCN .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-XvnvIupr1fEVtkCN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XvnvIupr1fEVtkCN .cluster text{fill:#333;}#mermaid-svg-XvnvIupr1fEVtkCN .cluster span{color:#333;}#mermaid-svg-XvnvIupr1fEVtkCN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XvnvIupr1fEVtkCN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 10hz mapping or lolicazation module 30hz chassis module 30hz static tf 30hz static tf 30hz static tf 30hz static tf map odom odom_link base_link lidar camera imu 注意这里引入odom_linkframe主要是有些底盘运动电机没有安装在底盘中心 算法框架 #mermaid-svg-XdGaDDgDSSIA3bjx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .error-icon{fill:#552222;}#mermaid-svg-XdGaDDgDSSIA3bjx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XdGaDDgDSSIA3bjx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-XdGaDDgDSSIA3bjx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XdGaDDgDSSIA3bjx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XdGaDDgDSSIA3bjx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XdGaDDgDSSIA3bjx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XdGaDDgDSSIA3bjx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XdGaDDgDSSIA3bjx .marker.cross{stroke:#333333;}#mermaid-svg-XdGaDDgDSSIA3bjx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XdGaDDgDSSIA3bjx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .cluster-label text{fill:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .cluster-label span{color:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .label text,#mermaid-svg-XdGaDDgDSSIA3bjx span{fill:#333;color:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .node rect,#mermaid-svg-XdGaDDgDSSIA3bjx .node circle,#mermaid-svg-XdGaDDgDSSIA3bjx .node ellipse,#mermaid-svg-XdGaDDgDSSIA3bjx .node polygon,#mermaid-svg-XdGaDDgDSSIA3bjx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XdGaDDgDSSIA3bjx .node .label{text-align:center;}#mermaid-svg-XdGaDDgDSSIA3bjx .node.clickable{cursor:pointer;}#mermaid-svg-XdGaDDgDSSIA3bjx .arrowheadPath{fill:#333333;}#mermaid-svg-XdGaDDgDSSIA3bjx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XdGaDDgDSSIA3bjx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XdGaDDgDSSIA3bjx .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-XdGaDDgDSSIA3bjx .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-XdGaDDgDSSIA3bjx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XdGaDDgDSSIA3bjx .cluster text{fill:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx .cluster span{color:#333;}#mermaid-svg-XdGaDDgDSSIA3bjx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XdGaDDgDSSIA3bjx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} tasker task pnc task_manager decider global_plan_decider local_plan_decider path_follow_decider planner astar_path_planner dwa_path_planner clean_path_planner contours_path_planner planners deciders navi_logic pose_navigator path_follower area_cleaner wall_follower auto_charger clean_system sweep_clean_system wash_clean_system function_map forbidden_clean_area task_cleaned_area cost_map footprint_model global_cost_map local_cost_map task_list clean_tasks 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_plannerA*全局路径规划算法。用于A到B点路径生成dwa_path_plannerDWA局部路径规划算法。用于路径跟踪。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进行调用逻辑组合从而实现对应功能。 cost_map代价地图。用于障碍物碰撞检测。 footprint_model机器人碰撞模型描述。可根据机器人形状进行定义。global_cost_map全局代价地图。可用于全局规划路径和清洁规划路径生成。local_cost_map局部代价地图。可用于局部规划路径生成。 fuction_map功能地图。用于相关清洁功能实现比如禁止清洁区域。 forbidden_clean_area禁止清洁区域。限定清洁环境中某些区域只允许经过不可以清洁。task_cleaned_area已清洁区域。用于清洁任务中已经清洁区域统计生成相关清洁报告。 clean_system清洁设备控制器。用于扫地/洗地清洁设备开关控制。
功能设计
定点自主导航
定点自主导航任务可实现A到B点功能。功能设计如下图所示 #mermaid-svg-Hcxp1nR8rkwRhjnS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .error-icon{fill:#552222;}#mermaid-svg-Hcxp1nR8rkwRhjnS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Hcxp1nR8rkwRhjnS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .marker.cross{stroke:#333333;}#mermaid-svg-Hcxp1nR8rkwRhjnS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .cluster-label text{fill:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .cluster-label span{color:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .label text,#mermaid-svg-Hcxp1nR8rkwRhjnS span{fill:#333;color:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .node rect,#mermaid-svg-Hcxp1nR8rkwRhjnS .node circle,#mermaid-svg-Hcxp1nR8rkwRhjnS .node ellipse,#mermaid-svg-Hcxp1nR8rkwRhjnS .node polygon,#mermaid-svg-Hcxp1nR8rkwRhjnS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .node .label{text-align:center;}#mermaid-svg-Hcxp1nR8rkwRhjnS .node.clickable{cursor:pointer;}#mermaid-svg-Hcxp1nR8rkwRhjnS .arrowheadPath{fill:#333333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Hcxp1nR8rkwRhjnS .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Hcxp1nR8rkwRhjnS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Hcxp1nR8rkwRhjnS .cluster text{fill:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS .cluster span{color:#333;}#mermaid-svg-Hcxp1nR8rkwRhjnS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Hcxp1nR8rkwRhjnS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} pose_navigator pnc task_manager decider global_plan_decider local_plan_decider planner astar_path_planner dwa_path_planner planners deciders navi_logic navi_goal cost_map clean_task 由astar_path_planner生成机器人当前位置到导航目标点全局路径。得到全局路径后dwa_path_planner则进行跟踪控制。在导航过程中global_plan_decider会判断全局路径可达性如果当前全局路径不可达则重新进行全局路径规划。在导航过程中local_plan_decider会根据dwa_path_planner规划状态进行局部路径规划失败处理。
固定路线清洁
固定路线清洁任务可用于预定义路线清洁。功能设计如下图所示 #mermaid-svg-DpwTsDQ7jxMdPUud {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .error-icon{fill:#552222;}#mermaid-svg-DpwTsDQ7jxMdPUud .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DpwTsDQ7jxMdPUud .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DpwTsDQ7jxMdPUud .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DpwTsDQ7jxMdPUud .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DpwTsDQ7jxMdPUud .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DpwTsDQ7jxMdPUud .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DpwTsDQ7jxMdPUud .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DpwTsDQ7jxMdPUud .marker.cross{stroke:#333333;}#mermaid-svg-DpwTsDQ7jxMdPUud svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DpwTsDQ7jxMdPUud .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .cluster-label text{fill:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .cluster-label span{color:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .label text,#mermaid-svg-DpwTsDQ7jxMdPUud span{fill:#333;color:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .node rect,#mermaid-svg-DpwTsDQ7jxMdPUud .node circle,#mermaid-svg-DpwTsDQ7jxMdPUud .node ellipse,#mermaid-svg-DpwTsDQ7jxMdPUud .node polygon,#mermaid-svg-DpwTsDQ7jxMdPUud .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DpwTsDQ7jxMdPUud .node .label{text-align:center;}#mermaid-svg-DpwTsDQ7jxMdPUud .node.clickable{cursor:pointer;}#mermaid-svg-DpwTsDQ7jxMdPUud .arrowheadPath{fill:#333333;}#mermaid-svg-DpwTsDQ7jxMdPUud .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DpwTsDQ7jxMdPUud .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DpwTsDQ7jxMdPUud .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-DpwTsDQ7jxMdPUud .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-DpwTsDQ7jxMdPUud .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DpwTsDQ7jxMdPUud .cluster text{fill:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud .cluster span{color:#333;}#mermaid-svg-DpwTsDQ7jxMdPUud div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DpwTsDQ7jxMdPUud :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} path_follower pnc task_manager decider global_plan_decider local_plan_decider path_follow_decider planner astar_path_planner dwa_path_planner planners deciders navi_logic clean_path cost_map function_map clean_system clean_task 首先机器人会根据pose_navigator一样的逻辑导航到离清洁路线最近点然后开始清洁路线跟踪。清洁路线跟踪使用dwa_path_planner。在开始清洁路线跟踪后path_follow_decider判断跟踪路线是否需要停障。 如果遇到障碍物则进行停障等待。停障等待超时后进行绕障继续跟踪清洁路线。 在清洁路线跟踪过程中local_plan_decider会根据dwa_path_planner规划状态进行局部路径规划失败处理。
区域覆盖清洁
区域覆盖清洁任务可用于固定区域覆盖式清洁。功能设计如下图所示 #mermaid-svg-13O8NgbJwXTrlvFy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .error-icon{fill:#552222;}#mermaid-svg-13O8NgbJwXTrlvFy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-13O8NgbJwXTrlvFy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-13O8NgbJwXTrlvFy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-13O8NgbJwXTrlvFy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-13O8NgbJwXTrlvFy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-13O8NgbJwXTrlvFy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-13O8NgbJwXTrlvFy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-13O8NgbJwXTrlvFy .marker.cross{stroke:#333333;}#mermaid-svg-13O8NgbJwXTrlvFy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-13O8NgbJwXTrlvFy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .cluster-label text{fill:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .cluster-label span{color:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .label text,#mermaid-svg-13O8NgbJwXTrlvFy span{fill:#333;color:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .node rect,#mermaid-svg-13O8NgbJwXTrlvFy .node circle,#mermaid-svg-13O8NgbJwXTrlvFy .node ellipse,#mermaid-svg-13O8NgbJwXTrlvFy .node polygon,#mermaid-svg-13O8NgbJwXTrlvFy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-13O8NgbJwXTrlvFy .node .label{text-align:center;}#mermaid-svg-13O8NgbJwXTrlvFy .node.clickable{cursor:pointer;}#mermaid-svg-13O8NgbJwXTrlvFy .arrowheadPath{fill:#333333;}#mermaid-svg-13O8NgbJwXTrlvFy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-13O8NgbJwXTrlvFy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-13O8NgbJwXTrlvFy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-13O8NgbJwXTrlvFy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-13O8NgbJwXTrlvFy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-13O8NgbJwXTrlvFy .cluster text{fill:#333;}#mermaid-svg-13O8NgbJwXTrlvFy .cluster span{color:#333;}#mermaid-svg-13O8NgbJwXTrlvFy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-13O8NgbJwXTrlvFy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} area_cleaner pnc task_manager decider global_plan_decider local_plan_decider path_follow_decider planner astar_path_planner dwa_path_planner clean_path_planner planners deciders navi_logic clean_zone cost_map function_map clean_system clean_task 首先机器人会根据pose_navigator一样的逻辑导航到离清洁区域内最近点。到达清洁区域内后使用clean_path_planner进行清洁路线覆盖规划并进行跟踪。清洁路线跟踪使用dwa_path_planner。在开始清洁路线跟踪后path_follow_decider判断跟踪路线是否需要停障 如果遇到障碍物则进行停障等待停障等待超时后进行绕障继续跟踪清洁路线 在清洁路线跟踪过程中local_plan_decider会根据dwa_path_planner规划状态进行局部路径规划失败处理。
贴边沿墙清洁
贴边沿墙清洁任务可用于沿墙贴边清洁。功能设计如下图所示 #mermaid-svg-M2rXHb6ZkS7DWYNk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .error-icon{fill:#552222;}#mermaid-svg-M2rXHb6ZkS7DWYNk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M2rXHb6ZkS7DWYNk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .marker.cross{stroke:#333333;}#mermaid-svg-M2rXHb6ZkS7DWYNk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .cluster-label text{fill:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .cluster-label span{color:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .label text,#mermaid-svg-M2rXHb6ZkS7DWYNk span{fill:#333;color:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .node rect,#mermaid-svg-M2rXHb6ZkS7DWYNk .node circle,#mermaid-svg-M2rXHb6ZkS7DWYNk .node ellipse,#mermaid-svg-M2rXHb6ZkS7DWYNk .node polygon,#mermaid-svg-M2rXHb6ZkS7DWYNk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .node .label{text-align:center;}#mermaid-svg-M2rXHb6ZkS7DWYNk .node.clickable{cursor:pointer;}#mermaid-svg-M2rXHb6ZkS7DWYNk .arrowheadPath{fill:#333333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-M2rXHb6ZkS7DWYNk .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-M2rXHb6ZkS7DWYNk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-M2rXHb6ZkS7DWYNk .cluster text{fill:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk .cluster span{color:#333;}#mermaid-svg-M2rXHb6ZkS7DWYNk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-M2rXHb6ZkS7DWYNk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} wall_follower pnc task_manager decider global_plan_decider local_plan_decider planner astar_path_planner dwa_path_planner contours_path_planner planners deciders navi_logic along_wall_path cost_map function_map clean_system clean_task 首先机器人会根据pose_navigator一样的逻辑导航到离沿墙清洁路径上最近点。到达最近后使用contours_path_planner进行沿墙清洁路径规划并进行跟踪。沿墙清洁路线跟踪使用dwa_path_planner。在清洁路线跟踪过程中local_plan_decider会根据dwa_path_planner规划状态进行局部路径规划失败处理。
自主返航回充
自主返航回充任务机器人低电量时自主返航回充。功能设计如下图所示 #mermaid-svg-DAZKMntAIu3U1JXx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .error-icon{fill:#552222;}#mermaid-svg-DAZKMntAIu3U1JXx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DAZKMntAIu3U1JXx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DAZKMntAIu3U1JXx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DAZKMntAIu3U1JXx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DAZKMntAIu3U1JXx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DAZKMntAIu3U1JXx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DAZKMntAIu3U1JXx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DAZKMntAIu3U1JXx .marker.cross{stroke:#333333;}#mermaid-svg-DAZKMntAIu3U1JXx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DAZKMntAIu3U1JXx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .cluster-label text{fill:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .cluster-label span{color:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .label text,#mermaid-svg-DAZKMntAIu3U1JXx span{fill:#333;color:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .node rect,#mermaid-svg-DAZKMntAIu3U1JXx .node circle,#mermaid-svg-DAZKMntAIu3U1JXx .node ellipse,#mermaid-svg-DAZKMntAIu3U1JXx .node polygon,#mermaid-svg-DAZKMntAIu3U1JXx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DAZKMntAIu3U1JXx .node .label{text-align:center;}#mermaid-svg-DAZKMntAIu3U1JXx .node.clickable{cursor:pointer;}#mermaid-svg-DAZKMntAIu3U1JXx .arrowheadPath{fill:#333333;}#mermaid-svg-DAZKMntAIu3U1JXx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DAZKMntAIu3U1JXx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DAZKMntAIu3U1JXx .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-DAZKMntAIu3U1JXx .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-DAZKMntAIu3U1JXx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DAZKMntAIu3U1JXx .cluster text{fill:#333;}#mermaid-svg-DAZKMntAIu3U1JXx .cluster span{color:#333;}#mermaid-svg-DAZKMntAIu3U1JXx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DAZKMntAIu3U1JXx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} auto_charger pnc task_manager decider global_plan_decider local_plan_decider planner astar_path_planner dwa_path_planner planners deciders navi_logic navi_goal cost_map clean_task 首先机器人会根据pose_navigator一样的逻辑导航到充电桩前方位置。然后进行充电桩对接控制。
仿真测试
功能仿真测试视频: 清洁机器人PNC方案演示 仿真测试准备 安装部署好工程 仿真地图确认仿真地图放在cleanbot/clean_pnc/data/map目录下目前该目录下有测试地图demo如果想更换地图可按如下步骤 将要更换的地图放到cleanbot/clean_pnc/data/map目录下 更改仿真器中cleanbot/clean_pnc/launch/pnc_simulator.launch的test_map_name参数 launchnode nameclean_pnc_simulator pkgclean_pnc typeclean_pnc_simulator outputscreenparam namemap_file_dir value$(find clean_pnc)/data/map//param nametest_map_name valuedemo//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按钮在地图上相应位置进行障碍物设置 注意任务完成后机器人会主动导航返回任务起始点