器人運(yùn)動(dòng)會(huì)技術(shù)拆解:ROS2導(dǎo)航避障與視覺(jué)識(shí)別實(shí)戰(zhàn))
這篇不從新聞角度討論事件只從開(kāi)發(fā)視角聊一件事機(jī)器人運(yùn)動(dòng)會(huì)背后到底考的是什么技術(shù)。媒體鏡頭里是一臺(tái)臺(tái)跑動(dòng)、抓取、避障的機(jī)器人但落到開(kāi)發(fā)者面前核心是一條完整的鏈路機(jī)器人怎么選型導(dǎo)航怎么跑通視覺(jué)怎么識(shí)別多機(jī)怎么通信現(xiàn)場(chǎng)怎么調(diào)試數(shù)據(jù)怎么回放。如果你準(zhǔn)備參加機(jī)器人運(yùn)動(dòng)會(huì)、機(jī)器人競(jìng)賽或者只是想借這類賽事驗(yàn)證自己的算法那最先要看的是幾個(gè)硬指標(biāo)機(jī)器人支持 ROS2 還是廠家自研 SDK能不能先跑仿真驗(yàn)證有沒(méi)有視覺(jué)和點(diǎn)云接口主控算力是什么級(jí)別現(xiàn)場(chǎng)是否允許無(wú)線調(diào)試有沒(méi)有可靠的急停和安全機(jī)制。這些問(wèn)題比“誰(shuí)的機(jī)器人跑得快”更影響備賽進(jìn)度。下面這套技術(shù)路徑比較通用覆蓋項(xiàng)目分類、環(huán)境準(zhǔn)備、導(dǎo)航避障、視覺(jué)識(shí)別、日志記錄和性能觀察。北京這次機(jī)器人運(yùn)動(dòng)會(huì)只是引子實(shí)際各類機(jī)器人賽事和運(yùn)動(dòng)會(huì)的做法高度相似。具體比賽項(xiàng)目清單、規(guī)則和硬件限制以主辦方現(xiàn)場(chǎng)公布為準(zhǔn)。1. 核心能力速覽先給一張速覽表方便快速判斷自己手上的團(tuán)隊(duì)和機(jī)器人能不能參賽以及需要補(bǔ)哪塊。能力項(xiàng)說(shuō)明項(xiàng)目類型人形機(jī)器人、四足機(jī)器人、輪式機(jī)器人、工業(yè)機(jī)器人、仿真機(jī)器人等多類競(jìng)賽常見(jiàn)技術(shù)棧ROS2、Python、C、Gazebo 仿真、SLAM 導(dǎo)航、OpenCV / YOLO 視覺(jué)識(shí)別主要驗(yàn)證能力運(yùn)動(dòng)控制、導(dǎo)航避障、視覺(jué)識(shí)別、多機(jī)通信、遙操作、自動(dòng)任務(wù)執(zhí)行推薦硬件具備 4 核以上 CPU 的筆記本即可做仿真實(shí)機(jī)按機(jī)器人主控算力評(píng)估顯存依賴純導(dǎo)航和運(yùn)動(dòng)控制不需要獨(dú)立顯卡視覺(jué)識(shí)別可優(yōu)先用 CPU 模型若有 GPU 則更穩(wěn)支持平臺(tái)Ubuntu 22.04、Windows 部分仿真可通過(guò) WSL 使用實(shí)機(jī)一般用 Linux啟動(dòng)方式Docker、命令行、launch 文件、仿真環(huán)境一鍵啟動(dòng)是否支持 APIROS2 話題 / 服務(wù)接口天然支持進(jìn)程間調(diào)用可用于自動(dòng)化測(cè)試是否支持批量任務(wù)可通過(guò) ros2 bag 批量記錄、Python 腳本批量跑場(chǎng)景適合場(chǎng)景備賽訓(xùn)練、機(jī)器人選型、算法驗(yàn)證、多機(jī)器人調(diào)度測(cè)試、教學(xué)實(shí)驗(yàn)從這張表能看出機(jī)器人運(yùn)動(dòng)會(huì)的門檻不只是“買一臺(tái)機(jī)器人”而是“能不能把機(jī)器人在真實(shí)場(chǎng)地里穩(wěn)定跑完一個(gè)任務(wù)”。仿真環(huán)境可以大幅降低前期試錯(cuò)成本。2. 適用場(chǎng)景與使用邊界機(jī)器人運(yùn)動(dòng)會(huì)適合這幾類人備賽學(xué)生團(tuán)隊(duì)想在賽前快速驗(yàn)證導(dǎo)航和視覺(jué)方案的開(kāi)發(fā)者企業(yè)工程師想通過(guò)賽事項(xiàng)目評(píng)估機(jī)器人平臺(tái)的穩(wěn)定性教學(xué)場(chǎng)景用運(yùn)動(dòng)會(huì)項(xiàng)目驅(qū)動(dòng)學(xué)生完成從建圖到自動(dòng)導(dǎo)航的完整項(xiàng)目。它能解決的問(wèn)題也很明確把零散的機(jī)器人技術(shù)點(diǎn)串成完整任務(wù)。比如一個(gè)“自動(dòng)搬運(yùn)”項(xiàng)目就同時(shí)涉及建圖、定位、路徑規(guī)劃、避障、機(jī)械臂抓取和任務(wù)調(diào)度。這個(gè)過(guò)程能逼你把 ROS2 通信、運(yùn)動(dòng)控制、視覺(jué)識(shí)別和異常處理全部走一遍。但也有不適合的場(chǎng)景沒(méi)有安全圍欄和急停機(jī)制就直接做高速人機(jī)交互實(shí)驗(yàn)。對(duì)機(jī)器人底層機(jī)制還不熟悉就直接上強(qiáng)化學(xué)習(xí)或大模型控制。用未授權(quán)的數(shù)據(jù)集訓(xùn)練識(shí)別模型或者把現(xiàn)場(chǎng)觀眾人臉數(shù)據(jù)隨意上傳。比賽規(guī)則都沒(méi)確認(rèn)就按自己的理解先把機(jī)器人改裝到“高性能”狀態(tài)結(jié)果不符合賽項(xiàng)限制。使用邊界要提前劃定。涉及人臉、車輛、隱私數(shù)據(jù)的識(shí)別類項(xiàng)目必須確認(rèn)數(shù)據(jù)來(lái)源合法并且只在本機(jī)測(cè)試。涉及工業(yè)機(jī)器人或人形機(jī)器人測(cè)試必須在明確的安全防護(hù)措施下進(jìn)行。涉及到四足機(jī)器人和人形機(jī)器人的遙控要注意電機(jī)負(fù)載和關(guān)節(jié)限位避免因失控導(dǎo)致設(shè)備損壞或人員受傷。3. 機(jī)器人運(yùn)動(dòng)會(huì)項(xiàng)目分類與技術(shù)棧拆解機(jī)器人運(yùn)動(dòng)會(huì)的項(xiàng)目通常能分成幾大類每類的技術(shù)側(cè)重點(diǎn)完全不同。3.1 人形機(jī)器人項(xiàng)目常見(jiàn)形式是競(jìng)速、體操、越障或者完成指定動(dòng)作。技術(shù)點(diǎn)集中在步態(tài)控制、姿態(tài)平衡、關(guān)節(jié)運(yùn)動(dòng)規(guī)劃和視覺(jué)定位。硬件上需要高扭矩關(guān)節(jié)電機(jī)、IMU 慣性測(cè)量單元和足夠算力的主控。技術(shù)棧上運(yùn)動(dòng)控制可能用廠家 SDK也可能用 ROS2 控制關(guān)節(jié)視覺(jué)規(guī)劃階段常用 OpenCV 做標(biāo)記識(shí)別再配合深度相機(jī)測(cè)距。如果項(xiàng)目允許遙操作還需要考慮手柄或 VR 頭顯接入降低算法開(kāi)發(fā)復(fù)雜度。3.2 四足機(jī)器人項(xiàng)目常見(jiàn)形式是越障、爬坡、跟隨、定點(diǎn)巡邏。四足機(jī)器人的核心是步態(tài)規(guī)劃和機(jī)身姿態(tài)控制。較成熟的方案是宇樹(shù)、小米等廠家的 SDK配合 ROS2 接口做上層應(yīng)用。運(yùn)動(dòng)會(huì)場(chǎng)景里四足機(jī)器人通常要跑“視覺(jué)跟隨”“自主導(dǎo)航”“摔倒恢復(fù)”這類任務(wù)。你需要重點(diǎn)測(cè)試的不是單步動(dòng)作而是連續(xù)任務(wù)下的穩(wěn)定性。比如機(jī)器人在不平整路面上走 10 米能否保持位姿規(guī)劃不漂移。3.3 輪式機(jī)器人導(dǎo)航項(xiàng)目這是門檻最低、參與度最高的類別。常見(jiàn)任務(wù)是在場(chǎng)地內(nèi)從 A 點(diǎn)走到 B 點(diǎn)或者巡檢多個(gè)目標(biāo)點(diǎn)并避讓障礙物。技術(shù)棧相對(duì)固定激光雷達(dá)或深度相機(jī)建圖使用 Cartographer 或 SLAM Toolbox定位用 AMCL規(guī)劃用 Nav2。如果你第一次參加運(yùn)動(dòng)會(huì)建議從這類項(xiàng)目開(kāi)始因?yàn)檩喪綑C(jī)器人硬件成本低、調(diào)試鏈路短出成績(jī)概率高。3.4 工業(yè)機(jī)器人項(xiàng)目常見(jiàn)形式是碼垛、裝配、分揀。這種項(xiàng)目通常使用 ABB、發(fā)那科、庫(kù)卡或國(guó)產(chǎn)協(xié)作機(jī)器人。技術(shù)點(diǎn)不再是運(yùn)動(dòng)控制本身而是軌跡規(guī)劃、抓取位姿標(biāo)定、視覺(jué)引導(dǎo)和 PLC 聯(lián)動(dòng)。工業(yè)機(jī)器人項(xiàng)目對(duì)安全和流程要求最高。賽前必須完成碰撞檢測(cè)測(cè)試、工作空間限制設(shè)置和急停驗(yàn)證。視覺(jué)引導(dǎo)環(huán)節(jié)要先做相機(jī)與機(jī)器人坐標(biāo)系的手眼標(biāo)定標(biāo)定誤差會(huì)直接決定抓取成功率。3.5 仿真實(shí)戰(zhàn)項(xiàng)目現(xiàn)在越來(lái)越多賽事包含仿真環(huán)節(jié)或者在仿真環(huán)境里先跑初賽。常見(jiàn)仿真平臺(tái)有 Gazebo、Webots、Isaac Sim以及一些賽事官方指定的仿真器。仿真項(xiàng)目看起來(lái)“只要?jiǎng)哟a”實(shí)際難點(diǎn)是仿真和真機(jī)不一致性。Gazebo 里能跑通的導(dǎo)航真機(jī)上可能因?yàn)檩喿哟蚧⒗锍逃?jì)噪聲而失敗。建議仿真用于驗(yàn)證流程和算法邏輯真機(jī)用于驗(yàn)證機(jī)械和傳感器性能兩者不能互相替代。4. 環(huán)境準(zhǔn)備與前置條件不管參加哪個(gè)項(xiàng)目環(huán)境準(zhǔn)備是第一道坎。建議團(tuán)隊(duì)統(tǒng)一使用一個(gè)版本組合避免“一個(gè)人能跑另一個(gè)人跑不了”的問(wèn)題。4.1 操作系統(tǒng)與軟件版本最穩(wěn)妥的組合是 Ubuntu 22.04 搭配 ROS2 Humble這也是當(dāng)前絕大多數(shù)機(jī)器人開(kāi)發(fā)教程的默認(rèn)環(huán)境。Windows 系統(tǒng)可以用 WSL 或者 Docker但涉及 USB 攝像頭、串口和雷達(dá)接入時(shí)還是原生 Linux 更省心。以下命令用于檢查基礎(chǔ)環(huán)境實(shí)際版本號(hào)以你安裝的發(fā)行版為準(zhǔn)# 檢查系統(tǒng)版本 lsb_release -a # 檢查 ROS2 是否安裝 ros2 --version # 檢查仿真器 gazebo --version # 檢查 Python python3 --version # 檢查顯卡驅(qū)動(dòng)可選 nvidia-smi如果命令提示找不到說(shuō)明對(duì)應(yīng)的依賴還沒(méi)有安裝。不要跳過(guò)這個(gè)檢查步驟后面很多問(wèn)題都是環(huán)境不一致導(dǎo)致的。4.2 機(jī)器人選型建議選型直接決定備賽效率。如果團(tuán)隊(duì)沒(méi)有指定硬件按這個(gè)優(yōu)先級(jí)判斷先選有 ROS2 官方支持或穩(wěn)定 SDK 的機(jī)器人不要選資料很少的半開(kāi)源平臺(tái)。導(dǎo)航類比賽優(yōu)先選輪式差速底盤帶激光雷達(dá)價(jià)格適中且調(diào)試容易。四足和人形機(jī)器人先確認(rèn)是否支持仿真器和真機(jī)同一套代碼否則開(kāi)發(fā)成本會(huì)翻倍。如果要跑視覺(jué)識(shí)別確定主控能跑 YOLO 或者輕量級(jí)分類模型。算力不夠時(shí)優(yōu)先使用 CPU 版 ONNX 模型或者把識(shí)別任務(wù)放到上位機(jī)。4.3 網(wǎng)絡(luò)與通信環(huán)境運(yùn)動(dòng)會(huì)現(xiàn)場(chǎng)通常人多、Wi-Fi 復(fù)雜。多機(jī)通信和遠(yuǎn)程調(diào)試容易受影響。建議準(zhǔn)備一個(gè)獨(dú)立的 5G 頻段路由器或者直接用網(wǎng)線連接機(jī)器人和調(diào)試電腦?,F(xiàn)場(chǎng)無(wú)線調(diào)試前先用有線方式把基本功能都驗(yàn)證一遍最后再測(cè)試無(wú)線環(huán)境的延遲和丟包。5. 從零搭建一個(gè)最小可跑通的機(jī)器人任務(wù)用一個(gè)“導(dǎo)航避障 視覺(jué)識(shí)別”的最小任務(wù)作為示例這套流程適用于大多數(shù)輪式機(jī)器人運(yùn)動(dòng)會(huì)項(xiàng)目。5.1 創(chuàng)建 ROS2 工作空間mkdir -p ~/robot_ws/src cd ~/robot_ws/src # 創(chuàng)建功能包依賴 rclpy 和 geometry_msgs ros2 pkg create robot_demo --build-type ament_python --dependencies rclpy geometry_msgs sensor_msgs cv_bridge創(chuàng)建完成后后續(xù)代碼都放在robot_demo/robot_demo/目錄下啟動(dòng)文件放在launch/目錄下。5.2 編寫鍵盤遙控節(jié)點(diǎn)鍵盤遙控是調(diào)試機(jī)器人的基礎(chǔ)功能。先寫一個(gè)簡(jiǎn)單的速度發(fā)布節(jié)點(diǎn)通過(guò)鍵盤的 WASD 控制機(jī)器人前后左右按 Q 退出。import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist import sys import termios import tty class TeleopNode(Node): def __init__(self): super().__init__(teleop_node) self.publisher self.create_publisher(Twist, /cmd_vel, 10) self.speed 0.2 self.turn 0.4 def publish_vel(self, linear, angular): msg Twist() msg.linear.x linear msg.angular.z angular self.publisher.publish(msg) def run(self): print(WASD 控制移動(dòng)Q 退出) fd sys.stdin.fileno() old_settings termios.tcgetattr(fd) try: tty.setraw(fd) while True: ch sys.stdin.read(1) if ch q: self.publish_vel(0.0, 0.0) break elif ch w: self.publish_vel(self.speed, 0.0) elif ch s: self.publish_vel(-self.speed, 0.0) elif ch a: self.publish_vel(0.0, self.turn) elif ch d: self.publish_vel(0.0, -self.turn) else: self.publish_vel(0.0, 0.0) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) def main(argsNone): rclpy.init(argsargs) node TeleopNode() try: node.run() except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown()這個(gè)節(jié)點(diǎn)只做一件事把鍵盤輸入轉(zhuǎn)成/cmd_vel話題上的速度指令。如果機(jī)器人沒(méi)反應(yīng)先檢查rostopic echo /cmd_vel是否有數(shù)據(jù)再檢查底盤驅(qū)動(dòng)是否訂閱了同一個(gè)話題名。5.3 啟動(dòng)導(dǎo)航與仿真如果使用 Nav2啟動(dòng)流程通常是先啟動(dòng)機(jī)器人模型和傳感器驅(qū)動(dòng)再啟動(dòng)定位和規(guī)劃模塊。下面是一份 launch 文件模板實(shí)際包名和路徑需要替換成你自己的配置# launch/demo_launch.py from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagerobot_demo, executableteleop_node, nameteleop_node, outputscreen ), Node( packagenav2_bringup, executablebringup_launch.py, namenav2_bringup, parameters[params/nav2_params.yaml] ) ])在真機(jī)場(chǎng)景下還需要啟動(dòng)激光雷達(dá)驅(qū)動(dòng)和底盤驅(qū)動(dòng)。運(yùn)動(dòng)會(huì)現(xiàn)場(chǎng)最容易犯的錯(cuò)誤是“只啟動(dòng)了導(dǎo)航模塊忘了啟動(dòng)底盤驅(qū)動(dòng)”導(dǎo)致/cmd_vel話題沒(méi)有訂閱者。建議每次啟動(dòng)前運(yùn)行ros2 topic list檢查關(guān)鍵話題是否存在。5.4 視覺(jué)識(shí)別節(jié)點(diǎn)示例以 YOLO 為例可以直接用 ONNX 模型配合 OpenCV 做推理。下面的代碼是一個(gè)通用模板輸入為圖像話題輸出為檢測(cè)到目標(biāo)后的坐標(biāo)信息。import cv2 import numpy as np import rclpy from rclpy.node import Node from sensor_msgs.msg import Image from cv_bridge import CvBridge class VisionNode(Node): def __init__(self): super().__init__(vision_node) self.subscription self.create_subscription( Image, /camera/image_raw, self.image_callback, 10 ) self.bridge CvBridge() self.net cv2.dnn.readNetFromONNX(model/yolov8n.onnx) def image_callback(self, msg): frame self.bridge.imgmsg_to_cv2(msg, desired_encodingbgr8) blob cv2.dnn.blobFromImage(frame, 1/255.0, (640, 640), swapRBTrue) self.net.setInput(blob) outputs self.net.forward() self.get_logger().info(f推理輸出 shape: {outputs.shape}) def main(argsNone): rclpy.init(argsargs) node VisionNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown()這個(gè)節(jié)點(diǎn)的重點(diǎn)不是識(shí)別精度而是驗(yàn)證“攝像頭圖像 - 推理 - 輸出結(jié)果”這個(gè)鏈路是否穩(wěn)定。視覺(jué)識(shí)別在運(yùn)動(dòng)會(huì)現(xiàn)場(chǎng)最大的坑是光照變化仿真環(huán)境調(diào)好的閾值到了真實(shí)場(chǎng)地很可能失效所以現(xiàn)場(chǎng)必須重新標(biāo)定。6. 功能測(cè)試與效果驗(yàn)證完成基礎(chǔ)開(kāi)發(fā)后按功能逐項(xiàng)測(cè)試。建議用表格記錄每一輪測(cè)試結(jié)果不要憑感覺(jué)判斷。6.1 鍵盤遙控測(cè)試測(cè)試目的確認(rèn)底盤驅(qū)動(dòng)、電機(jī)、話題通信正常。操作步驟啟動(dòng)底盤驅(qū)動(dòng)再啟動(dòng)遙控節(jié)點(diǎn)按 WASD 控制機(jī)器人移動(dòng)。預(yù)期結(jié)果機(jī)器人前進(jìn)、后退、左右轉(zhuǎn)方向正確松開(kāi)按鍵后停止。判斷標(biāo)準(zhǔn)剎車沒(méi)有明顯慣性滑行遙控延遲在可接受范圍內(nèi)。常見(jiàn)失敗電機(jī)方向接反、話題名不匹配、遙控節(jié)點(diǎn)沒(méi)有發(fā)布數(shù)據(jù)。6.2 導(dǎo)航目標(biāo)點(diǎn)測(cè)試測(cè)試目的驗(yàn)證建圖、定位、路徑規(guī)劃和避障。操作步驟先手動(dòng)遙控建圖保存地圖再啟動(dòng) AMCL 和 Nav2使用 RViz2 的 2D Goal Pose 發(fā)布目標(biāo)點(diǎn)。預(yù)期結(jié)果機(jī)器人規(guī)劃出可行路徑并抵達(dá)目標(biāo)點(diǎn)遇到障礙物時(shí)重新規(guī)劃。判斷標(biāo)準(zhǔn)無(wú)劇烈抖動(dòng)無(wú)反復(fù)橫擺能繞開(kāi)靜態(tài)障礙物。常見(jiàn)失敗地圖質(zhì)量差、里程計(jì)漂移、代價(jià)地圖參數(shù)不合理。6.3 視覺(jué)識(shí)別測(cè)試測(cè)試目的驗(yàn)證目標(biāo)識(shí)別和本地圖像處理鏈路。操作步驟使用一張本地圖片測(cè)試模型確認(rèn)可以輸出類別和坐標(biāo)再接入攝像頭實(shí)時(shí)測(cè)試。預(yù)期結(jié)果目標(biāo)框穩(wěn)定顯示推理幀率滿足任務(wù)需要。判斷標(biāo)準(zhǔn)漏檢率低誤檢率可接受推理延遲不影響任務(wù)執(zhí)行。常見(jiàn)失敗模型格式不兼容、圖像尺寸不匹配、曝光過(guò)強(qiáng)導(dǎo)致檢測(cè)不到目標(biāo)。6.4 多機(jī)通信測(cè)試如果運(yùn)動(dòng)會(huì)項(xiàng)目涉及多臺(tái)機(jī)器人協(xié)作多機(jī)通信是必測(cè)項(xiàng)。# 在機(jī)器人 1 上發(fā)布消息 ros2 topic pub /robot1/status std_msgs/msg/String data: ready --once # 在機(jī)器人 2 上訂閱消息 ros2 topic echo /robot1/status兩臺(tái)設(shè)備要保證處于同一局域網(wǎng)并且ROS_DOMAIN_ID一致?,F(xiàn)場(chǎng)如果出現(xiàn)“話題能看到但收不到數(shù)據(jù)”先檢查防火墻和網(wǎng)段再檢查 DDS 發(fā)現(xiàn)協(xié)議是否被隔離。6.5 仿真與真機(jī)一致性測(cè)試賽前至少做一次“同一套代碼仿真和真機(jī)各跑一遍”的對(duì)比測(cè)試。重點(diǎn)觀察機(jī)器人到位后是否存在明顯偏差。里程計(jì)漂移程度。視覺(jué)識(shí)別的顏色和亮度差異。通信延遲差異。如果仿真里任務(wù)完成率 90%真機(jī)只有 40%說(shuō)明 Sim2Real 的 gap 太大需要先調(diào)傳感器模型和底盤參數(shù)不要直接改任務(wù)邏輯。7. 日志記錄與批量調(diào)試運(yùn)動(dòng)會(huì)備賽過(guò)程中最容易被忽視的就是日志。沒(méi)有日志現(xiàn)場(chǎng)出了問(wèn)題只能靠肉眼觀察效率極低。7.1 使用 ros2 bag 記錄話題數(shù)據(jù)# 記錄所有話題數(shù)據(jù)到當(dāng)前目錄 ros2 bag record -a -o bag_20260826_1000 # 記錄指定話題 ros2 bag record -o nav_data \ /cmd_vel /odom /scan /map記錄完成后可以用離線回放的方式復(fù)現(xiàn)問(wèn)題ros2 bag play bag_20260826_1000回放時(shí)可以用 RViz2 訂閱原始話題觀察機(jī)器人當(dāng)時(shí)的傳感器數(shù)據(jù)和規(guī)劃結(jié)果。這個(gè)能力在處理“偶發(fā)避障失敗”問(wèn)題時(shí)特別有用。7.2 批量跑測(cè)試場(chǎng)景如果項(xiàng)目要求機(jī)器人多次執(zhí)行同一個(gè)任務(wù)建議寫一個(gè)自動(dòng)化腳本記錄每次測(cè)試的參數(shù)和結(jié)果。import subprocess import time import json from pathlib import Path results [] for i in range(5): start time.time() result subprocess.run( [ros2, launch, robot_demo, task.launch.py], capture_outputTrue, textTrue, timeout120 ) elapsed time.time() - start results.append({ round: i 1, success: result.returncode 0, elapsed: round(elapsed, 2) }) Path(test_results.json).write_text( json.dumps(results, indent2, ensure_asciiFalse) )批量測(cè)試時(shí)輸出目錄要按日期和場(chǎng)景分層。建議目錄結(jié)構(gòu)如下robot_ws/ ├── bags/ │ └── 20260826/ │ ├── task1_round1/ │ └── task1_round2/ ├── test_results/ │ └── 20260826_task1.json ├── maps/ └── logs/8. 資源占用與性能觀察機(jī)器人運(yùn)動(dòng)會(huì)現(xiàn)場(chǎng)性能和穩(wěn)定性比功能齊全更重要。核心觀察點(diǎn)有三個(gè)主控 CPU 占用、內(nèi)存占用、傳感器和規(guī)劃節(jié)點(diǎn)的實(shí)時(shí)性。常用命令# 查看所有 ROS2 節(jié)點(diǎn)的執(zhí)行頻率 ros2 topic hz /odom ros2 topic hz /scan ros2 topic hz /cmd_vel # 查看系統(tǒng)資源占用 htop # 查看 GPU 占用如果視覺(jué)識(shí)別用 GPU nvidia-smi -l 1重點(diǎn)關(guān)注幾個(gè)指標(biāo)/odom頻率是否穩(wěn)定。差速底盤通常 30Hz 到 50Hz頻率突然下降說(shuō)明里程計(jì)計(jì)算阻塞。/scan頻率是否穩(wěn)定。激光雷達(dá)頻率通常是 10Hz如果降頻可能是 CPU 負(fù)載過(guò)高。/cmd_vel是否持續(xù)輸出。導(dǎo)航過(guò)程中如果長(zhǎng)時(shí)間沒(méi)有新的速度指令說(shuō)明規(guī)劃器可能死鎖或者路徑丟失。運(yùn)動(dòng)控制本身不占 GPU但視覺(jué)識(shí)別會(huì)。如果主控算力緊張優(yōu)先做三件事降低輸入圖像分辨率從 1280 降到 640推理延遲通常能下降一半。降低推理頻率從每幀推理改為每 3 幀推理一次。關(guān)閉不必要的可視化界面RViz2 的 3D 渲染在低算力平臺(tái)上非常耗 CPU。仿真環(huán)境的資源占用通常比真機(jī)高因?yàn)檫€要渲染 3D 場(chǎng)景。如果本機(jī)無(wú)法流暢跑仿真可以考慮降低仿真器畫(huà)質(zhì)或者換用輕量級(jí)仿真平臺(tái)。9. 常見(jiàn)問(wèn)題與排查方法下表匯總了機(jī)器人運(yùn)動(dòng)會(huì)備賽中最高頻的幾類問(wèn)題排查順序先行后難。問(wèn)題現(xiàn)象可能原因排查方式解決方案機(jī)器人無(wú)響應(yīng)底盤驅(qū)動(dòng)未啟動(dòng)運(yùn)行ros2 topic list檢查是否有速度話題啟動(dòng)底盤驅(qū)動(dòng)檢查電源和串口遙控方向相反電機(jī)接線或驅(qū)動(dòng)參數(shù)錯(cuò)誤給正向速度指令觀察運(yùn)動(dòng)方向在驅(qū)動(dòng)配置中反轉(zhuǎn)電機(jī)方向?qū)Ш揭?guī)劃失敗地圖不完整或里程計(jì)漂移回放 bag 看/map和/odom重新建圖檢查輪距和編碼器參數(shù)導(dǎo)航反復(fù)橫擺代價(jià)地圖參數(shù)不合理調(diào)整膨脹半徑觀察/local_costmap增大膨脹半徑降低最大速度視覺(jué)識(shí)別漏檢嚴(yán)重光照變化或模型過(guò)擬合現(xiàn)場(chǎng)采集圖片離線測(cè)試采集更多現(xiàn)場(chǎng)樣本調(diào)整曝光仿真和真機(jī)表現(xiàn)不一致傳感器噪聲模型差異大對(duì)比兩個(gè)環(huán)境的里程計(jì)數(shù)據(jù)在仿真中加入噪聲模型調(diào)整標(biāo)定多機(jī)通信不穩(wěn)定網(wǎng)絡(luò)隔離或 DDS 配置不一致檢查兩端ROS_DOMAIN_ID和網(wǎng)段統(tǒng)一配置關(guān)閉防火墻或添加白名單主控 CPU 占用過(guò)高可視化或推理耗資源運(yùn)行htop查看進(jìn)程關(guān)閉 RViz 渲染降低圖像分辨率機(jī)器人突然停止急停觸發(fā)或看門狗超時(shí)查看底盤驅(qū)動(dòng)日志和急停狀態(tài)確認(rèn)急停復(fù)位調(diào)整看門狗參數(shù)bag 記錄數(shù)據(jù)過(guò)大話題數(shù)據(jù)量太大檢查磁盤剩余空間指定關(guān)鍵話題記錄設(shè)置壓縮排查問(wèn)題時(shí)要遵循一個(gè)原則先確認(rèn)硬件狀態(tài)再查話題數(shù)據(jù)最后才懷疑算法問(wèn)題。很多時(shí)候?qū)Ш揭?guī)劃失敗是因?yàn)槔走_(dá)沒(méi)轉(zhuǎn)或者地圖文件路徑錯(cuò)誤而不是算法 bug。10. 最佳實(shí)踐與下一步結(jié)合運(yùn)動(dòng)會(huì)備賽的常見(jiàn)節(jié)奏這里給幾條工程化建議。第一第一次跑通任務(wù)時(shí)不要追求高指標(biāo)。先用最低速度、最小地圖、最簡(jiǎn)單場(chǎng)景把全鏈路跑通再逐步增加難度。這樣能快速定位是哪一環(huán)不穩(wěn)定而不是所有環(huán)節(jié)一起出問(wèn)題。第二鎖定版本。團(tuán)隊(duì)內(nèi)部統(tǒng)一 ROS2 版本、仿真器版本、機(jī)器人 SDK 版本和模型版本。備賽后期最怕有人偷偷升級(jí)依賴導(dǎo)致其他人代碼報(bào)錯(cuò)。建議在項(xiàng)目目錄里放一份requirements.txt或者environment.yaml記錄所有關(guān)鍵依賴。第三所有關(guān)鍵話題和數(shù)據(jù)都要有日志。部署現(xiàn)場(chǎng)問(wèn)題復(fù)現(xiàn)的成本很高ros2 bag 是最好的“行車記錄儀”。至少把/cmd_vel、/odom、/scan、/map和視覺(jué)圖像話題記錄到本地。第四安全問(wèn)題不能讓步。四足機(jī)器人、人形機(jī)器人和工業(yè)機(jī)器人的關(guān)節(jié)力量足夠造成傷害調(diào)試前必須有急停裝置和物理隔離?,F(xiàn)場(chǎng)測(cè)試要?jiǎng)澏ò踩珔^(qū)域禁止人員在機(jī)器人路徑上停留。第五識(shí)別到目標(biāo)后不要只做“顯示框”要落到底層邏輯。視覺(jué)節(jié)點(diǎn)輸出的坐標(biāo)應(yīng)該直接轉(zhuǎn)換為機(jī)器人坐標(biāo)系下的目標(biāo)點(diǎn)并發(fā)布給導(dǎo)航模塊形成“識(shí)別 - 定位 - 導(dǎo)航 - 執(zhí)行”的閉環(huán)。這比單獨(dú)調(diào)高識(shí)別精度更有比賽價(jià)值。下一步可以做三件事一是把仿真環(huán)境里的路徑規(guī)劃參數(shù)與真機(jī)統(tǒng)一盡量縮小 Sim2Real 差異二是如果賽項(xiàng)允許多機(jī)協(xié)作提前測(cè)試多臺(tái)機(jī)器人之間的通信和任務(wù)分配三是如果機(jī)器人支持遙操作可以考慮 VR 或手柄接入作為復(fù)雜任務(wù)的保底方案。機(jī)器人運(yùn)動(dòng)會(huì)考的不是單點(diǎn)技術(shù)而是把工程鏈路串起來(lái)的能力。從建圖到導(dǎo)航從視覺(jué)到控制從日志到現(xiàn)場(chǎng)排錯(cuò)每一步都需要提前演練。建議把這篇里面的檢查清單保存下來(lái)備賽時(shí)逐項(xiàng)對(duì)照。