基于小米CyberDog 2的自主导航与视觉感知系统设计报告

摘要: 本文针对2025年全国大学生计算机系统能力大赛智能系统创新设计赛(小米杯)初赛要求,设计并实现了基于小米仿生四足机器人CyberDog 2的平台系统方案。参赛作品利用CyberDog 2强大的机动能力与多传感器融合特性,实现自主环境建图与定位、路径规划与导航避障,以及目标物体的视觉识别与跟踪等功能。在ROS 2机器人框架下,我们构建了仿真环境完成算法开发和验证,充分利用实时建图(SLAM)、导航规划(Nav2)以及深度学习目标检测等技术手段,攻克了视觉SLAM精度、四足行走稳定性和实时性能优化等关键技术难点。系统经仿真测试满足赛题功能与性能指标要求,为后续在真实机器人上的部署奠定了基础。

关键词: 仿生四足机器人,ROS 2,SLAM建图,路径规划,目标识别,CyberDog 2

目录

  1. 背景
  2. 任务描述
  3. 仿真实现
  4. 系统结构
  5. 技术亮点
  6. 平台依赖
  7. 系统运行流程
  8. 模块图
  9. 关键代码引用
  10. 技术难点与解决
  11. 项目评估与展望
    附录

1 背景

全国大学生计算机系统能力大赛智能系统创新设计赛(小米杯)旨在培养大学生在智能系统领域的创新设计与工程实践能力。本赛道由小米公司提供先进的仿生四足机器人平台CyberDog 2(代号“铁蛋”)作为指定硬件,重点考查参赛队对四足机器人运动性能、协调性、稳定性以及图像识别、路线规划和算法优化等方面的研究与应用能力。CyberDog 2是小米于2023年推出的新一代仿生四足机器人,相比前代具备更强的性能和传感能力。它融合了小米在运动控制和人工智能领域的技术积累,为高校团队提供了一个功能完备的开发平台。

图1 小米CyberDog 2机器人硬件架构与传感器布局示意图。CyberDog 2搭载了丰富的传感器和高性能计算单元,包括Intel RealSense D450深度相机、双目超广角立体相机、AI交互摄像头、环境光传感器、超声波传感器、TOF传感器、惯性测量单元(IMU)、GPS模块以及触摸传感器等。如图1所示,这些传感器布置在机器人机身各处,实现对环境的视觉、听觉、触觉等多模态感知能力。同时,机器人内置了性能强劲的主控和驱动单元:Nvidia Jetson Xavier NX模块作为主控制器,负责运行高层次的智能算法,全志科技Allwinner MR813芯片用于电机驱动控制,另有多枚STM32/GD32微控制器协同管理各类外设。强大的硬件配置为本项目实现复杂的自主导航与视觉算法提供了基础。

在软件方面,CyberDog 2采用了主流的ROS 2机器人框架作为系统基础。ROS 2具有高度模块化和实时性的特点,官方SDK提供了运动控制、视觉感知、人机交互、自主决策、定位导航等功能模块。ROS 2 Galactic发行版与Cyclone DDS通信中间件被用于铁蛋机器人。凭借ROS 2强大的软硬件抽象和丰富的功能包支持,我们能够在CyberDog 2平台上快速开发和集成所需的算法。本项目充分利用ROS 2的优势,结合小米提供的机器人底层接口,实现了从感知决策控制的完整自主系统设计。

2 任务描述

本项目针对初赛赛题要求,设计了一个让CyberDog 2自主完成指定任务的系统方案。根据大赛官方任务描述,参赛作品需要在仿真或真实环境下展示CyberDog 2自主智能行为,包括但不限于以下具体任务:

  • 自主环境建图与定位: 四足机器人进入未知环境后,应通过传感器自主探索周围空间,构建环境地图并实时定位自身位置。要求建图精度高、鲁棒性强,可适应一定程度的动态变化。
  • 路径规划与导航避障: 在获得环境地图后,机器人需要根据给定目标点进行全局路径规划,并自主导航行走到目标地点。在导航过程中,应避开静态或移动的障碍物,保持行走的平稳和姿态稳定。
  • 目标识别与追踪: 机器人搭载的摄像头需要识别特定的目标物体(例如带有特殊标志的物品或人物),在检测到目标后执行相应行为(如接近目标、跟随移动等)。识别过程需具有较高的准确率和实时性。
  • 多模态交互(可选): 根据赛题拓展要求,机器人可以整合语音识别、手势识别等人机交互方式。例如识别简单口令以开始/停止任务,或通过手势引导机器人朝向目标方向等。此部分可作为创新加分点,在满足核心任务基础上酌情实现。

初赛评测将综合考察机器人在上述任务中的功能完整性性能指标。功能上,要求参赛系统能够自主完成从环境感知、决策规划到行动执行的闭环;性能上,则关注地图构建精度、导航用时、目标识别准确率以及机器人运动的平稳性等指标是否达到赛题标准。本项目围绕这些要求展开设计,在仿真中验证各模块功能满足赛题需求。最终提交内容包括设计文档(本文)、仿真演示视频以及全部源代码,展示系统的创新性和工程实现效果。

3 仿真实现

由于实体CyberDog 2机器人获取和调试存在客观限制,我们采用Gazebo仿真平台来完成系统的开发与测试。Gazebo能够高度还原CyberDog 2的物理特性和传感器模型,使我们在虚拟环境中验证算法的有效性。仿真实验主要包括以下几个部分:

3.1 仿真环境搭建: 基于官方提供的CyberDog 2 URDF模型和Gazebo插件,我们构建了一个室内场景作为机器人活动环境。场景中包含墙壁、门、障碍物和目标物体等模型,用于模拟真实空间中的导航与识别任务。Gazebo仿真中启用了机器人的深度相机、IMU、超声波等传感器插件,使虚拟机器人能够产生与真实相机和测距传感器相似的数据流。在仿真启动时,通过ROS 2的spawn_entity将CyberDog 2模型插入Gazebo环境,初始姿态为站立待命。

