欢迎光临
我们一直在努力

智能产品系统架构分析 - 扫地机器人架构分层

方向:方案分析、架构设计、模块分解

智能产品系统架构分析:扫地机器人架构分层

分析扫地机器人系统架构,分层解析,从硬件到云端,结合实例(如扫地机器人从充电座出发,清扫客厅,避障,返回充电)。

扫地机器人系统架构设计文档

1. 概述

扫地机器人是一种自主移动的智能家电,能够规划路径、清扫地面、避开障碍物并自动回充。本文从方案分析、架构设计、模块分解三个维度,对扫地机器人进行分层架构解析,并以“用户通过App启动清扫,机器人从充电座出发,遍历客厅,避开拖鞋和桌腿,清扫完毕返回充电座”为例,贯穿说明系统协作机理。

2. 系统分层架构总览

扫地机器人采用五层架构(从下至上),强调实时性、环境感知与运动控制:

层次名称职责实例对应
L1 硬件层 传感器(激光雷达/陀螺仪/轮速计/碰撞/悬崖/地检)、电机、电池、MCU 激光雷达扫描客厅轮廓
L2 驱动与RTOS层 传感器驱动、电机驱动、RTOS任务调度、中断管理 读取轮速计数据,控制左右轮PWM
L3 感知与数据融合层 传感器数据滤波、里程计推算、激光SLAM、悬崖/碰撞检测 构建局部地图,识别前方障碍物
L4 决策与规划层 全局路径规划(弓字清扫)、局部避障、回充决策、状态机 决定“沿墙走”还是“弓字移动”
L5 交互与云端层 App通信、语音播报、云端地图保存、OTA升级 App显示清扫路径,远程启动

高端扫地机器人将SLAM和路径规划放在本地高性能SoC(如Rockchip RK3399),低端方案使用MCU+硬核SLAM。

3. 交互实例(按层动线)

场景:用户手机App点击“全屋清扫”,机器人从基站出发,清扫客厅,过程中避开拖鞋和桌腿,清扫完毕自动返回充电座。

