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