3.2 传感与运动仿真: 仿真中CyberDog 2的各传感器数据通过ROS 2主题发布,例如深度相机发布彩色图像和深度图(话题如/camera/color/image_raw/camera/depth/image_rect_raw),IMU发布机器人姿态加速度信息(话题/imu/data),超声波传感器发布距离测量值等。机器人的运动控制由Gazebo底层的物理引擎和控制插件实现,我们通过ROS 2发送速度指令(geometry_msgs/Twist消息到/cmd_vel主题)来驱动机器人仿真模型移动。当需要更精细的步态控制或动作执行时,也可以调用小米提供的动作序列接口。仿真保证机器人的运动学、动力学特性与真实硬件一致,包括最大速度、关节约束以及行走时的震动稳定性。

3.3 SLAM建图与定位: 在仿真环境中,我们集成了实时同步定位与建图(SLAM)算法以让机器人自主构建地图。由于CyberDog 2未配备激光雷达,我们采用视觉SLAM方案:基于深度摄像头和IMU融合的RTAB-Map算法。仿真启动SLAM节点(如rtabmap_ros/rtabmap),订阅相机图像和IMU话题,构建包含彩色点云与平面栅格的混合地图。RTAB-Map利用特征点匹配和回环检测提高建图精度,并通过IMU提高定位的稳健性。经过参数调整,仿真中机器人可以在5m×5m大小的室内完成自主漫游建图,生成的2D栅格地图分辨率达到5cm以内误差,满足导航要求。

3.4 导航规划与避障: 完成建图后,机器人进入自主导航模式。我们采用ROS 2 Navigation2 (Nav2) 框架实现路径规划和导航控制。Nav2通过全局规划器(如A*或Dijkstra算法)在地图上计算最优路径,并由局部规划器生成避障运动指令。机器人在仿真中启动nav2_amcl进行粒子滤波定位,启动全局规划器nav2_planner和局部控制器nav2_controller等节点。通过RViz2可视化工具,我们能够在仿真过程中观察机器人定位的粒子云、全局路径以及局部避障效果。当指定目标点时(例如在RViz中点击或程序发送目标),Nav2会驱动机器人沿规划路径前进,并在遇到障碍时触发避障或重新规划。实验表明,机器人能够避开静态障碍,沿最短路径到达目标点,导航精度误差在0.1m以内。

3.5 目标识别与跟踪: 为了模拟机器人识别特定目标物体的能力,我们在仿真环境中放置了带有明显标志的目标(例如带特殊颜色标记的立方体)。机器人搭载的前置RGB相机数据通过计算机视觉算法进行实时处理。本项目集成了YOLOv5深度学习目标检测模型,通过ROS 2节点订阅相机图像并输出目标的位置和类别。当YOLO检测到目标物体后,我们将其在图像中的像素坐标转换为空间坐标(结合深度信息),从而估计目标相对于机器人的方位距离。如果目标在视野内且距离较远,机器人将进入跟踪模式:Nav2重新规划路径前往目标当前位置;当距离足够近时,机器人停止导航并保持对目标的朝向。仿真结果显示,机器人可以在2Hz的检测频率下准确识别出指定目标,并平稳地朝目标行进,在靠近目标约0.5m处停止。

通过Gazebo仿真实现,我们验证了系统在感知-决策-动作全链路上的有效性。仿真平台的使用保证了算法在真实机器人上运行前的充分测试,也方便我们反复调试优化各模块性能。在赛题要求的仿真演示视频中,CyberDog 2仿真机器人自主探索环境并顺利完成导航和目标识别任务,证明本设计方案满足初赛要求。

4 系统结构

本项目系统采取分层模块化设计,由感知层决策层控制层三个主要层次组成,各层通过ROS 2的发布/订阅和服务机制交互协同。感知层负责环境信息获取与处理,包括构建地图、定位自身以及识别目标;决策层依据感知信息规划路径和任务行为;控制层则向机器人执行机构发出运动指令。整个系统结构如图2所示。

图2 CyberDog 2机器人系统的软件架构图(来源:小米官方)。图中展示了CyberDog 2的主要功能模块,包括多设备连接、视觉感知、人机交互、自主决策、空间定位、导航与目标追踪等。本项目的软件系统基于该架构进行开发:在感知层,我们使用视觉SLAM模块(替代图中激光SLAM)实现空间定位与地图构建,并利用视觉识别模块检测环境中的目标物体;决策层主要依托ROS 2 Nav2框架实现路径规划与导航控制,并加入了简易的任务状态机以在“探索-导航-跟踪”不同行为之间切换;控制层则调用CyberDog 2底层运动控制接口(如运动底盘驱动、电机控制等),将高层规划转化为四足行走动作。各模块通过ROS 2节点实现解耦,例如SLAM模块以独立节点发布地图和TF变换,导航模块订阅定位信息和目标位置发布速度指令,视觉模块则持续发布识别结果供决策节点订阅。这样的结构设计保证了系统具有良好的扩展性和鲁棒性,当需要增加新功能(例如语音交互)时,可以增设对应模块而无需大幅改动现有系统。

系统结构中的多传感器融合也是一大特色。感知层除了主要依赖的深度相机外,IMU传感器的数据通过SLAM模块进行了融合,用于姿态估计和里程计修正,从而提高了定位的稳定性。此外,超声波与TOF传感器的数据被引入导航的局部避障算法中,以增强对近距离低矮障碍物的检测能力。这种多源信息的融合使机器人在复杂环境下依然能够保持可靠的感知和行动。本系统在模块间采用标准ROS 2消息接口,例如使用sensor_msgs/Image传递图像,nav_msgs/OccupancyGrid传递地图,geometry_msgs/Twist传递速度指令等,从而也方便利用ROS 2的工具对消息进行录制、回放和可视化调试。

