ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PX4-Autopilot DetectAndAvoid UORB 消息全解:单机交通冲突评估的数据契约与 navigator 实现

PX4-Autopilot DetectAndAvoid UORB 消息全解:单机交通冲突评估的数据契约与 navigator 实现 嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载本指南以 PX4-Autopilot 的detect_and_avoidUORB 主题为核心围绕navigator模块中DetectAndAvoid组件的发布逻辑完整讲解该消息的字段语义、冲突级别常量、流量标识编码规则并给出源码级调用链与测试验证证据。读完本文你将能够理解并复现 PX4 如何通过该消息发布某一架特定交通飞机的冲突评估结果并能据此扩展日志分析、测试与二次开发。消息定位单机粒度的 DAA 冲突评估输出detect_and_avoid是 PX4 检测与避让Detect-and-Avoid, DAA体系中的单机粒度输出主题定义于 msg/DetectAndAvoid.msg。它描述的是Detect-and-avoid conflict assessment for one traffic aircraft.针对一架交通飞机的检测避让冲突评估。也就是说该主题的每个样本只描述一架被评估的交通飞机包含该机当前的冲突级别与几何量三维距离、水平/垂直间距、预估碰撞时间。它由navigator模块内的DetectAndAvoid组件源码位于 src/modules/navigator/DetectAndAvoid/detect_and_avoid.cpp发布主要被日志系统与测试用例消费。消息本身并未汇总当前最紧急的那一个冲突这一点与detect_and_avoid_most_urgent主题形成明确分工后者才是驱动 DAA 自动动作决策与 prearm 检查的汇总主题而detect_and_avoid则忠实反映刚刚被评估的这架飞机的冲突等级与几何。发布时机遵循冲突驱动原则——当一份评估报告表明存在冲突、或更新了一架已被跟踪为冲突的飞机时才发布新报告评估结果为NONE无冲突时不发布。主题与队列属性属性值说明主题名detect_and_avoidUORB 主题 IDORB_ID(detect_and_avoid)发布者navigatorDetectAndAvoid组件见 detect_and_avoid.h 中的uORB::Publicationdetect_and_avoid_s成员使用者日志系统、测试同时被commander的 DAA 解锁检查体系间接消费经汇总主题队列长度ORB_QUEUE_LENGTH 16见消息常量源码通过static_assert保证其不小于交通输入队列长度以容纳一次完整的交通报告突发在 detect_and_avoid.cpp 中有一处值得注意的静态断言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);它保证输出队列能够承载一次完整的交通输入突发burst避免订阅端如日志记录器在处理高速率交通报告时丢帧。字段详解消息共 8 个字段覆盖时间基准、流量身份、冲突等级、几何距离、碰撞时间五类信息。完整的字段表如下名称类型单位[坐标系]说明timestampuint64us自系统启动以来的时间来源为交通报告时间戳unique_iduint64-编码后的交通飞机标识符按优先级选择ICAO 地址、ADS-B 呼号、UAS ID 缩减尾字节unique_id_encodinguint8-用于解码unique_id的命名空间编码类型conflict_leveluint8-为该架交通飞机计算出的冲突级别aircraft_distfloat32m本机与交通飞机之间的当前三维点对点距离aircraft_dist_horfloat32m [NED]水平分离度量。Crosstrack 模式下可用时是有符号的偏航距crosstrack distance否则为直接水平距离aircraft_dist_vertfloat32m [NED]本机当前飞行器与交通飞机之间的垂直间距expected_min_dist_timefloat32s由当前三维分离量与本机、交通飞机速度幅值之和估算的保守碰撞时间各字段的源码级产生逻辑在 AdsbConflict.cpp 中calculate_daa_output()将自有飞机状态与交通飞机状态交给底层 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;几个字段的关键语义可以结合实际源码理解timestamp在 detect_and_avoid.cpp 中该字段并非取发布时刻而是取交通报告自身的时间戳transponder_report.timestamp即字段注释自系统启动以来的时间指的是这份交通报告的接收/生成时间。同一逻辑中unique_id与unique_id_encoding也由DaaEncodedId::identify_traffic_report()识别结果填充。unique_id/unique_id_encoding由 src/lib/adsb/DaaEncodedId.h 中的DaaEncodedId结构承载。交通标识符被压缩为 64 位键uint64_t id外加一个编码枚举uint8_t encoding。identify_traffic_report()从一份transponder_report中按有效 ICAO 地址 → ADS-B 呼号 → UAS-ID的优先级提取标识符并会过滤本机自检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 安全裕度设计。常量与枚举消息定义了三组常量冲突级别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依据本机与交通机的几何关系与速度矢量计算产生是整个 DAA 决策链的输入。在 detect_and_avoid.cpp 中get_action_from_conflict_level()通过DaaActionPolicy::action_from_conflict_level()将冲突级别映射为具体动作仅警告、悬停、返航、降落、终止飞行等随后由publish_action_command()以vehicle_command形式下发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 的缩减尾字节三类编码与 DaaEncodedId.h 中的实现严格对应ICAO 地址取 24 位kMaxIcaoAddress 0xFFFFFF呼号按 8 字符打包kCallsignLength 9含结尾\0UAS ID 取尾部字节kIdEncodingNbBytes 8保证 8 字节可装入uint64_tUAS ID 全长kUasIdByteLength 18。消费端必须根据unique_id_encoding选择解码方式这正是该字段存在的意义。队列长度ORB_QUEUE_LENGTH 16detect_and_avoid主题的发布队列深度。如前文所述其取值受限于交通报告输入队列长度并经过static_assert静态校验。发布链路从 transponder 报告到 detect_and_avoid 样本DetectAndAvoid是MissionBlock与ModuleParams的子类随navigator的激活周期运行。其核心处理入口process_traffic()detect_and_avoid.cpp的调用链如下采集本机状态gather_ownship_input()从vehicle_global_position与vehicle_local_position采集本机经纬度、高度与 NED 速度并校验坐标合法性、时间戳新鲜度超过 2 s 视为过期kOwnshipPositionTimeout。本机姿态过期时会清空冲突缓冲。清理过期冲突周期性调用ConflictTracker::remove_stale_conflicts()超时阈值由参数DAA_TRAFF_TOUT决定。消费交通报告队列process_transponder_queue()逐条拉取transponder_report主题队列队列长度见transponder_report_s::ORB_QUEUE_LENGTH先经transponder_data_valid()校验WGS84 坐标、有限高度/航向/速度、时间戳与 tslc 年龄再交给process_transponder_report()。逐机评估并发布process_transponder_report()中先由DaaEncodedId::identify_traffic_report()识别流量身份id0 直接丢弃再调用AdsbConflict::calculate_daa_output()计算全部输出字段随后_detect_and_avoid_pub.publish(daa_output)detect_and_avoid.cpp。更新冲突跟踪器评估结果写入ConflictTracker固定大小缓冲kDaaMaxTraffic 5仅当冲突级别非 NONE、或该飞机已在跟踪中时更新ConflictNotifier依据本周期变更记录决定是否发出用户告警。汇总发布publish_most_urgent_conflict_if_changed()另行发布detect_and_avoid_most_urgent汇总主题供 commander 的 DAA 解锁检查与自动动作决策使用。其中一处实现细节值得注意process_transponder_queue通过failure_injection_s::FAILURE_UNIT_SYSTEM_TRAFFIC_AVOIDANCE支持故障注入——当系统级交通避让单元被注入故障时所有交通报告将被跳过处理用于验证 DAA 失效时的降级行为detect_and_avoid.cpp。与 DetectAndAvoidMostUrgent 的职责划分两主题同由DetectAndAvoid组件发布但粒度与用途完全不同可通过对比二者定义确认维度detect_and_avoiddetect_and_avoid_most_urgent粒度单架被评估交通飞机当前最紧急的一个冲突汇总发布频率每份产生冲突或更新跟踪的报告缓冲变更后、最紧急冲突变化时几何信息完整水平/垂直/三维距离、碰撞时间仅三维距离空缓冲时为 9999附加字段unique_id/unique_id_encoding额外有has_action配置的响应是否强于仅警告消费方日志、测试commander DAA 解锁检查、自动动作决策、日志、测试汇总主题的定义见 msg/DetectAndAvoidMostUrgent.msg。可以理解为detect_and_avoid回答刚评估的这架飞机冲突情况如何detect_and_avoid_most_urgent回答现在整体上最该处理的冲突是什么、要不要动作。相关参数与配置要点DetectAndAvoid组件通过DEFINE_PARAMETERS声明了一批 DAA 参数detect_and_avoid.h常用的如下参数类型默认值说明DAA_ENint32-DAA 功能总开关为 0 时组件整体禁用并复位DAA_NOTIF_STATEint32-状态类用户告警的最小间隔秒DAA_TRAFF_TOUTint32-交通报告过期时间秒用于冲突缓冲的过期清理ADSB_ICAO_ID/ADSB_ICAO_ID_2int32-1本机 ICAO 地址-1 禁用用于过滤自检ADSB_CALLSIGN_1/ADSB_CALLSIGN_2int320本机呼号各 4 字符的打包值合成 8 字符呼号键上述 ADSB 参数的定义可参见 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结尾。本机 UAS-ID 则取自平台 GUIDboard_get_px4_guid取其尾字节打包成 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参数控制交通避让行为。测试验证与观测方法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测试覆盖的关键行为包括DAA_EN关闭时组件不激活注入合成交通报告后detect_and_avoid_most_urgent的conflict_level正确跳变如NONE → HIGH → NONEhas_action随级别与参数正确置位以及冲突缓冲在报告停止后的清空逻辑drain_detect_and_avoid_topic()用于排空队列。此外src/modules/navigator/DetectAndAvoid/detect_and_avoid_fake_traffic.cpp提供了合成交通注入实现——在启用CONFIG_NAVIGATOR_ADSB_FAKE_TRAFFIC的构建中可从 navigator shell 运行fake_traffic脚本kUniqueIds、kEscalation、kSpamSame、kSpamNew、kFlags、kQueueFill等模式注入带完整旗标的模拟 ADS-B 报告用于手动验证 DAA 冲突评估与动作输出。在实际飞行或仿真中可通过 PX4 日志系统订阅该主题观测每架交通飞机的冲突评估使用uORB订阅或地面站日志回放检查conflict_level、aircraft_dist*与expected_min_dist_time随交通态势的变化即可定位 DAA 评估是否按预期工作。小结detect_and_avoid是 PX4 检测避让体系中逐机评估的数据出口它以 8 个字段完整刻画一架交通飞机的冲突级别、三维几何与保守碰撞时间用 5 档冲突级别与 3 类标识编码统一了 ICAO / ADS-B / UAS-ID 三种流量身份表达。结合 detect_and_avoid.cpp 的发布链路与 src/lib/adsb 的算法库可以清晰还原transponder 报告 → 逐机冲突评估 → 逐机发布 → 汇总发布的完整数据流。理解该消息是阅读 DAA 日志、编写 DAA 测试或扩展避让策略的第一步。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4-Autopilot通信机制详解uORB消息总线实现进程间高效通信PX4 Autopilot通信机制详解uORB消息总线实现进程间高效通信 PX4 Autopilot作为业界领先的开源自动驾驶系统其核心通信机制uORB通嵌入式物联网机器人自动驾驶智能硬件PX4-Autopilot uORB 消息详解ActuatorServosV0actuator_servos_v0舵机归一化控制消息PX4 Autopilot uORB 消息详解ActuatorServosV0actuator_servos_v0舵机归一化控制消息 ActuatorSe嵌入式物联网机器人自动驾驶智能硬件PX4 Autopilot EstimatorBias UORB 消息详解气压计与 GNSS 高度偏差估计PX4 Autopilot EstimatorBias UORB 消息详解气压计与 GNSS 高度偏差估计 EstimatorBias 是 PX4 飞控中 E嵌入式物联网机器人自动驾驶智能硬件上一篇Jeepay分账功能终极指南如何快速配置自动分账系统下一篇3分钟搞定PHP应用监控Pinpoint C Agent零侵入部署指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表