據(jù)契約與 navigator 實現(xiàn))
嵌入式物聯(lián)網(wǎng)機器人自動駕駛智能硬件【免費下載鏈接】PX4-AutopilotPX4 Autopilot Software項目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot點擊查看免費下載本指南以 PX4-Autopilot 的detect_and_avoidUORB 主題為核心圍繞navigator模塊中DetectAndAvoid組件的發(fā)布邏輯完整講解該消息的字段語義、沖突級別常量、流量標識編碼規(guī)則并給出源碼級調(diào)用鏈與測試驗證證據(jù)。讀完本文你將能夠理解并復現(xiàn) PX4 如何通過該消息發(fā)布某一架特定交通飛機的沖突評估結(jié)果并能據(jù)此擴展日志分析、測試與二次開發(fā)。消息定位單機粒度的 DAA 沖突評估輸出detect_and_avoid是 PX4 檢測與避讓Detect-and-Avoid, DAA體系中的單機粒度輸出主題定義于 msg/DetectAndAvoid.msg。它描述的是Detect-and-avoid conflict assessment for one traffic aircraft.針對一架交通飛機的檢測避讓沖突評估。也就是說該主題的每個樣本只描述一架被評估的交通飛機包含該機當前的沖突級別與幾何量三維距離、水平/垂直間距、預估碰撞時間。它由navigator模塊內(nèi)的DetectAndAvoid組件源碼位于 src/modules/navigator/DetectAndAvoid/detect_and_avoid.cpp發(fā)布主要被日志系統(tǒng)與測試用例消費。消息本身并未匯總當前最緊急的那一個沖突這一點與detect_and_avoid_most_urgent主題形成明確分工后者才是驅(qū)動 DAA 自動動作決策與 prearm 檢查的匯總主題而detect_and_avoid則忠實反映剛剛被評估的這架飛機的沖突等級與幾何。發(fā)布時機遵循沖突驅(qū)動原則——當一份評估報告表明存在沖突、或更新了一架已被跟蹤為沖突的飛機時才發(fā)布新報告評估結(jié)果為NONE無沖突時不發(fā)布。主題與隊列屬性屬性值說明主題名detect_and_avoidUORB 主題 IDORB_ID(detect_and_avoid)發(fā)布者navigatorDetectAndAvoid組件見 detect_and_avoid.h 中的uORB::Publicationdetect_and_avoid_s成員使用者日志系統(tǒng)、測試同時被commander的 DAA 解鎖檢查體系間接消費經(jīng)匯總主題隊列長度ORB_QUEUE_LENGTH 16見消息常量源碼通過static_assert保證其不小于交通輸入隊列長度以容納一次完整的交通報告突發(fā)在 detect_and_avoid.cpp 中有一處值得注意的靜態(tài)斷言static_assert(detect_and_avoid_s::ORB_QUEUE_LENGTH transponder_report_s::ORB_QUEUE_LENGTH, DAA output queue must hold one full traffic-input burst);它保證輸出隊列能夠承載一次完整的交通輸入突發(fā)burst避免訂閱端如日志記錄器在處理高速率交通報告時丟幀。字段詳解消息共 8 個字段覆蓋時間基準、流量身份、沖突等級、幾何距離、碰撞時間五類信息。完整的字段表如下名稱類型單位[坐標系]說明timestampuint64us自系統(tǒng)啟動以來的時間來源為交通報告時間戳unique_iduint64-編碼后的交通飛機標識符按優(yōu)先級選擇ICAO 地址、ADS-B 呼號、UAS ID 縮減尾字節(jié)unique_id_encodinguint8-用于解碼unique_id的命名空間編碼類型conflict_leveluint8-為該架交通飛機計算出的沖突級別aircraft_distfloat32m本機與交通飛機之間的當前三維點對點距離aircraft_dist_horfloat32m [NED]水平分離度量。Crosstrack 模式下可用時是有符號的偏航距crosstrack distance否則為直接水平距離aircraft_dist_vertfloat32m [NED]本機當前飛行器與交通飛機之間的垂直間距expected_min_dist_timefloat32s由當前三維分離量與本機、交通飛機速度幅值之和估算的保守碰撞時間各字段的源碼級產(chǎn)生邏輯在 AdsbConflict.cpp 中calculate_daa_output()將自有飛機狀態(tài)與交通飛機狀態(tài)交給底層 DAA 標準算法一次性算出全部幾何與沖突字段daa_stats_s daa_stats{}; daa_output.conflict_level _daa.calculate_daa_stats(uav_state, traffic_state, daa_stats); daa_output.aircraft_dist daa_stats.aircraft_dist; daa_output.aircraft_dist_hor daa_stats.aircraft_dist_hor; daa_output.aircraft_dist_vert daa_stats.aircraft_dist_vert; daa_output.expected_min_dist_time daa_stats.expected_min_dist_time_sec;幾個字段的關(guān)鍵語義可以結(jié)合實際源碼理解timestamp在 detect_and_avoid.cpp 中該字段并非取發(fā)布時刻而是取交通報告自身的時間戳transponder_report.timestamp即字段注釋自系統(tǒng)啟動以來的時間指的是這份交通報告的接收/生成時間。同一邏輯中unique_id與unique_id_encoding也由DaaEncodedId::identify_traffic_report()識別結(jié)果填充。unique_id/unique_id_encoding由 src/lib/adsb/DaaEncodedId.h 中的DaaEncodedId結(jié)構(gòu)承載。交通標識符被壓縮為 64 位鍵uint64_t id外加一個編碼枚舉uint8_t encoding。identify_traffic_report()從一份transponder_report中按有效 ICAO 地址 → ADS-B 呼號 → UAS-ID的優(yōu)先級提取標識符并會過濾本機自檢self-detection若標識符匹配本機 ICAO、呼號或 UAS-ID則返回 id0 的默認值該報告被丟棄。aircraft_dist三維點對點距離。在 ConflictTracker.h 中其語義被進一步定義為sqrtf(dist_hor^2 dist_vert^2)。aircraft_dist_hor水平分離度量其具體含義取決于編譯期選擇的 DAA 標準。默認Crosstrack 標準CONFIG_NAVIGATOR_ADSB_F3442未定義時下在 Crosstrack 模式中當偏航距可用時給出有符號的偏航距否則退回直接水平距離AdsbConflict類正是通過 AdsbConflict.h 中的條件編譯在DaaCrosstrack與DaaF3442之間切換。expected_min_dist_time保守的碰撞時間估計由當前三維分離量與本機速度幅值 交通機速度幅值之和相除得出——采用速度之和而非相對速度天然偏保守符合 DAA 安全裕度設(shè)計。常量與枚舉消息定義了三組常量沖突級別5 檔、流量標識編碼3 類、隊列長度。沖突級別DAA_CONFLICT_LVL_*常量名值含義DAA_CONFLICT_LVL_NONE0無沖突DAA_CONFLICT_LVL_LOW1低級別沖突DAA_CONFLICT_LVL_MEDIUM2中級別沖突DAA_CONFLICT_LVL_HIGH3高級別沖突DAA_CONFLICT_LVL_CRITICAL4嚴重沖突沖突級別由底層 DAA 標準算法Crosstrack 或 F3442依據(jù)本機與交通機的幾何關(guān)系與速度矢量計算產(chǎn)生是整個 DAA 決策鏈的輸入。在 detect_and_avoid.cpp 中g(shù)et_action_from_conflict_level()通過DaaActionPolicy::action_from_conflict_level()將沖突級別映射為具體動作僅警告、懸停、返航、降落、終止飛行等隨后由publish_action_command()以vehicle_command形式下發(fā)detect_and_avoid.cpp。流量標識編碼UNIQUE_ID_ENCODING_*常量名值含義UNIQUE_ID_ENCODING_ICAO0unique_id包含一個 ICAO 地址UNIQUE_ID_ENCODING_ADSB_CALLSIGN1unique_id包含打包進uint64的 ADS-B 呼號UNIQUE_ID_ENCODING_UAS_ID2unique_id包含 UAS ID 的縮減尾字節(jié)三類編碼與 DaaEncodedId.h 中的實現(xiàn)嚴格對應ICAO 地址取 24 位kMaxIcaoAddress 0xFFFFFF呼號按 8 字符打包kCallsignLength 9含結(jié)尾\0UAS ID 取尾部字節(jié)kIdEncodingNbBytes 8保證 8 字節(jié)可裝入uint64_tUAS ID 全長kUasIdByteLength 18。消費端必須根據(jù)unique_id_encoding選擇解碼方式這正是該字段存在的意義。隊列長度ORB_QUEUE_LENGTH 16detect_and_avoid主題的發(fā)布隊列深度。如前文所述其取值受限于交通報告輸入隊列長度并經(jīng)過static_assert靜態(tài)校驗。發(fā)布鏈路從 transponder 報告到 detect_and_avoid 樣本DetectAndAvoid是MissionBlock與ModuleParams的子類隨navigator的激活周期運行。其核心處理入口process_traffic()detect_and_avoid.cpp的調(diào)用鏈如下采集本機狀態(tài)gather_ownship_input()從vehicle_global_position與vehicle_local_position采集本機經(jīng)緯度、高度與 NED 速度并校驗坐標合法性、時間戳新鮮度超過 2 s 視為過期kOwnshipPositionTimeout。本機姿態(tài)過期時會清空沖突緩沖。清理過期沖突周期性調(diào)用ConflictTracker::remove_stale_conflicts()超時閾值由參數(shù)DAA_TRAFF_TOUT決定。消費交通報告隊列process_transponder_queue()逐條拉取transponder_report主題隊列隊列長度見transponder_report_s::ORB_QUEUE_LENGTH先經(jīng)transponder_data_valid()校驗WGS84 坐標、有限高度/航向/速度、時間戳與 tslc 年齡再交給process_transponder_report()。逐機評估并發(fā)布process_transponder_report()中先由DaaEncodedId::identify_traffic_report()識別流量身份id0 直接丟棄再調(diào)用AdsbConflict::calculate_daa_output()計算全部輸出字段隨后_detect_and_avoid_pub.publish(daa_output)detect_and_avoid.cpp。更新沖突跟蹤器評估結(jié)果寫入ConflictTracker固定大小緩沖kDaaMaxTraffic 5僅當沖突級別非 NONE、或該飛機已在跟蹤中時更新ConflictNotifier依據(jù)本周期變更記錄決定是否發(fā)出用戶告警。匯總發(fā)布publish_most_urgent_conflict_if_changed()另行發(fā)布detect_and_avoid_most_urgent匯總主題供 commander 的 DAA 解鎖檢查與自動動作決策使用。其中一處實現(xiàn)細節(jié)值得注意process_transponder_queue通過failure_injection_s::FAILURE_UNIT_SYSTEM_TRAFFIC_AVOIDANCE支持故障注入——當系統(tǒng)級交通避讓單元被注入故障時所有交通報告將被跳過處理用于驗證 DAA 失效時的降級行為detect_and_avoid.cpp。與 DetectAndAvoidMostUrgent 的職責劃分兩主題同由DetectAndAvoid組件發(fā)布但粒度與用途完全不同可通過對比二者定義確認維度detect_and_avoiddetect_and_avoid_most_urgent粒度單架被評估交通飛機當前最緊急的一個沖突匯總發(fā)布頻率每份產(chǎn)生沖突或更新跟蹤的報告緩沖變更后、最緊急沖突變化時幾何信息完整水平/垂直/三維距離、碰撞時間僅三維距離空緩沖時為 9999附加字段unique_id/unique_id_encoding額外有has_action配置的響應是否強于僅警告消費方日志、測試commander DAA 解鎖檢查、自動動作決策、日志、測試匯總主題的定義見 msg/DetectAndAvoidMostUrgent.msg??梢岳斫鉃閐etect_and_avoid回答剛評估的這架飛機沖突情況如何detect_and_avoid_most_urgent回答現(xiàn)在整體上最該處理的沖突是什么、要不要動作。相關(guān)參數(shù)與配置要點DetectAndAvoid組件通過DEFINE_PARAMETERS聲明了一批 DAA 參數(shù)detect_and_avoid.h常用的如下參數(shù)類型默認值說明DAA_ENint32-DAA 功能總開關(guān)為 0 時組件整體禁用并復位DAA_NOTIF_STATEint32-狀態(tài)類用戶告警的最小間隔秒DAA_TRAFF_TOUTint32-交通報告過期時間秒用于沖突緩沖的過期清理ADSB_ICAO_ID/ADSB_ICAO_ID_2int32-1本機 ICAO 地址-1 禁用用于過濾自檢ADSB_CALLSIGN_1/ADSB_CALLSIGN_2int320本機呼號各 4 字符的打包值合成 8 字符呼號鍵上述 ADSB 參數(shù)的定義可參見 src/lib/adsb/parameters.yaml。其中ADSB_ICAO_ID取值范圍為 -1 至 1677721524 位 ICAO 空間ADSB_CALLSIGN_1/2各存 4 個字符合法字符為 A-Z、0-9、空格例如PX4 - 1347957792、TEST - 1413829460不足 8 字符時以\0結(jié)尾。本機 UAS-ID 則取自平臺 GUIDboard_get_px4_guid取其尾字節(jié)打包成 64 位鍵detect_and_avoid.cpp。當編譯目標啟用CONFIG_NAVIGATOR_ADSB_F3442時F3442 標準還會引入DAA_DFLT_VEL、DAA_EN_DFLT_VEL缺失速度時的默認垂直速度、DAA_LVL_LOW_ACT、DAA_LVL_MED_ACT、DAA_LVL_HIGH_ACT、DAA_LVL_CRIT_ACT各級沖突對應的動作否則使用NAV_TRAFF_AVOID參數(shù)控制交通避讓行為。測試驗證與觀測方法detect_and_avoid主題的行為在單元測試中得到直接驗證測試源碼位于src/modules/navigator/DetectAndAvoid/test/detect_and_avoid_crosstrack_test.cppsrc/modules/navigator/DetectAndAvoid/test/detect_and_avoid_f3442_test.cppsrc/modules/navigator/DetectAndAvoid/test/detect_and_avoid_test_common.h測試覆蓋的關(guān)鍵行為包括DAA_EN關(guān)閉時組件不激活注入合成交通報告后detect_and_avoid_most_urgent的conflict_level正確跳變?nèi)鏝ONE → HIGH → NONEhas_action隨級別與參數(shù)正確置位以及沖突緩沖在報告停止后的清空邏輯drain_detect_and_avoid_topic()用于排空隊列。此外src/modules/navigator/DetectAndAvoid/detect_and_avoid_fake_traffic.cpp提供了合成交通注入實現(xiàn)——在啟用CONFIG_NAVIGATOR_ADSB_FAKE_TRAFFIC的構(gòu)建中可從 navigator shell 運行fake_traffic腳本kUniqueIds、kEscalation、kSpamSame、kSpamNew、kFlags、kQueueFill等模式注入帶完整旗標的模擬 ADS-B 報告用于手動驗證 DAA 沖突評估與動作輸出。在實際飛行或仿真中可通過 PX4 日志系統(tǒng)訂閱該主題觀測每架交通飛機的沖突評估使用uORB訂閱或地面站日志回放檢查conflict_level、aircraft_dist*與expected_min_dist_time隨交通態(tài)勢的變化即可定位 DAA 評估是否按預期工作。小結(jié)detect_and_avoid是 PX4 檢測避讓體系中逐機評估的數(shù)據(jù)出口它以 8 個字段完整刻畫一架交通飛機的沖突級別、三維幾何與保守碰撞時間用 5 檔沖突級別與 3 類標識編碼統(tǒng)一了 ICAO / ADS-B / UAS-ID 三種流量身份表達。結(jié)合 detect_and_avoid.cpp 的發(fā)布鏈路與 src/lib/adsb 的算法庫可以清晰還原transponder 報告 → 逐機沖突評估 → 逐機發(fā)布 → 匯總發(fā)布的完整數(shù)據(jù)流。理解該消息是閱讀 DAA 日志、編寫 DAA 測試或擴展避讓策略的第一步。贊分享嵌入式物聯(lián)網(wǎng)機器人自動駕駛智能硬件【免費下載鏈接】PX4-AutopilotPX4 Autopilot Software項目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot點擊查看免費下載相關(guān)推薦PX4-Autopilot通信機制詳解uORB消息總線實現(xiàn)進程間高效通信PX4 Autopilot通信機制詳解uORB消息總線實現(xiàn)進程間高效通信 PX4 Autopilot作為業(yè)界領(lǐng)先的開源自動駕駛系統(tǒng)其核心通信機制uORB通嵌入式物聯(lián)網(wǎng)機器人自動駕駛智能硬件PX4-Autopilot uORB 消息詳解ActuatorServosV0actuator_servos_v0舵機歸一化控制消息PX4 Autopilot uORB 消息詳解ActuatorServosV0actuator_servos_v0舵機歸一化控制消息 ActuatorSe嵌入式物聯(lián)網(wǎng)機器人自動駕駛智能硬件PX4 Autopilot EstimatorBias UORB 消息詳解氣壓計與 GNSS 高度偏差估計PX4 Autopilot EstimatorBias UORB 消息詳解氣壓計與 GNSS 高度偏差估計 EstimatorBias 是 PX4 飛控中 E嵌入式物聯(lián)網(wǎng)機器人自動駕駛智能硬件上一篇Jeepay分賬功能終極指南如何快速配置自動分賬系統(tǒng)下一篇3分鐘搞定PHP應用監(jiān)控Pinpoint C Agent零侵入部署指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考