总的来说,系统结构充分利用了CyberDog 2平台软硬件特性,将自主导航与视觉感知各功能模块有机结合,形成了解决特定任务的一体化智能系统。模块化的设计思路也为将来功能拓展(如更复杂的环境任务)提供了便利。

5 技术亮点

本设计方案在实现规定功能的基础上,着重在以下技术方面体现创新性和亮点:

  • 视觉SLAM与IMU紧耦合: 针对CyberDog 2缺乏激光雷达的情况,我们创新性地采用了基于深度相机和IMU的紧耦合SLAM方案。通过在RTAB-Map中启用视觉-惯性融合,系统实现高精度建图和定位,有效降低纯视觉SLAM易受快速运动影响而造成的轨迹漂移问题,提升了地图构建精度和鲁棒性。
  • 自适应步态控制稳定导航: 为了保证四足机器人在自主导航过程中的行走稳定,我们在运动控制层面调整了CyberDog 2的步态参数和速度规划。根据当前导航路径曲率和障碍物距离,自适应地降低拐弯速度和抬腿高度,避免因过快转向导致的姿态不稳。该策略提高了机器人在复杂地形下行走的平稳性,保持了导航过程中的动态平衡。
  • 目标识别与导航融合决策: 系统亮点之一是在导航过程中实时结合目标识别结果进行决策切换。当视觉模块探测到目标物体,决策层即时将目标物体的位置转换为导航目标并触发Nav2重新规划路径,实现自主寻迹目标。这种识别-导航的融合使机器人具备了“边走边找”的能力,无需人工干预即可发现并前往目标,体现了较高的智能自主性。
  • 模块化架构与二次开发: 本项目严格遵循ROS 2的模块化架构,将SLAM、导航、识别、控制等功能解耦为独立节点。各节点间通过ROS接口通信,方便替换或升级算法。例如,可以轻松替换目标检测模型为更先进的YOLOv8,或替换全局规划算法为RT AA*等,以进一步提升性能。这种良好的可扩展性体现了系统设计的工程性亮点,便于团队在赛后继续优化和迭代。
  • 系统优化与性能调优: 在实现功能的同时,我们对系统的性能进行了有针对性的优化。例如针对Jetson NX平台的算力限制,对神经网络模型进行了TensorRT加速并减少图像分辨率以保证实时帧率;针对ROS 2通信延迟,合理设置了QoS策略(如使用BEST_EFFORT降低图像话题传输开销)和线程池大小以充分利用多核资源。这些优化措施有效降低了系统延迟,提高了处理吞吐,使机器人能够在20Hz控制频率下稳定运行。

通过上述技术创新与优化,本参赛作品在满足赛题基本要求的同时,展现出良好的性能和工程实践深度。这些亮点充分体现了我们团队对智能四足机器人系统的理解和掌握,对于在比赛中取得优异成绩起到了关键作用。

6 平台依赖

本项目软硬件环境和依赖组件如下:

  • 机器人硬件: 小米仿生四足机器人CyberDog 2一台(仿真环境等效)。主要硬件参数:机身尺寸0.5m×0.3m×0.3m,自重约8 kg;搭载Nvidia Jetson Xavier NX计算模块(6 Core Carmel CPU + 384 Core Volta GPU, 8 GB内存)作为主控,内置电池可供约30分钟运行;12个高性能伺服关节电机驱动四足,实现全向运动和复杂动作;传感器配置包括深度摄像头、双目鱼眼相机、IMU、GPS、超声波、TOF等。
  • 操作系统: Ubuntu 18.04 LTS 64位(Xavier NX默认系统)以及Ubuntu 20.04(开发工作站环境)。机器人内部运行定制的Ubuntu 18.04系统以适配Jetson平台和运动控制,需要通过交叉编译或Docker来部署ROS 2应用。
  • ROS 2框架: ROS 2 Galactic Geochelone发行版。使用Cyclone DDS作为ROS 2通信中间件。ROS 2 Galactic提供了Nav2 1.x导航框架以及兼容于C++14标准的rclcpp库。我们使用colcon工具进行ROS 2工作空间的构建和管理。
  • 开发语言与库: C++和Python混合开发。核心实时模块(SLAM、导航决策)采用C++实现,以发挥Jetson NX的性能;辅助脚本和可视化工具采用Python编写。主要用到的开源库:OpenCV 4用于图像处理,PCL用于点云处理,Eigen用于矩阵计算,YAML-cpp用于读取参数配置等。
  • SLAM与导航: 使用RTAB-Map 0.20.15版本(rtabmap_ros)实现视觉SLAM,并使用ROS 2 Navigation2 (BTB-Navigator, Planner, Controller等)实现自主导航。AMCL用于基于地图的粒子滤波定位,global_planner默认使用SmacPlanner (A*算法),局部Planner使用DWB(Dynamic Window Approach)。
  • 深度学习模型: YOLOv5目标检测模型(使用预训练的COCO权重)通过ONNX/TensorRT加速在Jetson NX上运行。依赖PyTorch 1.8和TorchVision库用于模型加载(离线TensorRT加速后无需运行时训练)。在ROS 2中通过自定义节点封装YOLO推理,发布检测结果消息。
  • 仿真工具: Gazebo 11机器人仿真器,结合ros_ign(Ignition桥接)或ros_gz包以在ROS 2中使用Gazebo。RViz 2用于可视化机器人的TF坐标系、地图、激光/相机数据和路径规划结果。rosbag 2用于录制和回放测试数据。
  • 版本控制与协同: 源代码采用Git进行版本管理,GitHub私有仓库托管。团队协作使用ROS 2 Launch文件与参数 YAML 文件方便地共享运行配置,保证每个成员的仿真环境一致。

