習(xí)實(shí)操記錄)
ROS2 與 TurtleBot3 學(xué)習(xí)實(shí)操記錄學(xué)習(xí)目標(biāo)為機(jī)器人測(cè)試崗位打基礎(chǔ)能建立仿真環(huán)境、觀察機(jī)器人通信與傳感器數(shù)據(jù)、控制機(jī)器人并留存可用于定位問(wèn)題的證據(jù)。本文只記錄本人已經(jīng)完成的 ROS2 學(xué)習(xí)和實(shí)操。目前已完成 SLAM 建圖、地圖保存與加載、AMCL 定位和 Nav2 基礎(chǔ)到點(diǎn)導(dǎo)航故障注入、指標(biāo)自動(dòng)采集和自動(dòng)化報(bào)告仍未完成不將其寫(xiě)成已掌握。1. 當(dāng)前學(xué)習(xí)路線ROS2 基礎(chǔ) - TurtleBot3 / Gazebo 仿真 - AGV 建圖、定位、導(dǎo)航測(cè)試 - 故障注入與排障 - pytest 指標(biāo)采集與測(cè)試報(bào)告當(dāng)前進(jìn)度已完成 ROS2 基礎(chǔ)、TurtleBot3/Gazebo、SLAM 建圖、AMCL 定位和 Nav2 基礎(chǔ)導(dǎo)航正在進(jìn)入導(dǎo)航測(cè)試用例、故障恢復(fù)與指標(biāo)采集。2. 實(shí)際環(huán)境項(xiàng)目實(shí)際使用內(nèi)容主機(jī)Windows WSL2LinuxUbuntu 24.04 LTSLinux 用戶yjwROS2ROS 2 Jazzy Desktop仿真機(jī)器人TurtleBot3 Burger仿真平臺(tái)Gazebo可視化RViz2、rqt_graph證據(jù)工具ros2 bag、終端日志、話題數(shù)據(jù)、截圖已完成rosdep update。它用于根據(jù) ROS 包的依賴(lài)聲明安裝系統(tǒng)依賴(lài)后續(xù)編譯或安裝源碼包時(shí)會(huì)用到。3. 已理解的 ROS2 核心概念3.1 Node、Topic、Service、Action、Parameter概念一句話理解機(jī)器人示例Node執(zhí)行具體工作的程序單元激光雷達(dá)驅(qū)動(dòng)節(jié)點(diǎn)讀取雷達(dá)并發(fā)布數(shù)據(jù)Topic持續(xù)傳輸消息的數(shù)據(jù)通道/scan持續(xù)發(fā)布激光掃描/cmd_vel持續(xù)接收速度指令Service一問(wèn)一答的請(qǐng)求/響應(yīng)接口查詢一次當(dāng)前參數(shù)或請(qǐng)求一次狀態(tài)Action耗時(shí)任務(wù)支持目標(biāo)、過(guò)程反饋、最終結(jié)果“導(dǎo)航到目標(biāo)點(diǎn)”過(guò)程中反饋距離和狀態(tài)最后返回成功或失敗Parameter節(jié)點(diǎn)可查詢或調(diào)整的配置值最大速度、地圖路徑、雷達(dá)配置記憶方法Node 誰(shuí)在干活 Topic 連續(xù)廣播的數(shù)據(jù)通道 Service 問(wèn)一次答一次 Action 下達(dá)一個(gè)耗時(shí)任務(wù)持續(xù)匯報(bào)最后交結(jié)果 Parameter 節(jié)點(diǎn)的配置項(xiàng)已能糾正以下常見(jiàn)混淆/scan是Topic不是 Service。雷達(dá)持續(xù)發(fā)布掃描數(shù)據(jù)。“導(dǎo)航到目標(biāo)點(diǎn)”更適合Action不能只靠 Topic因?yàn)槿蝿?wù)耗時(shí)且需要反饋、取消和結(jié)果。激光雷達(dá) Node 負(fù)責(zé)讀取和處理硬件數(shù)據(jù)/scanTopic 負(fù)責(zé)傳輸掃描消息。查詢一次配置參數(shù)應(yīng)使用 Parameter 命令或相關(guān) Service不是 Action。3.2 TF 的作用TF 是機(jī)器人各坐標(biāo)系之間的位置和姿態(tài)關(guān)系。例如odom、base_link、laser。測(cè)試時(shí)TF 用來(lái)判斷“雷達(dá)數(shù)據(jù)、機(jī)器人本體、里程計(jì)數(shù)據(jù)是否處在正確的空間關(guān)系中”。TF 缺失、斷鏈、時(shí)間不一致都可能造成 RViz 顯示異常、定位異?;?qū)Ш绞 1敬卧渺o態(tài) TF 做學(xué)習(xí)示例。該靜態(tài) TF 只用于理解命令和坐標(biāo)變換不能當(dāng)作真實(shí)機(jī)器人已完成建圖或定位的證據(jù)。4. 本人使用過(guò)的 ROS2 命令4.1 發(fā)現(xiàn)和檢查 ROS 圖ros2nodelist ros2 topic list ros2 topic info /scan-vros2 topicecho/scan--onceros2servicelist ros2 action list ros2 param list ros2 param getnode_nameparameter_nameros2 doctor--report4.2 看消息頻率和坐標(biāo)變換ros2 topic hz /scan ros2 run tf2_ros tf2_echo odom base_link4.3 錄制和檢查證據(jù)包ros2 bag record-o~/tb3_motion_001 /cmd_vel /odom /scan /tf /tf_static ros2 bag info ~/tb3_motion_0015. TurtleBot3 / Gazebo 仿真實(shí)操5.1 啟動(dòng)仿真先設(shè)置機(jī)器人型號(hào)exportTURTLEBOT3_MODELburger啟動(dòng) TurtleBot3 Gazebo 世界ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py啟動(dòng)后確認(rèn)存在的關(guān)鍵 Topic 包括/cmd_vel /scan /odom /tf /tf_static /imu這些話題基本覆蓋了機(jī)器人測(cè)試中“控制指令、傳感器、位置、坐標(biāo)關(guān)系、慣性數(shù)據(jù)”五類(lèi)重要證據(jù)。5.2 控制機(jī)器人并由里程計(jì)驗(yàn)證檢查發(fā)現(xiàn)當(dāng)前/cmd_vel的消息類(lèi)型是geometry_msgs/msg/TwistStamped。正確的前進(jìn)指令如下ros2 topic pub--rate10/cmd_vel geometry_msgs/msg/TwistStamped\{header: {frame_id: base_link}, twist: {linear: {x: 0.10, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}}停止指令ros2 topic pub--once/cmd_vel geometry_msgs/msg/TwistStamped\{header: {frame_id: base_link}, twist: {linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}}通過(guò)查看/odom確認(rèn)機(jī)器人實(shí)際發(fā)生位移position.x約為1.0589 m。本次驗(yàn)證鏈路發(fā)布 /cmd_vel 速度指令 - 仿真底盤(pán)接收并運(yùn)動(dòng) - /odom 持續(xù)發(fā)布里程計(jì) - 通過(guò) position.x 看到位移這就是一個(gè)最小的“指令是否生效”的測(cè)試閉環(huán)。真實(shí)項(xiàng)目中還要結(jié)合底盤(pán)日志、電機(jī)狀態(tài)、編碼器和視頻判斷。6. 雷達(dá)數(shù)據(jù)與頻率實(shí)測(cè)使用下面命令確認(rèn)激光雷達(dá)持續(xù)有數(shù)據(jù)ros2 topicecho/scan--once再使用下面命令測(cè)頻率ros2 topic hz /scan本次實(shí)際觀測(cè)結(jié)果指標(biāo)實(shí)測(cè)值/scan平均頻率約4.59 Hz平均消息間隔約0.218 s間隔標(biāo)準(zhǔn)差約3.90 ms測(cè)試?yán)斫忸l率低、抖動(dòng)大、長(zhǎng)時(shí)間沒(méi)有消息都可能影響建圖、定位、避障或控制。是否合格必須按具體產(chǎn)品需求判斷當(dāng)前實(shí)測(cè)數(shù)據(jù)僅作為仿真學(xué)習(xí)記錄不能當(dāng)作正式驗(yàn)收門(mén)檻。7. RViz2 和 TF 實(shí)操使用仿真時(shí)間啟動(dòng) RViz2rviz2 --ros-args-puse_sim_time:true本人完成的操作將 Fixed Frame 設(shè)置為odom。添加TF顯示項(xiàng)觀察坐標(biāo)系關(guān)系。添加LaserScan顯示項(xiàng)并選擇/scan。添加RobotModel狀態(tài)正常。成功看到紅色激光雷達(dá)點(diǎn)云/掃描點(diǎn)。當(dāng)前觀察到的現(xiàn)象RobotModel 狀態(tài)正常但機(jī)器人身體網(wǎng)格沒(méi)有明顯顯示。這更像 RViz 的網(wǎng)格或顯示問(wèn)題不等同于 ROS 數(shù)據(jù)鏈路故障因?yàn)?scan、/odom、TF 已正常工作。RViz 排障優(yōu)先順序Fixed Frame 是否存在 - 是否啟用 use_sim_time - Topic 名稱(chēng)和消息類(lèi)型是否正確 - TF 是否連通、時(shí)間戳是否匹配 - RViz 顯示項(xiàng)配置、模型網(wǎng)格和縮放8. rosbag 證據(jù)留存實(shí)操錄制命令ros2 bag record-o~/tb3_motion_001 /cmd_vel /odom /scan /tf /tf_staticros2 bag info ~/tb3_motion_001的實(shí)際結(jié)果項(xiàng)目結(jié)果錄制時(shí)長(zhǎng)102.57 s總消息數(shù)11841/cmd_vel68條/odom4706條/scan470條/tf6595條/tf_static2條本次證據(jù)鏈已經(jīng)具備控制指令/cmd_vel 運(yùn)動(dòng)結(jié)果/odom 傳感器輸入/scan 空間關(guān)系/tf、/tf_static這套 bag 可以用來(lái)回放和復(fù)盤(pán)某一時(shí)刻下發(fā)了什么指令、機(jī)器人有沒(méi)有位移、雷達(dá)是否還在發(fā)數(shù)據(jù)、坐標(biāo)變換是否正常。9. 本次排障案例案例 1發(fā)布速度指令后機(jī)器人不動(dòng)現(xiàn)象按常見(jiàn)示例向/cmd_vel發(fā)送geometry_msgs/msg/Twist后機(jī)器人沒(méi)有按預(yù)期運(yùn)動(dòng)。排查ros2 topic info /cmd_vel-v根因當(dāng)前仿真環(huán)境中的/cmd_vel要求的類(lèi)型為geometry_msgs/msg/TwistStamped不是Twist。修復(fù)按話題實(shí)際類(lèi)型重新發(fā)布TwistStamped指令隨后通過(guò)/odom的position.x確認(rèn)已移動(dòng)。經(jīng)驗(yàn)控制不生效時(shí)先查話題是否存在、訂閱者是否存在、消息類(lèi)型是否一致再判斷控制器或底盤(pán)故障。案例 2RViz2 看不到預(yù)期數(shù)據(jù)排查重點(diǎn)RViz 需要使用仿真時(shí)間否則可能與 Gazebo 的時(shí)間不一致。修復(fù)命令rviz2 --ros-args-puse_sim_time:true經(jīng)驗(yàn)可視化異常不等于傳感器異常。應(yīng)同時(shí)用ros2 topic echo、ros2 topic hz和 TF 檢查數(shù)據(jù)鏈路。10. 當(dāng)前掌握情況已完成ROS2 的 Node、Topic、Service、Action、Parameter 基本概念和常用命令。turtlesim、rqt_graph和靜態(tài) TF 學(xué)習(xí)練習(xí)。TurtleBot3 Burger 在 Gazebo 中啟動(dòng)。查看/cmd_vel、/scan、/odom、/tf、/tf_static、/imu等關(guān)鍵話題。發(fā)布正確類(lèi)型的速度指令讓機(jī)器人運(yùn)動(dòng)和停止。通過(guò)/odom驗(yàn)證位移。查看一次/scan數(shù)據(jù)并測(cè)量/scan頻率和抖動(dòng)。RViz2 中顯示 TF、LaserScan 和 RobotModel看到雷達(dá)掃描點(diǎn)。實(shí)際錄制并檢查一份含控制、里程計(jì)、雷達(dá)和 TF 的 rosbag。使用 SLAM 生成地圖并保存為tb3_map_001、tb3_map_002。重新加載tb3_map_002.yaml通過(guò) AMCL 設(shè)置初始位姿。使用 Nav2 完成多次到點(diǎn)導(dǎo)航觀察 Goal、Feedback、Result 和取消操作。已理解仍需復(fù)習(xí)Node、Topic、Service、Action 的選擇邊界。TF 坐標(biāo)樹(shù)、時(shí)間戳與 RViz 顯示的關(guān)系。Twist和TwistStamped的區(qū)別以及先查接口類(lèi)型再調(diào)用的習(xí)慣。頻率、延遲、抖動(dòng)、超時(shí)在機(jī)器人測(cè)試中的含義和測(cè)量方式。11. 未完成內(nèi)容和下一步以下內(nèi)容尚未完成完成并執(zhí)行至少 10 條建圖、定位、規(guī)劃、避障和異常恢復(fù)測(cè)試用例。形成包含成功、失敗、取消和重規(guī)劃的完整導(dǎo)航記錄。故障注入斷網(wǎng)、雷達(dá)異常、TF 中斷、數(shù)據(jù)延遲或頻率下降。通過(guò) rosbag 計(jì)算定位誤差、終點(diǎn)誤差、路徑長(zhǎng)度、耗時(shí)和任務(wù)成功率。使用 pytest 自動(dòng)采集指標(biāo)、判定結(jié)果并生成報(bào)告。下一次學(xué)習(xí)任務(wù)建議建立 10 條導(dǎo)航測(cè)試用例矩陣并給出可量化判定規(guī)則。對(duì)一次到點(diǎn)導(dǎo)航同步記錄/odom、/cmd_vel、/scan、TF 和 Nav2 Action。執(zhí)行可達(dá)目標(biāo)、不可達(dá)目標(biāo)、取消、動(dòng)態(tài)障礙物和傳感器異常測(cè)試。匯總終點(diǎn)誤差、路徑長(zhǎng)度、耗時(shí)、重規(guī)劃次數(shù)和任務(wù)成功率。12. 首次 Nav2 導(dǎo)航實(shí)操結(jié)果12.1 本次完成內(nèi)容在加載tb3_map_002.yaml后完成了以下操作啟動(dòng) Nav2并確認(rèn)地圖正常顯示。使用 RViz 的2D Pose Estimate設(shè)置機(jī)器人初始位姿。通過(guò)Startup激活導(dǎo)航組件。使用頂部Nav2 Goal在地圖白色可行區(qū)域設(shè)置目標(biāo)點(diǎn)。機(jī)器人按規(guī)劃路徑移動(dòng)并到達(dá)目標(biāo)位置。12.2 RViz 最終結(jié)果截圖中的Navigation 2面板顯示指標(biāo)結(jié)果NavigationinactiveLocalizationactiveFeedbackreachedDistance remaining0.07 mETA0 sRecoveries012.3 結(jié)果判定本次導(dǎo)航判定為通過(guò)Feedback: reached表示目標(biāo)點(diǎn)已到達(dá)。Distance remaining: 0.07 m表示剩余約 7 厘米屬于目標(biāo)到達(dá)容差內(nèi)不代表失敗。Navigation: inactive是因?yàn)楸敬螌?dǎo)航任務(wù)已經(jīng)結(jié)束不是導(dǎo)航組件出錯(cuò)。Localization: active表示 AMCL 定位仍在工作。Recoveries: 0表示本次沒(méi)有觸發(fā)恢復(fù)行為。本次測(cè)試閉環(huán)加載地圖 - AMCL 設(shè)置初始位姿 - 下發(fā) Nav2 Goal - 規(guī)劃路徑并運(yùn)動(dòng) - 到達(dá)目標(biāo) - 自動(dòng)停止 - Feedback: reached12.4 仍需補(bǔ)充的測(cè)試證據(jù)本次已有 RViz 截圖和運(yùn)行過(guò)程現(xiàn)象。后續(xù)復(fù)習(xí)時(shí)還應(yīng)補(bǔ)充N(xiāo)av2 終端日志中的目標(biāo)發(fā)送、執(zhí)行和完成時(shí)間。/odom中的起點(diǎn)、終點(diǎn)和實(shí)際位移。/cmd_vel中的速度變化和停止?fàn)顟B(tài)。導(dǎo)航過(guò)程 rosbag便于計(jì)算耗時(shí)、路徑長(zhǎng)度和停止誤差。13. 用機(jī)器人測(cè)試語(yǔ)言復(fù)述首次導(dǎo)航在 TurtleBot3 Gazebo 仿真中加載保存的柵格地圖使用 AMCL 設(shè)置初始位姿后通過(guò) RViz 下發(fā) Nav2 目標(biāo)點(diǎn)。機(jī)器人能夠按照規(guī)劃路徑移動(dòng)并到達(dá)目標(biāo)RViz 顯示Feedback: reached剩余距離0.07 m恢復(fù)次數(shù)為0最終自動(dòng)停止。本次完成了“地圖加載—定位—規(guī)劃—控制—到達(dá)判定”的基礎(chǔ)導(dǎo)航閉環(huán)。14. 用機(jī)器人測(cè)試語(yǔ)言復(fù)述本次學(xué)習(xí)我在 Ubuntu 24.04 的 WSL2 環(huán)境搭建了 ROS 2 Jazzy 和 TurtleBot3 Gazebo 仿真。通過(guò)/cmd_vel下發(fā)TwistStamped速度指令并使用/odom確認(rèn)機(jī)器人產(chǎn)生約 1.06 米位移同時(shí)檢查/scan雷達(dá)數(shù)據(jù)并測(cè)得約 4.59 Hz 的頻率。我在 RViz2 中完成 TF、激光掃描和機(jī)器人模型的基礎(chǔ)可視化并錄制了包含/cmd_vel、/odom、/scan、/tf的 rosbag。隨后完成 SLAM 建圖與地圖復(fù)用、AMCL 初始位姿設(shè)置以及 Nav2 多次到點(diǎn)導(dǎo)航。排障時(shí)識(shí)別了消息類(lèi)型不匹配、Nav2 生命周期狀態(tài)不一致和雷達(dá)時(shí)間戳差異問(wèn)題。下一步完成導(dǎo)航測(cè)試矩陣、故障注入、指標(biāo)采集和 pytest 自動(dòng)化報(bào)告。16. 第二輪 Nav2 導(dǎo)航與生命周期排障16.1 已完成的測(cè)試結(jié)果場(chǎng)景結(jié)果證據(jù)/指標(biāo)正常到點(diǎn)導(dǎo)航 1通過(guò)Feedback: reached剩余距離0.07 m恢復(fù)次數(shù)0正常到點(diǎn)導(dǎo)航 2通過(guò)Feedback: reached剩余距離0.12 m恢復(fù)次數(shù)0正常到點(diǎn)導(dǎo)航 3通過(guò)Feedback: reached剩余距離0.06 m恢復(fù)次數(shù)0困住/無(wú)法繼續(xù)前進(jìn)觀察到異常恢復(fù)剩余距離0.12 m恢復(fù)次數(shù)由19增至31任務(wù)最終aborted導(dǎo)航取消已操作點(diǎn)擊Cancel后任務(wù)停止后續(xù)需使用 Action result 或終端日志補(bǔ)充正式取消證據(jù)16.2 生命周期故障現(xiàn)象與原因現(xiàn)象RViz 仍能顯示地圖但Navigation: inactive下發(fā)目標(biāo)提示navigate_to_pose action server is not available。檢查后發(fā)現(xiàn)啟動(dòng)進(jìn)程和 RViz 仍存在但部分 Nav2 生命周期節(jié)點(diǎn)狀態(tài)不一致map_server、amcl、controller_server、smoother_server已經(jīng)是activeplanner_server、bt_navigator等節(jié)點(diǎn)仍是inactive再點(diǎn)擊Startup會(huì)嘗試重新配置已經(jīng) active 的節(jié)點(diǎn)出現(xiàn)Transition is not registered并中止。處理保持 Gazebo 和地圖不變按生命周期順序激活缺失節(jié)點(diǎn)并驗(yàn)證/navigate_to_pose 可用 bt_navigator active map - base_link TF 正常機(jī)器人測(cè)試結(jié)論界面存在不等于后臺(tái)服務(wù)可用。導(dǎo)航異常時(shí)應(yīng)同時(shí)檢查 Action 服務(wù)、生命周期狀態(tài)和 TF 鏈路。16.3 雷達(dá)時(shí)間戳異常觀察一次成功導(dǎo)航期間collision_monitor報(bào)告/scan與當(dāng)前時(shí)間相差約0.21~0.23 s并交替輸出Robot to stop due to invalid source Robot to continue normal operation這表示安全模塊會(huì)在雷達(dá)數(shù)據(jù)超時(shí)或時(shí)間不同步時(shí)先停車(chē)數(shù)據(jù)恢復(fù)后繼續(xù)。該次導(dǎo)航最終reached且恢復(fù)次數(shù)為0功能結(jié)果通過(guò)但時(shí)間同步警告應(yīng)作為后續(xù)“傳感器延遲/超時(shí)”專(zhuān)項(xiàng)測(cè)試的問(wèn)題線索保留。15. 復(fù)習(xí)自測(cè)題激光雷達(dá)持續(xù)發(fā)布/scan應(yīng)該用 Topic、Service 還是 Action為什么為什么“導(dǎo)航到目標(biāo)點(diǎn)”通常選擇 Action而不是只發(fā)一個(gè) Topic機(jī)器人不響應(yīng)/cmd_vel第一輪應(yīng)檢查哪些內(nèi)容/cmd_vel - /odom的鏈路分別說(shuō)明了什么/scan的頻率、間隔、抖動(dòng)各代表什么正式測(cè)試的合格線從哪里來(lái)RViz2 看不到雷達(dá)點(diǎn)時(shí)為什么不能直接結(jié)論為雷達(dá)壞了rosbag 中錄制/cmd_vel、/odom、/scan、/tf各自為了證明什么靜態(tài) TF 練習(xí)為什么不能證明已經(jīng)完成地圖定位