3.1 启动与定位

  • 硬件层:激光雷达开始旋转发射红外激光,电机驱动轮子。
  • 驱动层:PWM驱动左右轮,编码器中断记录轮子圈数。
  • 感知层:
    • 激光雷达数据经滤波后输入SLAM,结合轮速计进行位姿估计。
    • 从充电座红外定位信号确认初始位姿为(0,0,0)。
  • 决策层:状态机从“待机”切换至“清扫”,调用全局规划模块生成覆盖客厅的弓字路线。
  • 3.2 正常清扫(弓字移动)

    • 机器人向前移动,同时激光雷达连续扫描。感知层实时检测前方是否有障碍物。
    • 遇到一面墙:决策层根据激光数据判断距离<阈值,触发“沿墙行为”,转90度后继续弓字。
    • 覆盖客厅后,根据SLAM判断剩余未覆盖区域,若无则清扫结束。

    3.3 动态避障(拖鞋)

    • 感知层:激光雷达检测到地面突然出现的低矮障碍物(拖鞋,高度3cm,激光可能无法稳定识别),但前置红外传感器或视觉传感器(如果有)捕捉到。
    • 决策层:局部避障模块计算绕行方向,降速并规划绕过拖鞋的局部路径(使用动态窗口法DWA)。
    • 绕过后果执行原弓字路径。

    3.4 返回充电座

    • 清扫完成:决策层发出回充指令。
    • 感知层开启红外定位传感器(充电座发送360°红外信号),引导机器人接近。
    • 到达充电座接触电极后,硬件检测到充电电压,状态机切换至“充电”。

    4. 详细模块分解与职责

    4.1 硬件抽象层 (HAL)

    模块功能常用芯片/接口
    LaserDriver 控制激光雷达旋转和采集 RPLIDAR A1,串口输出距离帧
    IMUDriver 读取陀螺仪/加速度计 MPU6050,I2C
    WheelEncoder 轮子里程计计数 霍尔编码器,GPIO中断
    MotorDriver 左右轮和边刷电机PWM控制 DRV8848,定时器PWM
    BumperDriver 碰撞开关检测 机械微动开关,GPIO输入
    CliffDriver 悬崖传感器(红外对管) GP2Y0A21,ADC
    BatteryDriver 电量监测 ADC分压
    ChargingDriver 充电座红外接收与充电触点检测 红外接收管,ADC

    4.2 感知与数据融合层

    • 里程计推算:根据左右轮编码器积分计算位姿 (x, y, theta)。
    • 激光数据预处理:过滤异常点(过近/过远),去除离群值。
    • SLAM前端:基于Gmapping或Cartographer进行扫描匹配,估计机器人位姿。
    • 悬崖/碰撞检测:中断优先级高,一旦触发立即执行紧急制动,避免跌落。
    • 传感器融合:扩展卡尔曼滤波(EKF)融合里程计、IMU和激光数据,提升定位鲁棒性。

    4.3 决策与规划层

    模块算法说明
    全局路径规划 BFS/覆盖路径规划(CCPP) 基于栅格地图,生成最短全覆盖路线(弓字+沿边)
    局部避障 动态窗口法(DWA) 或 TEB 在地图已知但局部有动态/未知障碍时重新规划局部轨迹
    状态机 有限状态机(FSM) 待机→清扫→回充→充电→待机,细分沿墙、脱困等子状态
    脱困策略 旋转+后退+随机移动 当碰撞传感器持续触发或轮子打滑时进入脱困模式
    回充导航 红外信标引导+SLAM定位 先回到已知充电座附近区域,再通过红外引导精确对接

    4.4 通信与交互层

    • Wi-Fi/BLE:ESP8266/ESP32的Wi-Fi模块连接路由器,实现App远程控制。
    • MQTT协议:与云端交互,上报状态、接收指令(开始清扫、回充)。
    • App协议:自定义二进制协议或JSON,包含地图数据、清扫进度。
    • OTA升级:通过HTTP下载固件,双分区切换。

    4.5 云端服务

    服务功能
    设备管理 用户与机器人绑定、设备在线状态
    地图存储 机器人生成的栅格地图上传,多楼层管理
    清扫记录 存储每次清扫的时长、面积、耗电
    远程控制 转发App指令到机器人
    数据分析 统计清扫覆盖率、故障预警

    5. UML建模(Mermaid)

    5.1 分层组件图

    #mermaid-svg-O99WR0IjXfdQv40D{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-O99WR0IjXfdQv40D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-O99WR0IjXfdQv40D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-O99WR0IjXfdQv40D .error-icon{fill:#552222;}#mermaid-svg-O99WR0IjXfdQv40D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-O99WR0IjXfdQv40D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-O99WR0IjXfdQv40D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-O99WR0IjXfdQv40D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-O99WR0IjXfdQv40D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-O99WR0IjXfdQv40D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-O99WR0IjXfdQv40D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-O99WR0IjXfdQv40D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-O99WR0IjXfdQv40D .marker.cross{stroke:#333333;}#mermaid-svg-O99WR0IjXfdQv40D svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-O99WR0IjXfdQv40D p{margin:0;}#mermaid-svg-O99WR0IjXfdQv40D .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-O99WR0IjXfdQv40D .cluster-label text{fill:#333;}#mermaid-svg-O99WR0IjXfdQv40D .cluster-label span{color:#333;}#mermaid-svg-O99WR0IjXfdQv40D .cluster-label span p{background-color:transparent;}#mermaid-svg-O99WR0IjXfdQv40D .label text,#mermaid-svg-O99WR0IjXfdQv40D span{fill:#333;color:#333;}#mermaid-svg-O99WR0IjXfdQv40D .node rect,#mermaid-svg-O99WR0IjXfdQv40D .node circle,#mermaid-svg-O99WR0IjXfdQv40D .node ellipse,#mermaid-svg-O99WR0IjXfdQv40D .node polygon,#mermaid-svg-O99WR0IjXfdQv40D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-O99WR0IjXfdQv40D .rough-node .label text,#mermaid-svg-O99WR0IjXfdQv40D .node .label text,#mermaid-svg-O99WR0IjXfdQv40D .image-shape .label,#mermaid-svg-O99WR0IjXfdQv40D .icon-shape .label{text-anchor:middle;}#mermaid-svg-O99WR0IjXfdQv40D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-O99WR0IjXfdQv40D .rough-node .label,#mermaid-svg-O99WR0IjXfdQv40D .node .label,#mermaid-svg-O99WR0IjXfdQv40D .image-shape .label,#mermaid-svg-O99WR0IjXfdQv40D .icon-shape .label{text-align:center;}#mermaid-svg-O99WR0IjXfdQv40D .node.clickable{cursor:pointer;}#mermaid-svg-O99WR0IjXfdQv40D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-O99WR0IjXfdQv40D .arrowheadPath{fill:#333333;}#mermaid-svg-O99WR0IjXfdQv40D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-O99WR0IjXfdQv40D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-O99WR0IjXfdQv40D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O99WR0IjXfdQv40D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-O99WR0IjXfdQv40D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O99WR0IjXfdQv40D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-O99WR0IjXfdQv40D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-O99WR0IjXfdQv40D .cluster text{fill:#333;}#mermaid-svg-O99WR0IjXfdQv40D .cluster span{color:#333;}#mermaid-svg-O99WR0IjXfdQv40D 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-O99WR0IjXfdQv40D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-O99WR0IjXfdQv40D rect.text{fill:none;stroke-width:0;}#mermaid-svg-O99WR0IjXfdQv40D .icon-shape,#mermaid-svg-O99WR0IjXfdQv40D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O99WR0IjXfdQv40D .icon-shape p,#mermaid-svg-O99WR0IjXfdQv40D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-O99WR0IjXfdQv40D .icon-shape .label rect,#mermaid-svg-O99WR0IjXfdQv40D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O99WR0IjXfdQv40D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-O99WR0IjXfdQv40D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-O99WR0IjXfdQv40D :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    扫地机器人设备

    云端

    设备影子

    地图库

    分析引擎

    手机App

    遥控界面

    地图显示

    云端同步

    决策规划层

    全局规划器

    局部避障

    状态机

    脱困模块

    回充控制器

    硬件层

    驱动层

    感知层

    通信层

    5.2 清扫任务序列图(局部避障)

    Motors感知层局部避障全局规划器状态机通信层AppMotors感知层局部避障全局规划器状态机通信层App#mermaid-svg-dTeE2v9ng3HNCgln{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dTeE2v9ng3HNCgln .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dTeE2v9ng3HNCgln .error-icon{fill:#552222;}#mermaid-svg-dTeE2v9ng3HNCgln .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dTeE2v9ng3HNCgln .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dTeE2v9ng3HNCgln .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dTeE2v9ng3HNCgln .marker.cross{stroke:#333333;}#mermaid-svg-dTeE2v9ng3HNCgln svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dTeE2v9ng3HNCgln p{margin:0;}#mermaid-svg-dTeE2v9ng3HNCgln .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTeE2v9ng3HNCgln text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-dTeE2v9ng3HNCgln .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dTeE2v9ng3HNCgln .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-dTeE2v9ng3HNCgln .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-dTeE2v9ng3HNCgln .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-dTeE2v9ng3HNCgln #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-dTeE2v9ng3HNCgln .sequenceNumber{fill:white;}#mermaid-svg-dTeE2v9ng3HNCgln #sequencenumber{fill:#333;}#mermaid-svg-dTeE2v9ng3HNCgln #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-dTeE2v9ng3HNCgln .messageText{fill:#333;stroke:none;}#mermaid-svg-dTeE2v9ng3HNCgln .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTeE2v9ng3HNCgln .labelText,#mermaid-svg-dTeE2v9ng3HNCgln .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-dTeE2v9ng3HNCgln .loopText,#mermaid-svg-dTeE2v9ng3HNCgln .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-dTeE2v9ng3HNCgln .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dTeE2v9ng3HNCgln .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-dTeE2v9ng3HNCgln .noteText,#mermaid-svg-dTeE2v9ng3HNCgln .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-dTeE2v9ng3HNCgln .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTeE2v9ng3HNCgln .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTeE2v9ng3HNCgln .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTeE2v9ng3HNCgln .actorPopupMenu{position:absolute;}#mermaid-svg-dTeE2v9ng3HNCgln .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-dTeE2v9ng3HNCgln .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTeE2v9ng3HNCgln .actor-man circle,#mermaid-svg-dTeE2v9ng3HNCgln line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-dTeE2v9ng3HNCgln :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}alt[检测到障碍物]loop[每100ms]loop[每个路径段]开始清扫指令启动清扫生成弓字路径路径点列表发送目标点当前位姿+激光数据DWA计算速度指令左右轮PWM新障碍物重新规划局部路径绕行速度清扫完成,进入回充

    5.3 SLAM与建图序列图

    Planner栅格地图SLAM里程计LaserPlanner栅格地图SLAM里程计Laser#mermaid-svg-SSQKJE9Bux8uCY5l{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SSQKJE9Bux8uCY5l .error-icon{fill:#552222;}#mermaid-svg-SSQKJE9Bux8uCY5l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SSQKJE9Bux8uCY5l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SSQKJE9Bux8uCY5l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SSQKJE9Bux8uCY5l .marker.cross{stroke:#333333;}#mermaid-svg-SSQKJE9Bux8uCY5l svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SSQKJE9Bux8uCY5l p{margin:0;}#mermaid-svg-SSQKJE9Bux8uCY5l .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SSQKJE9Bux8uCY5l text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SSQKJE9Bux8uCY5l .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-SSQKJE9Bux8uCY5l .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-SSQKJE9Bux8uCY5l #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-SSQKJE9Bux8uCY5l .sequenceNumber{fill:white;}#mermaid-svg-SSQKJE9Bux8uCY5l #sequencenumber{fill:#333;}#mermaid-svg-SSQKJE9Bux8uCY5l #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-SSQKJE9Bux8uCY5l .messageText{fill:#333;stroke:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SSQKJE9Bux8uCY5l .labelText,#mermaid-svg-SSQKJE9Bux8uCY5l .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .loopText,#mermaid-svg-SSQKJE9Bux8uCY5l .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-SSQKJE9Bux8uCY5l .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-SSQKJE9Bux8uCY5l .noteText,#mermaid-svg-SSQKJE9Bux8uCY5l .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-SSQKJE9Bux8uCY5l .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SSQKJE9Bux8uCY5l .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SSQKJE9Bux8uCY5l .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-SSQKJE9Bux8uCY5l .actorPopupMenu{position:absolute;}#mermaid-svg-SSQKJE9Bux8uCY5l .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-SSQKJE9Bux8uCY5l .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-SSQKJE9Bux8uCY5l .actor-man circle,#mermaid-svg-SSQKJE9Bux8uCY5l line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-SSQKJE9Bux8uCY5l :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}loop[每帧激光]距离点云里程计增量扫描匹配 + 图优化更新占用栅格触发重规划(若地图变化)

    5.4 部署架构图

    #mermaid-svg-w35MX8yxzSIDpyA0{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w35MX8yxzSIDpyA0 .error-icon{fill:#552222;}#mermaid-svg-w35MX8yxzSIDpyA0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w35MX8yxzSIDpyA0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w35MX8yxzSIDpyA0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w35MX8yxzSIDpyA0 .marker.cross{stroke:#333333;}#mermaid-svg-w35MX8yxzSIDpyA0 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w35MX8yxzSIDpyA0 p{margin:0;}#mermaid-svg-w35MX8yxzSIDpyA0 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster-label text{fill:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster-label span{color:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster-label span p{background-color:transparent;}#mermaid-svg-w35MX8yxzSIDpyA0 .label text,#mermaid-svg-w35MX8yxzSIDpyA0 span{fill:#333;color:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 .node rect,#mermaid-svg-w35MX8yxzSIDpyA0 .node circle,#mermaid-svg-w35MX8yxzSIDpyA0 .node ellipse,#mermaid-svg-w35MX8yxzSIDpyA0 .node polygon,#mermaid-svg-w35MX8yxzSIDpyA0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-w35MX8yxzSIDpyA0 .rough-node .label text,#mermaid-svg-w35MX8yxzSIDpyA0 .node .label text,#mermaid-svg-w35MX8yxzSIDpyA0 .image-shape .label,#mermaid-svg-w35MX8yxzSIDpyA0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-w35MX8yxzSIDpyA0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-w35MX8yxzSIDpyA0 .rough-node .label,#mermaid-svg-w35MX8yxzSIDpyA0 .node .label,#mermaid-svg-w35MX8yxzSIDpyA0 .image-shape .label,#mermaid-svg-w35MX8yxzSIDpyA0 .icon-shape .label{text-align:center;}#mermaid-svg-w35MX8yxzSIDpyA0 .node.clickable{cursor:pointer;}#mermaid-svg-w35MX8yxzSIDpyA0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-w35MX8yxzSIDpyA0 .arrowheadPath{fill:#333333;}#mermaid-svg-w35MX8yxzSIDpyA0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-w35MX8yxzSIDpyA0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-w35MX8yxzSIDpyA0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w35MX8yxzSIDpyA0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-w35MX8yxzSIDpyA0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w35MX8yxzSIDpyA0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster text{fill:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 .cluster span{color:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 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-w35MX8yxzSIDpyA0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-w35MX8yxzSIDpyA0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-w35MX8yxzSIDpyA0 .icon-shape,#mermaid-svg-w35MX8yxzSIDpyA0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w35MX8yxzSIDpyA0 .icon-shape p,#mermaid-svg-w35MX8yxzSIDpyA0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-w35MX8yxzSIDpyA0 .icon-shape .label rect,#mermaid-svg-w35MX8yxzSIDpyA0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w35MX8yxzSIDpyA0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-w35MX8yxzSIDpyA0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-w35MX8yxzSIDpyA0 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    用户终端

    云端

    家庭网络

    机器人本体

    STM32F407实时控制

    RK3399SLAM+规划

    Wi-Fi模块

    传感器组

    电机驱动

    无线路由器

    MQTT Broker

    API Gateway

    地图数据库

    手机App

    6. 项目文件结构组织

    扫地机器人固件复杂,通常分为底层MCU实时控制、上层SoC规划与感知、云端三部分。

    robot_vacuum/
    ├── docs/
    │ ├── architecture/
    │ │ ├── adr/ # 架构决策
    │ │ └── uml/ # Mermaid源文件
    │ ├── protocol/ # 通信协议(MQTT topic定义)
    │ └── algorithm/ # 算法设计文档
    ├── firmware/ # 嵌入式软件
    │ ├── mcu/ # STM32实时控制
    │ │ ├── hal/ # 硬件抽象
    │ │ │ ├── laser.c # 激光雷达驱动
    │ │ │ ├── motor.c # PID电机控制
    │ │ │ ├── imu.c
    │ │ │ ├── bumper.c
    │ │ │ └── cliff.c
    │ │ ├── middleware/ # 实时服务
    │ │ │ ├── safety_monitor.c # 悬崖/碰撞紧急停车
    │ │ │ ├── odometry.c # 里程计推算
    │ │ │ └── power_manager.c
    │ │ └── app/ # 主逻辑
    │ │ ├── main.c # FreeRTOS入口
    │ │ ├── communication.c # 与SoC通信(UART/共享内存)
    │ │ └── emergency.c # 紧急处理
    │ ├── soc/ # 应用处理器(Linux/RK3399)
    │ │ ├── drivers/
    │ │ │ ├── laser_parser.py # 激光数据解析
    │ │ │ └── uart_bridge.py # 与MCU通信
    │ │ ├── slam/ # SLAM模块
    │ │ │ ├── cartographer/ # Google Cartographer
    │ │ │ └── ekf_localizer.py
    │ │ ├── planning/
    │ │ │ ├── global_planner.py # BFS全覆盖规划
    │ │ │ ├── local_planner.py # DWA避障
    │ │ │ └── state_machine.py # 状态机
    │ │ ├── interaction/
    │ │ │ ├── mqtt_client.py # 与云端通信
    │ │ │ ├── audio.py # 语音提示
    │ │ │ └── ota_updater.py
    │ │ └── main.py
    │ └── CMakeLists.txt
    ├── cloud/ # 云端服务
    │ ├── mqtt_broker/ # EMQX配置
    │ ├── device_api/ # Node.js Express
    │ │ ├── routes/ # /bind, /command, /map
    │ │ └── models/
    │ ├── map_storage/ # 地图文件存储(MinIO)
    │ └── analytics/ # 清扫数据分析(Python)
    ├── app/ # 手机App (Flutter/React Native)
    │ ├── lib/
    │ │ ├── pages/ # 主界面、地图视图
    │ │ ├── services/ # MQTT和REST调用
    │ │ └── widgets/ # 遥控按钮
    │ └── pubspec.yaml
    ├── test/
    │ ├── simulation/ # Gazebo仿真环境
    │ ├── unit/ # 单元测试
    │ └── integration/ # 硬件在环测试
    ├── tools/
    │ ├── calibration/ # 传感器标定工具
    │ ├── map_editor/ # 地图编辑合并工具
    │ └── log_analyzer/ # 机器人日志分析
    └── README.md

    7. 设计开发机理与方法

    7.1 核心设计原则

    • 实时性与安全性分离:底层MCU负责紧急制动、电机控制,确保即使在SoC死机时也能悬崖停车;上层SoC负责复杂计算,可允许短暂延迟。
    • 模块化SLAM:支持激光SLAM和视觉SLAM可选,便于不同硬件配置。
    • 覆盖路径规划优先:保证清扫覆盖率,避障时保证不重复走已经清扫的区域。
    • 回充策略冗余:结合全局地图位置和红外信标,双重确保回充成功率。

    7.2 开发步骤

    阶段任务产出
    1. 硬件选型与底盘测试 选择底盘电机、激光雷达、悬崖传感器,测试开环移动 底盘可前进后退转弯
    2. 底层MCU固件开发 实现电机PID控制、编码器读取、传感器中断处理,紧急停车逻辑 低层稳定,悬崖响应<50ms
    3. 感知与SLAM开发 移植Cartographer或Gmapping,调优激光数据和里程计融合 建图重叠误差<2cm
    4. 规划算法开发 实现弓字覆盖规划、DWA局部避障,在仿真中测试覆盖率 单房间覆盖率>98%
    5. 状态机与决策系统 编写FSM,处理清扫、沿墙、脱困、回充等状态 全流程自动完成
    6. 通信与远程控制 实现MQTT连接,App可发送开始/回充命令并接收地图 远程可靠控制
    7. 云端地图存储和OTA 实现楼层地图上传/下载,固件升级 多楼层管理可用
    8. 整机实测与优化 各种户型(家具、地毯、门槛)测试,优化脱困策略 清扫成功率>95%

    7.3 关键机理详解

    7.3.1 全覆盖路径规划(弓字+沿边)
    • 机理:将栅格地图划分为若干单元格,使用BFS生成一次遍历所有可达单元格的最短路径。
    • 方法:
    • 从起点开始,优先选择未清扫且方向为当前弓字方向的单元格。
    • 当遇到障碍或已清扫区域,进行“绕行”,然后回到弓字线。
    • 在清扫完一个区域的弓字后,转移至下一个未清扫区域(最短路径规划)。
    • 全程结束后自动沿墙一周,确保边缘清扫。
    7.3.2 动态窗口法(DWA)避障
    • 机理:在速度空间 (v, ω) 中采样多组线速度和角速度,模拟未来短时间内的轨迹,选择最优轨迹。
    • 方法:
    • 根据当前速度限制采样窗口。
    • 对每组速度模拟一条轨迹(考虑动力学约束)。
    • 评价函数 = 权重1×方位角接近目标点 + 权重2×与障碍物距离(鼓励远离) + 权重3×速度大小。
    • 选取最高分速度下发执行。
    7.3.3 悬崖检测实时保障
    • 机理:红外对管(发射接收),测量地面反射强度,当反射率极低即表示前方悬空。
    • 方法:
    • 硬件比较器输出数字信号(高于阈值则1,否则0),连接到MCU可屏蔽中断。
    • 软件中使用快速GPIO中断,优先级设置为最高。
    • 中断服务函数立即停止左右轮电机,并反向移动小段距离避免跌落。
    7.3.4 充电座红外引导
    • 机理:充电座发出360°红外调制信号,机器人后背装有红外接收器阵列(通常左右各一)。
    • 方法:
    • 机器人移动到充电座附近(根据SLAM已知坐标)。
    • 旋转自身搜索红外信标最强方向。
    • 对准后直行,同时检测充电触点电压;一旦检测到电压,停止移动并开始充电。

    8. 总结

    扫地机器人融合了实时控制、SLAM、路径规划和物联网通信等多种技术。本文呈现的五层架构清晰地划分了硬件驱动、感知融合、决策规划、通信交互和云端服务的职责,并通过具体实例展示了“用户远程启动→弓字清扫→动态避障→回充”的完整链路。

    开发此类产品时,最关键的是底层的安全性与高层的智能性协同:底层必须保证悬崖、碰撞等紧急情况能在数十毫秒内响应;上层则可利用强大算力实现稳健的SLAM和路径规划。本文提供的UML模型、项目结构和开发步骤可直接用于工程落地。

    赞(0)
    未经允许不得转载:171主机测评 » 智能产品系统架构分析 - 扫地机器人架构分层
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址