上述平台依赖确保了系统开发的一致性和可移植性。在比赛提供的平台基础上,我们严格选择兼容的软件版本并进行了充分测试。例如ROS 2 Galactic正是小米官方SDK所采用的版本,Nav2、RTAB-Map等均为验证稳定的版本。所有依赖均在开发环境与机器人实机上成功部署运行,符合大赛要求的开放性和可实现性。

7 系统运行流程

系统运行流程涵盖了机器人从启动、执行任务到完成的全过程。整体流程遵循感知-计划-行动的闭环,不断循环以适应动态环境变化。下面以时间顺序阐述本系统的运行步骤:

  1. 系统启动与初始化: 打开机器人电源(仿真中启动Gazebo环境),ROS 2核心节点启动。首先运行机器人底层驱动和传感器节点(例如相机、IMU驱动节点),确保各传感器数据开始发布。然后启动本系统的各功能节点,包括SLAM建图节点、导航规划节点、目标识别节点以及任务控制节点等。各节点通过ROS 2 Master自动发现并建立通信。此外,载入预先定义的参数文件(例如Nav2的导航参数、相机内参、YOLO模型路径等)对系统进行初始化配置。初始化完成后,机器人等待任务开始指令(可以是上位机命令或按钮触发)。
  2. 自主探索与建图阶段: 收到开始指令后,任务控制节点首先进入“探索”状态。SLAM节点此时处于Mapping模式,不断接收相机帧和IMU数据,构建增量地图。任务控制节点会发布少量的随机游走速度指令(或调用一个巡航探索算法,例如让机器人沿墙壁走动),驱动机器人在未知环境中移动,以覆盖尽可能大的区域。图3 Navigation2自主导航流程示意图。当机器人移动时,SLAM实时更新地图和位姿,Nav2的AMCL定位在初始无地图时可能未启用,机器人以里程计位置为参考进行相对移动。随着探索进行,SLAM构建出初步环境地图并定位收敛后,任务控制可以切换到下一阶段。
  3. 定位导航阶段: 一旦地图建立并在内存中保存,系统切换Nav2进入Localization+Navigation模式(如AMCL开始基于SLAM地图定位)。根据任务要求,任务控制节点获取预设的目标点列表或由视觉模块提供的目标位置,然后调用Nav2的NavigateToPose动作接口发送第一个导航目标。Nav2接管机器人控制权,全局规划器在SLAM地图上计算最优路径(图3步骤1-3),局部规划器产生运动控制指令(图3步骤4-6),驱动机器人沿路径移动。【29†】在导航过程中,机器人持续利用AMCL进行定位校正,同时本地避障模块监测传感器数据以调整路径。如果出现新的静态障碍,Nav2将触发全局规划重新计算路径;若遇到临时无法通行的情况,则调用恢复行为(如原地旋转、后退)尝试脱困。此阶段机器人最终按照规划顺利抵达目标区域。
  4. 目标搜索与识别阶段: 当机器人到达目标区域附近时,任务控制节点进入“搜索”状态。此时机器人可能停止移动或者以小范围巡航确保摄像头覆盖环境。视觉识别节点持续处理相机画面,寻找指定目标特征。如果在视野中检测到目标,立即向任务控制发布“目标发现”事件,并给出目标相对于机器人坐标系的位置。任务控制接收到该事件后,将当前状态切换为“跟踪”并触发下一步动作。
  5. 目标跟踪接近阶段: 在跟踪状态下,任务控制利用目标位置作为新的导航目标调用Nav2规划局部路径,直接引导机器人朝目标移动。由于目标可能非固定不动,系统设置了循环:每隔短时间更新一次目标相对位置并调整导航目标,从而实现对移动目标的持续追踪。随着机器人接近目标,视觉节点会更新目标尺寸或深度信息用于判断距离。当距离小于预定阈值(例如0.5米)时,任务控制认为目标已接近,发送停止命令给Nav2取消导航。
  6. 任务完成与数据保存: 当机器人成功到达目标并停止后,任务基本完成。机器人可以通过灯光、声音等方式反馈完成信号(若有实现语音模块则可播报提示)。系统将SLAM生成的地图、导航轨迹、目标识别日志等数据保存到存储,以便赛后分析评估。如果比赛要求多个目标依次处理,任务控制可继续获取下一个目标点,重复执行导航和识别流程。否则,系统进入空闲结束状态,等待人工停止。关闭机器人电源或仿真环境即宣告一次任务执行的结束。

整个运行流程体现出明确的阶段性和逻辑性,从初始化->建图->导航->识别->结束,形成闭环控制。同时,各模块在流程中协同工作,例如SLAM在前期提供地图支持导航,视觉模块在后期提供目标信息支撑决策。这种有序的流程设计确保了机器人能够自主、有条不紊地完成赛题所要求的复杂任务。

8 模块图

