# 基于机器视觉的轮式机器人系统设计:三层模块落地方案 ## 1. 项目概述 ### 1.1 项目名称 **基于机器视觉的轮式机器人系统设计** 可选扩展题目: - 基于 ROS2 与机器视觉的轮式智能运输机器人系统设计 - 基于香橙派与多传感器融合的轮式机器人导航与视觉识别系统设计 - 面向室内物资运输任务的多智能体轮式机器人系统设计与实现 ### 1.2 项目目标 本项目设计一种面向室内物资运输场景的轮式智能机器人系统。系统以香橙派作为上位机主控平台,融合 Astra Pro 深度摄像头、N10 激光雷达、IMU 惯导传感器和轮式底盘,实现自主建图、定位导航、路径规划、避障移动、物体识别、人脸检测、语音交互和智能体任务调度等功能。 ### 1.3 现有硬件条件 | 硬件 | 用途 | |---|---| | 香橙派 | ROS2 主控平台,负责导航、视觉、语音、任务调度 | | Astra Pro 深度摄像头 | RGB 图像采集、深度测距、物体识别、人脸检测 | | N10 激光雷达 | 2D 建图、定位、避障 | | IMU 惯导 | 姿态检测、角速度/加速度采集、辅助定位 | | 轮式底盘 | 执行运动任务 | | 电机与编码器 | 实现轮速控制与里程计反馈 | | STM32/底盘控制板 | 电机 PID 控制、编码器读取、底盘执行层 | --- ## 2. 系统总体架构 系统采用三层架构: ```text ┌────────────────────────────────────┐ │ 智能任务调度层 │ │ Lobster Agent / Task Manager │ │ 语音理解、任务拆解、状态管理 │ └────────────────────────────────────┘ ↓ ┌────────────────────────────────────┐ │ ROS2 功能层 │ │ SLAM / Nav2 / Vision / Voice │ │ 建图、导航、识别、语音交互 │ └────────────────────────────────────┘ ↓ ┌────────────────────────────────────┐ │ 底盘控制层 │ │ 电机控制 / 编码器 / IMU / PID │ │ 控制每个轮子转速,反馈里程计 │ └────────────────────────────────────┘ ``` 硬件数据流如下: ```text 用户语音/任务指令 ↓ 麦克风/键盘输入 ↓ ┌──────────────────────────────────────────┐ │ 香橙派 Orange Pi │ │ │ │ Ubuntu 22.04 + ROS2 Humble │ │ ├── N10 雷达节点 │ │ ├── Astra Pro 摄像头节点 │ │ ├── IMU 节点 │ │ ├── slam_toolbox 建图节点 │ │ ├── Nav2 导航节点 │ │ ├── OpenCV/YOLO 视觉识别节点 │ │ ├── ASR/TTS 语音交互节点 │ │ └── Lobster Agent 任务调度节点 │ └──────────────────────────────────────────┘ ↓ USB 串口 / CAN ┌──────────────────────────────────────────┐ │ STM32 / 底盘控制板 │ │ ├── 接收速度指令 /cmd_vel │ │ ├── 差速运动学解算 │ │ ├── 左右轮 PID 速度闭环 │ │ ├── 编码器读取 │ │ └── 上传里程计 odom │ └──────────────────────────────────────────┘ ↓ 左右轮电机 / 编码器 / IMU ``` --- # 3. 基础模块:机器人能动、能建图、能避障、能运输 基础模块是系统的核心底座。目标是保证机器人可以完成基本的移动、建图、定位、导航和避障任务。 --- ## 3.1 系统主控模块 ### 3.1.1 功能目标 香橙派作为机器人上位机,负责运行 ROS2 系统和各类功能节点,实现多传感器数据接入、导航规划、视觉处理、语音交互和任务调度。 ### 3.1.2 软件环境 建议环境: ```text 操作系统:Ubuntu 22.04 机器人中间件:ROS2 Humble 编程语言:Python / C++ 可视化工具:RViz2 ``` ### 3.1.3 主要 ROS2 节点 | 节点名称 | 功能 | |---|---| | `lidar_node` | 读取 N10 激光雷达数据,发布 `/scan` | | `camera_node` | 读取 Astra Pro 图像和深度数据 | | `imu_node` | 发布 IMU 数据 `/imu/data` | | `slam_node` | 调用 SLAM 算法生成地图 | | `nav2_node` | 实现定位、路径规划和避障 | | `chassis_node` | 与底盘控制板通信,转发速度指令 | --- ## 3.2 底盘控制模块 ### 3.2.1 功能目标 底盘控制模块负责将上位机发送的速度指令转换为每个轮子的目标速度,并通过 PID 控制电机转速,实现机器人稳定运动。 ### 3.2.2 推荐硬件结构 ```text 香橙派 ↓ USB 串口 / CAN STM32 / 底盘控制板 ↓ PWM / 电机驱动 左右轮电机 ↑ 编码器反馈 ``` ### 3.2.3 控制流程 ```text ROS2 /cmd_vel ↓ 香橙派 chassis_node ↓ 串口发送速度指令 ↓ STM32 / 底盘控制板 ↓ 差速运动学解算 ↓ 左右轮 PID 控制 ↓ PWM 输出控制电机 ↓ 编码器反馈速度 ↓ 上传 odom 里程计 ``` ### 3.2.4 差速底盘运动学 如果机器人采用二轮差速底盘,则左右轮速度计算公式为: ```text v_left = v - ωL/2 v_right = v + ωL/2 ``` 其中: | 符号 | 含义 | |---|---| | `v` | 机器人线速度 | | `ω` | 机器人角速度 | | `L` | 左右轮间距 | | `v_left` | 左轮线速度 | | `v_right` | 右轮线速度 | ### 3.2.5 底盘控制板任务 底盘控制板需要完成: - 接收香橙派发送的速度指令 - 解析线速度和角速度 - 计算左右轮目标速度 - 读取左右轮编码器 - 执行 PID 速度闭环控制 - 输出 PWM 控制电机 - 计算并上传里程计数据 --- ## 3.3 激光雷达建图模块 ### 3.3.1 功能目标 使用 N10 激光雷达采集周围环境二维扫描信息,并通过 SLAM 算法建立室内二维地图。 ### 3.3.2 数据流 ```text N10 激光雷达 ↓ 发布 /scan ↓ slam_toolbox ↓ 生成 /map ↓ RViz2 可视化 ``` ### 3.3.3 推荐算法 | 算法 | 推荐程度 | 说明 | |---|---|---| | `slam_toolbox` | 高 | ROS2 中常用,适合 2D 雷达建图 | | Cartographer | 中 | 功能强,但配置复杂 | | GMapping | 较低 | ROS1 常见,ROS2 中不优先 | 建议优先采用: ```text slam_toolbox ``` ### 3.3.4 实现效果 完成后系统应能: - 读取 N10 雷达扫描数据 - 在 RViz2 中显示激光点云 - 通过机器人移动生成二维地图 - 保存地图文件用于后续导航 --- ## 3.4 定位与导航模块 ### 3.4.1 功能目标 使用 ROS2 Nav2 实现机器人在已知地图中的定位、路径规划、局部避障和到点导航。 ### 3.4.2 输入输出 输入: ```text /map /scan /odom /imu/data 目标点 Pose ``` 输出: ```text /cmd_vel ``` ### 3.4.3 导航流程 ```text 用户在 RViz2 中指定目标点 ↓ Nav2 全局路径规划 ↓ 局部路径规划与动态避障 ↓ 发布 /cmd_vel ↓ 底盘控制模块执行 ↓ 机器人到达目标点 ``` ### 3.4.4 实现效果 机器人应能: - 在地图中定位自身位置 - 接收目标点 - 自动规划路径 - 遇到障碍物自动绕行 - 到达目标点后停止 --- ## 3.5 IMU 姿态辅助模块 ### 3.5.1 功能目标 IMU 用于采集机器人姿态、角速度、加速度等信息,辅助定位和里程计融合,提高运动稳定性。 ### 3.5.2 数据流 ```text IMU ↓ /imu/data ↓ robot_localization ↓ /odom ``` ### 3.5.3 可选融合方案 ```text robot_localization ``` 它可以融合: - 编码器里程计 - IMU 姿态信息 - 其他定位信息 ### 3.5.4 实现效果 - 机器人转向角度更加稳定 - 里程计漂移得到一定抑制 - 导航定位效果更可靠 --- ## 3.6 基础模块最终效果 完成基础模块后,机器人应具备以下能力: ```text 1. 启动 ROS2 系统 2. 读取雷达、IMU、底盘数据 3. 使用雷达建立二维地图 4. 在地图中进行定位 5. 接收目标点 6. 自动规划路径 7. 自动避开障碍物 8. 控制底盘完成点到点运输任务 ``` 基础模块演示场景: ```text 机器人从起点出发 → 自动建图 → 指定目标点 → 自动导航 → 避开障碍物 → 到达目标点 → 停止 ``` --- # 4. 进阶模块:机器人能看、能听、能说 进阶模块在基础移动能力之上,加入机器视觉和语音交互能力,使机器人能够识别环境中的目标,并通过语音与用户交互。 --- ## 4.1 视觉感知模块 ### 4.1.1 功能目标 利用 Astra Pro 深度摄像头采集 RGB 图像和深度图像,为物体识别、人脸检测和目标测距提供数据。 ### 4.1.2 输出话题 ```text /camera/color/image_raw /camera/depth/image_raw /camera/camera_info ``` ### 4.1.3 实现效果 - 能在 RViz2 或 OpenCV 窗口中显示 RGB 图像 - 能获取深度图像 - 能计算目标距离 --- ## 4.2 物体识别模块 物体识别可以分为传统视觉方案和深度学习方案。 ### 4.2.1 方案一:OpenCV 传统视觉 适合快速实现和稳定演示。 可实现: - 颜色识别 - 形状识别 - 二维码识别 - AprilTag 识别 - 指定标签识别 适合识别对象: ```text 红色物资箱 蓝色瓶子 带二维码的包裹 指定颜色区域 ``` 优点: - 算力要求低 - 实现简单 - 稳定性较好 - 适合课设演示 ### 4.2.2 方案二:YOLO 目标检测 适合做出更高级效果。 可识别对象: ```text person bottle cup box book backpack chair ``` 推荐模型: ```text YOLOv5n YOLOv8n ``` 如果香橙派为 RK3588 平台,可进一步使用 RKNN 进行 NPU 加速。 ### 4.2.3 物体识别流程 ```text Astra Pro RGB 图像 ↓ OpenCV / YOLO ↓ 目标检测框 ↓ 类别 + 置信度 ↓ 发布 /detected_objects ``` --- ## 4.3 深度测距模块 ### 4.3.1 功能目标 结合 Astra Pro 的深度图像,在识别到目标物体后计算目标距离,辅助机器人靠近目标或停止。 ### 4.3.2 流程 ```text 检测到目标物体 ↓ 获取目标框中心点坐标 ↓ 读取深度图中对应像素的深度值 ↓ 得到目标距离 ↓ 控制机器人靠近或停止 ``` ### 4.3.3 示例 ```text 检测到水瓶 距离:1.2m 机器人继续靠近 距离:0.5m 机器人停止 语音播报:“已到达目标物体附近” ``` --- ## 4.4 人脸检测模块 ### 4.4.1 功能目标 实现机器人对人脸的检测,使机器人能够判断前方是否有人,并可进一步扩展为身份识别。 ### 4.4.2 推荐方案 基础方案: ```text OpenCV Haar Cascade OpenCV DNN Face Detector ``` 进阶方案: ```text face_recognition InsightFace ``` ### 4.4.3 建议实现方式 课设建议先实现**人脸检测**,不强制做人脸身份识别。 基础功能: - 检测画面中是否有人脸 - 返回人脸框位置 - 机器人面向人脸方向播报 进阶功能: - 录入指定人员 - 识别用户身份 - 对特定人员执行物资运输任务 --- ## 4.5 语音识别模块 ### 4.5.1 功能目标 实现机器人对用户语音指令的识别,使用户可以通过语音控制机器人执行任务。 ### 4.5.2 推荐实现路线 #### 简单版:关键词识别 识别固定指令: ```text 开始建图 停止建图 去A点 去B点 寻找水瓶 寻找人 停止 回到起点 ``` 优点: - 简单 - 稳定 - 适合演示 #### 进阶版:离线 ASR 可选方案: | 方案 | 优点 | 缺点 | |---|---|---| | Vosk | 可离线,轻量 | 准确率一般 | | Whisper tiny | 效果较好 | 对算力要求更高 | | 百度/讯飞 API | 准确率高 | 需要联网 | 建议: ```text 课设优先使用关键词识别或 Vosk ``` --- ## 4.6 语音播报模块 ### 4.6.1 功能目标 机器人能够通过语音向用户反馈当前状态和任务执行结果。 ### 4.6.2 可选方案 | 方案 | 特点 | |---|---| | pyttsx3 | 本地运行,简单 | | Edge-TTS | 语音自然,需要联网 | | espeak | Linux 本地可用,但声音机械 | ### 4.6.3 播报内容示例 ```text “开始建图” “正在前往目标点” “检测到目标物体” “前方有障碍物,正在避让” “已到达目标点” “任务完成” ``` --- ## 4.7 进阶模块最终效果 完成进阶模块后,机器人应具备以下能力: ```text 1. 采集 RGB-D 图像 2. 检测指定物体 3. 检测人脸 4. 获取目标距离 5. 接收简单语音指令 6. 播报任务状态 7. 根据视觉识别结果辅助导航和运输 ``` 演示场景: ```text 用户说:“寻找水瓶” 机器人前往目标区域 摄像头识别水瓶 读取水瓶距离 机器人靠近目标 语音播报:“已识别到水瓶” ``` --- # 5. 提升模块:多智能体任务调度与完整任务闭环 提升模块是本项目的创新点。通过设计类似“龙虾”的智能体调度系统,将导航、视觉、底盘和语音模块组织起来,使机器人能够执行更复杂的任务。 --- ## 5.1 Lobster Agent 智能任务调度模块 ### 5.1.1 功能定位 Lobster Agent 是系统的任务调度中心,负责接收用户任务、解析任务意图、拆解任务步骤,并调用不同功能模块完成任务。 ### 5.1.2 核心职责 ```text 用户指令输入 ↓ 任务解析 ↓ 任务拆解 ↓ 调用导航、视觉、底盘、语音模块 ↓ 监控执行状态 ↓ 异常处理 ↓ 语音反馈任务结果 ``` --- ## 5.2 多智能体模块划分 | 智能体 | 负责内容 | |---|---| | TaskAgent | 总调度,解析任务和安排执行流程 | | NavAgent | 建图、定位、导航、避障 | | VisionAgent | 物体识别、人脸检测、目标测距 | | VoiceAgent | 语音识别和语音播报 | | ChassisAgent | 底盘控制、轮速反馈、运动执行 | --- ## 5.3 智能体协作流程 以“帮我把水瓶送到 A 点”为例: ```text 用户语音:“帮我把水瓶送到A点” ↓ VoiceAgent 识别语音 ↓ TaskAgent 解析任务类型:物资运输 ↓ TaskAgent 生成任务序列 ↓ NavAgent 导航到物品区域 ↓ VisionAgent 搜索水瓶 ↓ VisionAgent 返回水瓶位置和距离 ↓ ChassisAgent 控制机器人靠近 ↓ TaskAgent 判断目标确认完成 ↓ NavAgent 导航到 A 点 ↓ VoiceAgent 播报:“任务完成” ``` --- ## 5.4 状态机设计 课设实现中,建议使用有限状态机 FSM 实现任务调度。相比直接接入大模型,状态机更稳定、可控、容易调试。 ### 5.4.1 状态定义 ```text IDLE 空闲状态 LISTENING 等待语音指令 PLANNING 任务规划 NAVIGATING 导航中 SEARCHING 视觉搜索目标 APPROACHING 靠近目标 DELIVERING 运输中 FINISHED 任务完成 ERROR 异常处理 ``` ### 5.4.2 状态转移流程 ```text IDLE ↓ LISTENING ↓ PLANNING ↓ NAVIGATING ↓ SEARCHING ↓ APPROACHING ↓ DELIVERING ↓ FINISHED ``` 异常情况: ```text 目标未识别 → ERROR → 语音提示“未找到目标” 导航失败 → ERROR → 重新规划路径 障碍物无法绕开 → ERROR → 停止并请求人工处理 ``` --- ## 5.5 行为树扩展设计 如果希望报告中体现更高级的任务调度思想,可以引入行为树作为提升方案。 行为树结构示例: ```text Root ├── ReceiveCommand ├── ParseTask ├── NavigateToObjectArea ├── DetectObject ├── ApproachObject ├── NavigateToTargetPoint └── ReportFinished ``` 建议: ```text 实际代码用状态机实现 报告中说明后续可扩展为行为树 ``` --- ## 5.6 Web/RViz 可视化模块 ### 5.6.1 基础可视化 直接使用: ```text RViz2 ``` 显示内容: - 地图 - 机器人位置 - 激光雷达数据 - 目标点 - 路径规划结果 - 摄像头画面 ### 5.6.2 加分可视化 如果时间充足,可以设计 Web 页面显示: ```text 地图 机器人当前位置 任务状态 目标识别结果 摄像头画面 语音识别结果 ``` 可选方案: ```text ROSBridge + WebSocket + Vue/HTML ``` --- ## 5.7 提升模块最终效果 完成提升模块后,机器人应具备以下能力: ```text 1. 接收复杂任务 2. 自动拆解任务步骤 3. 调用导航模块前往目标区域 4. 调用视觉模块搜索目标 5. 调用底盘模块靠近目标 6. 调用语音模块反馈状态 7. 完成完整物资运输任务闭环 ``` 完整演示场景: ```text 用户说:“帮我把水瓶送到A点” 机器人回复:“收到,开始执行物资运输任务” 机器人导航到物品区域 摄像头识别水瓶 机器人靠近目标 机器人导航到A点 机器人播报:“任务完成” ``` --- # 6. 三层模块总结 | 层级 | 模块目标 | 主要功能 | 完成效果 | |---|---|---|---| | 基础模块 | 让机器人能动起来 | 建图、定位、导航、避障、底盘控制 | 能自主移动和运输 | | 进阶模块 | 让机器人能看、能听、能说 | 物体识别、人脸检测、语音识别、语音播报 | 能根据视觉和语音执行任务 | | 提升模块 | 让机器人具备任务调度能力 | Lobster Agent、多智能体协作、状态机、任务拆解 | 能完成复杂物资运输任务 | --- # 7. 开发优先级建议 建议按照以下顺序开发: ```text 第1步:香橙派安装 Ubuntu 22.04 和 ROS2 Humble 第2步:实现香橙派与底盘控制板通信 第3步:底盘可以响应 /cmd_vel 运动 第4步:N10 雷达发布 /scan 第5步:使用 slam_toolbox 建图 第6步:使用 Nav2 实现导航避障 第7步:Astra Pro 发布 RGB-D 图像 第8步:OpenCV/YOLO 识别物体 第9步:加入人脸检测 第10步:加入语音识别和语音播报 第11步:实现 Lobster Agent 状态机 第12步:整合完整演示任务 ``` 开发原则: ```text 先让机器人“能走” 再让机器人“能看” 最后让机器人“能听懂任务并自己分配执行” ``` --- # 8. 最终推荐实现方案 结合现有硬件,推荐最终方案如下: ```text 香橙派:ROS2 主控 + 视觉 + 语音 + Agent Astra Pro:RGB-D 视觉识别和测距 N10 雷达:2D SLAM 和避障 IMU:姿态辅助和里程计融合 STM32/底盘控制板:电机 PID 和轮速控制 通信方式:USB 串口,后续可扩展 CAN 核心算法:slam_toolbox + Nav2 + OpenCV/YOLO + FSM 状态机 ``` 最终一句话概括: > 本系统以香橙派为 ROS2 主控平台,融合 N10 激光雷达、Astra Pro 深度摄像头和 IMU,实现轮式机器人自主建图、定位导航、避障运输、视觉识别、语音交互和多智能体任务调度,面向室内物资运输场景提供完整解决方案。