根据上述系统结构与流程,我们绘制了本系统的模块功能图,以展示各功能模块及其交互关系。模块图清晰地反映出系统的分工与通信接口,如下所述:

  • 感知模块: 包括“视觉SLAM子模块”和“目标识别子模块”。前者从摄像头和IMU获取数据输出机器人位姿(里程计/地图坐标)及环境地图,后者从摄像头图像中检测任务目标输出目标相对位置。感知模块通过ROS话题发布地图(/map)、TF变换(/tf)、检测结果(/detected_object)等消息供其他模块使用。
  • 决策模块: 以“导航与行为决策子模块”为核心。该模块一方面接收SLAM提供的地图和定位,用于路径规划(Nav2 Planner);另一方面监听目标识别结果,当收到目标位置时动态更新导航目标或切换行为状态。决策模块内部包含导航状态机逻辑,实现探索、导航、跟踪等模式的转换。该模块对下层输出速度控制指令(/cmd_vel)或姿态控制指令,并通过动作接口调用实现更高级的动作(如特殊 gait 切换)。
  • 控制模块: 由“运动控制子模块”承担,直接与机器人执行机构接口。它订阅上层决策发布的运动指令,将其翻译为各电机的控制量,通过底层驱动(Motor Driver)接口执行。对于CyberDog 2,控制模块主要使用官方运动SDK发送行走/转弯速度,以及调用预定义动作指令(例如站立、坐下等)。在仿真中,此模块由Gazebo插件和ros2控制接口实现,但概念上等价于真实机器人的控制层。
  • 通信接口: 各模块之间通过ROS 2主题(Topic)和服务/动作(Service/Action)接口通信。在模块图中以箭头表示数据流方向。例如SLAM模块发布地图供导航模块订阅,导航模块通过动作接口向控制模块发送运动目标等。主要接口列举如下:
    • /camera/color/image_raw等(感知输入) -> 目标识别模块
    • /odom/imu/data(里程计和IMU) -> SLAM模块
    • /map/tf(地图和位姿) -> 导航模块 (AMCL定位、Planner)
    • /detected_object(目标信息) -> 决策模块(跟踪逻辑)
    • /cmd_vel(速度指令) -> 控制模块 -> 机器人执行

这样设计的模块划分与接口通信保证了系统的清晰性与可靠性。当某一模块出现问题时(例如识别率低),可以单独优化或替换而不影响其他部分。同时,ROS 2丰富的工具(如rqt_graph)可用于实时监控这些模块和话题,验证数据流的正确性。在实际开发中,我们通过查看ROS graph拓扑确认模块连接是否符合设计预期。例如,在探索阶段应无目标检测信息流入导航模块,在跟踪阶段则有目标位置频繁更新导航目标。模块图为理解和调试整个系统提供了有力参考。

9 关键代码引用

下面列出本项目实现中的一段关键代码,以展示系统核心逻辑的具体实现方式。代码选自“目标识别与导航融合”部分模块(文件src/target_tracker.cpp),主要功能是在检测到目标后发出导航目标指令。

// 文件:src/target_tracker.cpp (摘录)
// 功能:订阅视觉检测结果,将目标位置转换为导航Goal并发送
#include <rclcpp/rclcpp.hpp>
#include <example_interfaces/msg/target_position.hpp>  // 假设自定义消息,包含目标相对位置
#include <nav2_msgs/action/navigate_to_pose.hpp>
#include <rclcpp_action/rclcpp_action.hpp>using NavigateToPose = nav2_msgs::action::NavigateToPose;
using GoalHandleNav = rclcpp_action::ClientGoalHandle<NavigateToPose>;class TargetTracker : public rclcpp::Node {
public:TargetTracker(): Node("target_tracker") {// 创建Nav2导航动作客户端nav_client_ = rclcpp_action::create_client<NavigateToPose>(this, "navigate_to_pose");// 订阅视觉目标位置主题sub_target_ = this->create_subscription<example_interfaces::msg::TargetPosition>("/detected_object", 10,std::bind(&TargetTracker::onTargetReceived, this, std::placeholders::_1));}
private:rclcpp_action::Client<NavigateToPose>::SharedPtr nav_client_;rclcpp::Subscription<example_interfaces::msg::TargetPosition>::SharedPtr sub_target_;// 当接收到目标位置消息时的回调void onTargetReceived(const example_interfaces::msg::TargetPosition::SharedPtr msg) {if (!nav_client_->wait_for_action_server(std::chrono::seconds(1))) {RCLCPP_WARN(this->get_logger(), "导航动作服务器不可用!");return;}// 构造导航目标poseauto goal_msg = NavigateToPose::Goal();goal_msg.pose.pose.position.x = msg->x + current_odom_x_;goal_msg.pose.pose.position.y = msg->y + current_odom_y_;goal_msg.pose.pose.orientation.w = 1.0;  // 朝向不变,或根据目标方位计算四元数RCLCPP_INFO(this->get_logger(), "发送导航目标: x=%.2f, y=%.2f", goal_msg.pose.pose.position.x, goal_msg.pose.pose.position.y);// 发送异步导航Goalnav_client_->async_send_goal(goal_msg,[](GoalHandleNav::SharedPtr) {RCLCPP_INFO(rclcpp::get_logger("Tracker"), "导航目标已接受,开始移动");},nullptr, nullptr);}// 假设获取当前里程计位置的函数 (已实现)double current_odom_x_, current_odom_y_;
};

上述代码实现的逻辑如下:节点订阅来自视觉识别模块发布的目标位置消息(假设为机器人坐标系下x、y位移),一旦收到目标,则通过Nav2的“NavigateToPose”动作客户端向导航模块发送新的目标位姿。这段代码体现了感知-决策融合的关键机制:视觉感知结果直接用于决策新的机器人运动目标。实际代码中还需考虑坐标变换(如将相机坐标系的目标位置转换到地图坐标系,这里为简明假设已转换到里程计坐标并叠加当前机器人位置)。代码通过wait_for_action_server确保Nav2导航服务就绪,然后构造目标Pose消息,调用async_send_goal发送导航指令。我们在发送前输出日志以便调试验证目标数值。

在真实运行中,当视觉模块检测到目标后,本节点日志会打印“发送导航目标: x=…, y=…”的提示,并触发机器人开始向目标行进。这段关键代码确保了机器人能够自主追踪目标,正是本项目智能行为的核心体现之一。

(注:完整源代码请参见随附的“我们的代码与相关文件.zip”,其中包含详细实现。)

10 技术难点与解决

在项目研发过程中,我们遇到了多个技术挑战。下面针对主要难点及采用的解决方案进行总结:

  • 难点1:纯视觉SLAM的鲁棒性 CyberDog 2虽有激光雷达,但其自带PC处理能力有限。因此我们采用主要依赖摄像头图像的SLAM。纯视觉SLAM易受光照、纹理等影响,在快速运动时也容易丢失跟踪。为此我们引入IMU融合,采用视觉-惯性SLAM提高鲁棒性。同时调整RTAB-Map参数:增大回环检测频率并降低新关键帧插入阈值,使算法在闭环时及时校正地图;针对光照变化大的场景,使用ORB特征替代原先易受亮度影响的SURF特征。仿真和实测表明,融合IMU后的SLAM在机器人小跑(约0.5 m/s)时依然能维持定位,没有出现明显漂移。
  • 难点2:四足机器人复杂地形中的姿态稳定 与轮式机器人相比,四足机器人在导航转弯时可能出现晃动甚至失去平衡。尤其当CyberDog 2快速变向或侧移时,离心力和惯性可能导致单腿打滑。我们通过改进控制策略解决:在局部路径跟踪中,引入了“减速转向”机制——监测到路径曲率大或需要急转弯时,先将机器人速度平缓降至零,再原地转向至期望朝向后继续前进。这一策略借鉴了差速机器人导航的转弯控制思想,同时结合四足运动学模型调整步态,增大转向时四足支撑面的稳定性。经实验验证,机器人在狭窄空间掉头时不再出现明显晃动,导航轨迹平滑且无跌倒情况。
  • 难点2:实时性能与算力限制 Jetson NX虽有GPU但算力有限,尤其运行SLAM、Nav2和YOLO检测等多个耗资任务时可能出现帧率下降、控制延迟。为保证实时性,我们采取多方面优化:首先在YOLO推理上使用TensorRT将模型量化为FP16以提升推理速度,实测每帧检测耗时由50ms降至20ms左右(320×320输入);其次,对于相机图像,我们降低帧率到15Hz并对不变场景帧进行跳帧处理,同时将RGB图像分辨率从1080p降为720p,在几乎不影响识别准确率情况下减轻SLAM和YOLO的负担;再次,我们利用ROS 2的多线程执行器(MultiThreadedExecutor)将SLAM、导航、识别各节点分配在不同线程,以并行利用CPU多核资源,避免因为单线程串行而造成瓶颈。经过优化,系统在实验场景下各模块均可实时运行:SLAM建图帧率约10Hz,导航控制周期20Hz,YOLO推理15-20Hz,满足任务实时要求。
  • 难点3:多模块协同与通信延迟 在多个功能模块并行运行时,模块间同步与通信延迟是需要关注的问题。例如视觉识别检测到目标后立刻导航,如果通信延迟过高可能错失最佳跟踪时机。我们采取的方法:调整ROS 2 QoS策略,对关键主题(如/detected_object)使用可靠传输且History设置为KEEP_LAST(1)保证最新目标信息快速传递;对实时要求不高的大数据流(如点云)使用Best Effort减少对带宽的占用。此外,我们在任务决策中增加了状态滞后判断:在接收到目标检测后的第一个导航目标发送前,暂停0.1秒等待下一帧图像确认目标未消失,避免因瞬时误检导致的误触发。通过这些措施,各模块协同工作更加流畅,系统没有出现明显的状态不同步或误触发现象。

通过针对性地攻克上述技术难点,本系统在可靠性和稳定性上得到了保障。这些挑战的解决也体现了我们团队在机器人自主系统开发中的问题分析和工程实现能力,为系统最终成功运行提供了支撑。

11 项目评估与展望

项目评估: 在完成系统开发和仿真实验后,我们对本项目的功能完整性和性能指标进行了评估。首先,功能方面,系统达成了赛题要求的自主建图、导航避障和目标识别任务。在官方给定的仿真测试环境中,CyberDog 2能够自主探索构建环境地图,定位误差在0.05 m以内;随后成功规划路径抵达目标区域,并准确识别出指定目标物品。整套流程无需人工干预,机器人表现出较高的自主性。其次,性能方面,根据多次仿真试验数据:建图阶段机器人以约0.4 m/s速度行走,2分钟内完成100㎡区域的地图绘制;导航阶段平均路径跟踪误差0.1 m,避障距离安全裕度0.2 m,无碰撞发生;目标识别准确率在模拟不同光照条件下达到95%以上(基于50次检测中正确识别次数)。系统运行稳定,长达10分钟的任务过程中未出现节点崩溃或显著延迟,Jetson NX计算资源占用率控制在CPU 70%、GPU 50%左右,符合嵌入式实时应用要求。总体而言,本项目在仿真评测中表现优异,达到了初赛作品提交的预期指标,为进入决赛奠定了基础。

项目展望: 在未来工作中,我们计划进一步完善和拓展该系统,以应对更复杂的应用场景和比赛更高阶段的挑战。

  • 真实机器人试验方面,我们将把本系统部署到真实的CyberDog 2机器狗上进行实地测试。重点关注传感器实测数据与仿真模型的差异,如相机畸变、IMU噪声、摩擦力影响等,对算法参数进行相应调整。此外处理真实环境中的不确定因素,例如地面不平导致的抖动、光照变化、动态行人干扰等,提高系统鲁棒性。通过真实测试获取的数据来进一步校准仿真模型,不断逼近真实效果。
  • 算法优化方面,有几条路径可以提升系统性能。一是尝试更先进的SLAM算法,例如ORB-SLAM3(支持多地图和闭环优化)或直接法SLAM,以提高建图效率和精度。二是针对导航规划,考虑引入强化学习方法优化局部避障策略,或采用TEB (Timed Elastic Band)等更平滑的轨迹规划算法以提升机器人行走的顺畅性。三是在目标识别上,可结合Depth信息做3D目标定位,或者引入多目标跟踪算法,使机器人能在存在干扰物的情况下持续锁定真正目标。
  • 多模态交互方面,未来版本系统可集成小爱同学语音模块或自定义语音识别,实现语音指令的启动、停止和模式切换,提高人机交互友好性。也可以利用CyberDog 2的触摸传感器,实现通过轻拍机器人某部位来发出简单指令的功能。这些拓展将使机器人更适合实际应用场景,也展现出更丰富的创新点。
  • 系统迁移和复用方面,我们计划将本项目成果推广到其他机器人平台。例如在有轮移动机器人上复用自主导航与识别模块,只需对接不同的底盘控制接口即可工作。这体现出我们系统设计的通用性和可移植性。如果可能,我们也考虑与小米机器人团队合作,基于CyberDog平台开发更多智能行为,如搬运物品、巡逻安防等,为机器人赋予更高的任务能力。

展望未来,具身智能机器人将在更多领域发挥作用。本项目作为一个起点,探索了四足机器人自主导航与环境交互的技术途径。在大赛后续阶段以及更广阔的研究中,我们将继续完善该系统,不断尝试新的方法提升机器狗的智能水平。我们相信,通过持续的优化和创新,CyberDog 2平台的潜力将被进一步激发,打造出更加出色的智能系统作品,在全国大赛乃至实际应用中取得佳绩。

附录

附录A:主要ROS 2节点与话题列表

为了便于理解系统的通信架构,这里列出了本项目中主要用到的ROS 2节点及其订阅/发布的话题。

节点名称功能订阅的话题(输入)发布的话题(输出)
/camera_driver相机驱动(深度+RGB)无(硬件驱动)/camera/color/image_raw (彩色图像)
/camera/depth/image_rect_raw (深度图像)
/camera/color/camera_info
/imu_driverIMU传感器驱动/imu/data (包含姿态角速度加速度)
/rtabmap (SLAM)视觉SLAM建图与定位/camera/color/image_raw
/camera/depth/image_rect_raw
/imu/data
/map (栅格地图)
/odom (里程计估计)
/tf (包含机器人位姿变换)
/yolov5_detector目标检测(YOLO模型)/camera/color/image_raw/detected_object (目标检测结果,自定义消息,包含类别和相对位置)
/amcl自主定位 (AMCL粒子滤波)/scan (本项目未使用激光,AMCL基于里程计+地图)
/tf (机器人里程计位姿)
/map (静态地图)
/tf (发布机器人在地图中的位置)
/bt_navigator (Nav2)Nav2行为树导航控制/goal_pose (导航目标,由我们发送)/cmd_vel (导航计算出的速度指令)
/planner_server (Nav2)Nav2全局路径规划/map
/tf (机器人工具坐标)
/plan (全局路径)
/controller_server (Nav2)Nav2局部控制/plan (全局路径)
/scan(或PointCloud)
/cmd_vel (局部避障修正后的速度)
/target_tracker目标跟踪决策(自定义节点)/detected_object (来自YOLO的目标位置)调用Nav2 NavigateToPose动作 (相当于发送导航目标)

(注:以上为主要节点,实际系统中还包括生命周期管理、RViz可视化等辅助节点,此处从略)

通过上述节点与话题列表可以看出,系统的信息流从传感器驱动开始,经SLAM与目标识别处理,进入导航决策,最后输出到运动控制。在实际实现中,我们也对部分话题进行了Remap和参数配置以确保命名一致、频率合理。这份列表有助于比赛评审老师了解我们系统工程实现的细节和规范程度。

附录B:参数配置与运行说明

  1. SLAM参数: RTAB-Map使用配置文件rtabmap.ini调整关键参数,例如Mem/IncrementalMemory=True(启用增量建图)、RGBD/LinearUpdate=0.1(每移动0.1m插入一个关键帧)、RGBD/LoopClosureThreshold=0.11(回环检测评分阈值)等。IMU融合通过参数Reg/Strategy=3启用,提升定位效果。
  2. Nav2参数:nav2_params.yaml中设置了全局代价地图分辨率为0.05、膨胀半径0.2 m;DWB局部Planner的速度上限为0.3 m/s(前进)和0.2 m/s(旋转);Recovery行为顺序调整为Spin -> BackUp,两次尝试后放弃。本项目还简化了Nav2的行为树以适应单目标任务。
  3. 运行方式: 本系统提供了统一的启动脚本bringup_launch.py,可一键启动仿真环境中的所有节点。运行命令:ros2 launch cyberdog_bringup bringup_launch.py world:=<world_file> mode:=simulation。其中world_file为仿真环境文件路径,mode参数选择仿真或实物。在比赛评测时,只需运行此launch文件,即可在Gazebo中观看机器人自主完成任务的全过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/907681.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/907681.shtml
英文地址,请注明出处:http://en.pswp.cn/news/907681.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始理解机器学习:知识体系 + 核心术语详解

你可能听说过“机器学习”&#xff0c;觉得它很神秘&#xff0c;像是让电脑自己学会做事。其实&#xff0c;机器学习的本质很简单&#xff1a;通过数据来自动建立规则&#xff0c;从而完成预测或决策任务。 这篇文章将带你系统梳理机器学习的知识体系&#xff0c;并用贴近生活…

springboot集成websocket给前端推送消息

一般通常情况下&#xff0c;我们都是前端主动朝后端发送请求&#xff0c;那么有没有可能&#xff0c;后端主动给前端推送消息呢&#xff1f;这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程&#xff0c;该工程的整体结构如下&a…

【清晰教程】查看和修改Git配置情况

目录 查看安装版本 查看特定配置 查看全局配置 查看本地仓库配置 设置或修改配置 查看安装版本 打开命令行工具&#xff0c;通过version命令检查Git版本号。 git --version 如果显示出 Git 的版本号&#xff0c;说明 Git 已经成功安装。 查看特定配置 如果想要查看特定…

【Github/Gitee Webhook触发自动部署-Jenkins】

Github/Gitee Webhook触发自动部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…

C语言数据结构-链式栈

头文件&#xff1a;stack.h #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /* 链式栈节点类型 */ typedef struct staNode { DataType data; struct staNode *pNext; }StackNode; /* 链式栈…

M4Pro安装ELK(ElasticSearch+LogStash+Kibana)踩坑记录

ElasticSearch安装&#xff0c;启动端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…

Java互联网大厂面试:从Spring Boot到Kafka的技术深度探索

Java互联网大厂面试&#xff1a;从Spring Boot到Kafka的技术深度探索 在某家互联网大厂的面试中&#xff0c;面试官A是一位技术老兵&#xff0c;而被面试者谢飞机&#xff0c;号称有丰富的Java开发经验。以下是他们的面试情景&#xff1a; 场景&#xff1a;电商平台的后端开发…

机器学习算法——KNN

一、KNN算法简介 1.KNN思想 &#xff08;1&#xff09;K-近邻算法 根据你的“邻居”来推断你是什么类别 KNN算法思想&#xff1a;如果一个样本在特征空间&#xff08;训练集&#xff09;中的k个最相似的样本中的大多数属于某一个类别。则该样本也属于这个类别 &#xff08…

如何评估CAN总线信号质量

CAN总线网络的性能在很大程度上取决于其信号质量。信号质量差可能导致通信错误&#xff0c;进而引发系统故障、效率降低甚至安全隐患。因此&#xff0c;评估和确保CAN总线信号质量是维护系统健康和可靠性的关键。 在CAN总线网络中&#xff0c;数据通过双绞线上的差分信号传输。…

封装一个小程序选择器(可多选、单选、搜索)

组件 <template><view class"popup" v-show"show"><view class"bg" tap"cancelMultiple"></view><view class"selectMultiple"><view class"multipleBody"><view class&…

2.1HarmonyOS NEXT开发工具链进阶:DevEco Studio深度实践

HarmonyOS NEXT开发工具链进阶&#xff1a;DevEco Studio深度实践 在HarmonyOS NEXT全栈自研的技术体系下&#xff0c;DevEco Studio作为一站式开发平台&#xff0c;通过深度整合分布式开发能力&#xff0c;为开发者提供了从代码编写到多端部署的全流程支持。本章节将围绕多设…

LLMs之Tool:Workflow Use的简介、特点、安装和使用方法、以及案例应用

LLMs之Tool&#xff1a;Workflow Use的简介、特点、安装和使用方法、以及案例应用 目录 Workflow Use的简介 1、Workflow Use的特点 2、Workflow Use的愿景和路线图 Workflow Use的安装和使用方法 1、安装 2、使用方法 查看所有命令 从 Python 中使用&#xff1a; 启动…

二分法算法技巧-思维提升

背景&#xff1a; 在写力扣题目“搜素插入位置 ”时&#xff0c;发现二分法的一个细节点&#xff0c;打算记录下来&#xff0c;先看一张图&#xff1a; 我们知道&#xff0c;排序数组&#xff0c;更高效的是二分查找法~~~而二分法就是切割中间&#xff0c;定义left是最开始的&…

Python 训练营打卡 Day 40

训练和测试的规范写法 一、黑白图片的规范写法&#xff0c;以MNIST数据集为例 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 用于加载MNIST数据集 from torch.utils.data import DataLoader # 用于创建…

数据结构之栈:原理与常用方法

1. 栈的定义 Stack是Vector的一个子类&#xff0c;它实现标准的后进先出堆栈。Stack只定义了创建空堆栈的默认构造方法。&#xff08;实际上是实现了List接口&#xff0c;因为Vector是List的子类&#xff09;。 Stack() // 创建一个空栈 2. 栈的基本操作 // 压栈操作 publi…

鸿蒙OSUniApp 开发支持图片和视频的多媒体展示组件#三方框架 #Uniapp

使用 UniApp 开发支持图片和视频的多媒体展示组件 前言 在现代移动应用中&#xff0c;图片和视频已成为内容展示的主流形式。一个优秀的多媒体展示组件不仅能提升用户体验&#xff0c;还能增强产品的互动性和视觉冲击力。随着鸿蒙&#xff08;HarmonyOS&#xff09;生态的不断…

STM32CubeMX,arm-none-eabi-gcc简单试用

在windows下&#xff0c;为stm32系列单片机编程&#xff0c;keil有了免费的试用版&#xff0c;有很多开发板示例&#xff0c;给学习单片机编程带来很大的方便。 STM32CubeMX提供了stm32单片机的功能设置&#xff0c;在输出方式上给出了几种方式&#xff0c;有mdk&#xff08;k…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

Android 13中 配置签名文件与内置相应的Apk

目录 1.问题场景 2.实现思路 3.将测试代码做成APK并配置签名 4.将apk内置到系统当中的方法 1.问题场景 在展讯平台中Android13的源码已知的情况下&#xff0c;客户写了一个测试类用于调用系统中的一些接口来检验一些功能。为了方便调试排查问题我首先的思路是将客户写的测试…