网站设计 站,网站建设考核标准,长沙百家号seo,网络营销的定义与特点OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中… OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中的加权方法7.4 加权方法的优化7.5 综合考虑信号质量的模型7.6 8812EU WiFi模块 1. 源由
在《OpenIPC开源FPV之Adaptive-Link工程解析》中已经有了整个工程的大体概念接下来再对代码进行逐步分析。
首先对天空端的代码进行分析ALink42n.c
2. 框架代码
ALink42n.c相对来说代码量最少也是最为基本的一份代码。
目前尚不太清楚具体n/p/q之间的差异逻辑上看应该是关于切换配置profile的条件计算方式不太一样对于稳定性、可靠性方面应该有所差异。 The relationship between .c and binary files #7
注感兴趣的朋友可以跟下帖子不过随着代码的深入了解以及性能测试数据也能慢慢明晰之间的差异。
加载配置 - “/etc/alink.conf”加载Profile - “/etc/txprofiles.conf”majestic80wfb-cli8000Terminalbash绑定默认IP - 10.5.0.10:9999 n/p/q只有q写的是10.5.0.10其他是10.5.0.2应该有笔误。 接受两种UDP报文special报文和普通报文
main├── load_config(CONFIG_FILE); // /etc/alink.conf├── load_profiles(PROFILE_FILE); // /etc/txprofiles.conf├── bind DEFAULT_IP(10.5.0.10) DEFAULT_PORT(9999)├──loop recvfrom│ ├── special: special_command_message(message);│ └── process_message(message);└── close(sockfd);3. 报文处理
------------------------------------------
| | special? (8B) | Msg content |
| Msg len (4B) |----------------------------|
| | RF Signal Estimated Values |
------------------------------------------3.1 special报文
报文格式
------------------------------------------
| Msg len (4B) | special? (8B) | Msg content |
------------------------------------------代码流程
处理pause_adaptive/resume_adaptive/request_keyframe命令
special_command_message├── pause_adaptive│ └── paused true├── resume_adaptive│ └── paused false├── drop_gop│ └── // 已经注释掉代码暂时保留├── request_keyframe│ └── request_keyframe_interval_ms idrCommand└── Unknown3.2 普通报文
报文格式
---------------------------------------------------------------------------------------------------------------
| Msg len (4B) | transmitted_time | link_value_rssi | link_value_snr | recovered | lost | rssi1 | rssi2 | rssi3 | rssi4 |
---------------------------------------------------------------------------------------------------------------代码流程
解析地面端报文反馈的RF信号参数比如RSSI/SNR等
process_message├── [index/token parse]│ ├── 0 transmitted_time atoi(token);│ ├── 1 link_value_rssi atoi(token);│ ├── 2 link_value_snr atoi(token);│ ├── 3 recovered atoi(token);│ ├── 4 lost atoi(token);│ ├── 5 rssi1 atoi(token);│ ├── 6 rssi2 atoi(token);│ ├── 7 rssi3 atoi(token);│ ├── 8 rssi4 atoi(token);│ └── . Ignore extra tokens├── !time_synced settimeofday(tv, NULL)└── !paused start_selection(link_value_rssi, link_value_snr);4. 工作流程
4.1 Profile 竞选
当 2.1 paused 为 false 时满足触发条件则进行 start_selection
start_selection├── selection_busy return├── rssi_score 999 value_chooses_profile(999); // Default settings│ └── return├── int combined_value floor(rssi_score * w_rssi snr_score * w_snr);├── constrain(1000, 2000, combined_value)├── float percent_change fabs((float)(value - baseline_value) / baseline_value) * 100;└── percent_change hysteresis_percent└── time_diff_ms min_between_changes_ms value_chooses_profile(value); // apply new settings注这里采用了 rssi 和 snr 权重方式。
4.2 Profile 研判
当 Profile 竞选成功后在实际应用时需要检查触发条件比如如果当前为需要切换的 Profile则无需触发。
value_chooses_profile├── Profile* selectedProfile get_profile(input_value);├── [Find the index of the selected profile]├── previousProfile currentProfile return // no changes├── previousProfile 0 timeElapsed hold_fallback_mode_s return // first profile in fallback time├── (currentProfile - previousProfile 1) timeElapsed hold_modes_down_s // just one step difference in hold time└── apply_profile(selectedProfile)无缝的触发场景判断能够确保信号的稳定传输和平滑切换 what’s the difference between hold_fallback_mode_s and hold_modes_down_s? #9
4.3 Profile 应用
这里需要注意几个细节
功率增加/减小其命令执行顺序不一致综合信号质量来选择不同的GI/MCS/FecK/FecN/Bitrate/Gop/Power/ROIqp
apply_profile
├── Local Variables Initialization
│ └── Command Templates and Time Calculation
├── Load Profile Variables into Local Variables
│ └── Copy values from profile into local variables
├── Profile Comparison (currentProfile vs previousProfile)
│ ├── If currentProfile previousProfile:
│ │ ├── Execute Power Command if changed // iw dev wlan0 set txpower fixed %d
│ │ ├── Execute GOP Command if changed // curl -s http://localhost/api/v1/set?video0.gopSize%f
│ │ ├── Execute MCS Command if changed // wfb_tx_cmd 8000 set_radio -B 20 -G %s -S 1 -L 1 -M %d
│ │ ├── Execute FEC Command if changed // wfb_tx_cmd 8000 set_fec -k %d -n %d
│ │ ├── Execute Bitrate Command if changed // curl -s http://localhost/api/v1/set?video0.bitrate%d
│ │ ├── Execute ROI Command if changed // curl -s http://localhost/api/v1/set?fpv.roiQp%s
│ │ └── Execute IDR Command if enabled // curl localhost/request/idr
│ └── Else (if currentProfile previousProfile):
│ └── Execute commands in different order
└── Display Stats (msposdCommand)└── Execute msposdCommand // echo %ld s %d M:%d %s F:%d/%d P:%d G:%.1fL30F28 CPU:C Tc %s /tmp/MSPOSD.msgrangeMinrangeMaxsetGIsetMCSsetFecKsetFecNsetBitratesetGopwfbPowerROIqp999999long0121533321.0610,0,0,010001150long0121533331.0600,0,0,011511300long1121566671.05912,12,12,1213011700long21215100001.05812,8,8,1217011850long31215125001.0568,0,0,818512001short31215140001.0564,0,0,4 rangeMin: Starting value of the range. rangeMax: Ending value of the range. setGI: 是无线通信系统中的 保护间隔GIGuard Interval。短GI400 ns和长GI800 ns是两种常见的保护间隔设置用于管理OFDM正交频分复用符号之间的时间间隔。选择短GI或长GI会影响性能和抗干扰能力。它通常在无线通信协议的 物理层PHY 中进行设置比如Wi-Fi802.11标准。 setMCS: 定义了用于数据传输的调制和编码方案。MCS决定了数据是如何编码的调制类型以及为错误纠正添加了多少冗余数据编码率。在Wi-Fi802.11n/ac/ax中MCS值通常从0到9或更高取决于Wi-Fi版本。MCS索引是802.11协议标准的一部分并且可以根据链路质量和信号强度进行调整。 setFecK: 指的是前向错误纠正FEC方案特别是表示在应用错误纠正之前的数据位数K值。FEC用于通过添加冗余数据来提高无线通信的可靠性从而使接收方能够纠正噪声或干扰引起的错误。K值通常是Reed-Solomon编码或卷积编码中的一个参数。 setFecN: 表示应用FEC后的总位数包括数据位和校验位。 K/N的比率给出了编码率这决定了为错误纠正添加的冗余程度。较低的FEC值例如1/2表示更多的冗余和错误纠正能力而较高的值如3/4或5/6则提供更高的吞吐量但错误纠正能力较弱。 setBitrate: 表示通过无线链路传输数据的速度通常以Mbps兆比特每秒为单位。该值受到调制方案、编码率和信号强度的影响。在Wi-Fi网络中通常会根据这些因素动态调整比特率以优化吞吐量同时保持稳定的连接。 setGop: GOP设置与视频编码相关尤其是在像H.264或H.265这样的压缩方案中。定义了关键帧I帧之间的间隔。短GOP意味着更频繁的关键帧更高的视频质量较低的压缩而长GOP意味着较少的关键帧更高的压缩较低的质量。在无线通信中这个设置对于视频流的传输有很大影响。 wfbPower: 指的是无线前端WFB硬件的发射功率。发射功率是无线通信中的一个关键参数影响无线信号的范围和质量。在Wi-Fi设备中功率通常可以根据法规限制、设备能力和网络状况进行调整。wfbPower值可能用于配置设备中射频RF部分的放大器。 ROIqp: ROI QP values as a comma-separated string (e.g., 0,0,0,0).
5. 总结
Profile 是一个经验值(测试值)依赖于具体场景应用。配置参数如hold_fallback_mode_s/hold_modes_down_s 也是一个经验参数依赖于具体应用场景。RSSI SNR 权重 RF信号质量计算模型也是一个经验方法可以调整更优的算法。
基于上述逻辑对于这些内容的优化就能更好的将FPV视频无缝的应用于实际环境 - 取决于大量的测试和优化。
注这里感觉缺少心跳报文丢失的处理以应对极端情况。
6. 参考资料
【1】OpenIPC开源FPV之Adaptive-Link工程解析
7. 补充资料
RSSI接收信号强度指示和SNR信噪比是衡量信号质量的常用指标。
加权 RSSI 和 SNR 以综合评估信号质量的做法基于以下几个理论依据
RSSI 反映信号强度而 SNR 反映信号与噪声的比率两者结合能够更全面地评估信号质量。加权方式可以根据应用场景和环境的变化动态调整各个参数的影响优化信号质量的评估。加权系数的调整通常是基于实际的应用需求和实验数据优化的。
通过加权结合这两个指标可以更准确地反映无线通信中的实际信号质量进而为系统做出更合理的决策如选择最佳基站、调整发射功率、优化资源分配等。
7.1 RSSI 和 SNR 的物理含义 RSSI表示接收到的信号强度是衡量信号功率强度的一个指标。通常情况下RSSI 越高表示信号接收的质量越好。然而RSSI 只反映了信号的强度并不直接考虑噪声的影响。 SNR表示信号与噪声的比值是衡量信号质量的一个重要指标。SNR 越高意味着信号在噪声背景下越清晰通信质量越高。高的 SNR 值通常意味着信号更容易被准确解码而低的 SNR 值则容易导致误码或通信失败。
7.2 信号质量加权的理论依据 信号强度与噪声的相对重要性 单独依赖 RSSI 来衡量信号质量可能会产生误导。因为高强度的信号也可能伴随着较强的噪声而高噪声水平会影响信号的清晰度。因此SNR 提供了一个更全面的衡量标准考虑了信号的强度与噪声的关系。加权方式结合了这两个指标能够更准确地反映实际信号质量。 加权的数学模型 一种常见的做法是将 RSSI 和 SNR 作为输入参数通过某种加权函数或线性组合来得到一个综合的信号质量指标。可以根据具体场景的需求调整权重值。例如 Q w 1 ⋅ RSSI w 2 ⋅ SNR Q w_1 \cdot \text{RSSI} w_2 \cdot \text{SNR} Qw1⋅RSSIw2⋅SNR 其中$ w_1 $ 和 $ w_2 $ 是 RSSI 和 SNR 的权重系数表示它们在信号质量计算中的相对重要性。 选择合适的权重系数 权重的设置需要根据具体的应用需求和实验数据来优化。在一些应用中SNR 可能更为关键因为它直接影响到数据传输的错误率而在其他场景中RSSI 可能更重要因为信号强度直接决定了通信的覆盖范围。
7.3 实际应用中的加权方法 无线通信系统在无线通信中RSSI 和 SNR 都是评估信号质量的重要指标。将两者加权后系统可以更好地判断信号的稳定性和传输质量。例如在 Wi-Fi 或移动通信中基站或接入点会同时考虑这两个参数以确保数据传输的可靠性。 动态信号质量评估无线环境通常是动态变化的信号强度和噪声水平可能随时间和位置变化。通过加权方式可以更灵活地反映当前信号的质量特别是在复杂的多径传播和干扰环境中。
7.4 加权方法的优化 信道的特性在不同的无线信道中RSSI 和 SNR 对信号质量的影响可能不同。例如在高干扰环境下SNR 的作用更为突出因此可以为 SNR 分配更大的权重。而在信号强度较好的环境中RSSI 可能会更重要。 基于经验的调整通过实际测试和仿真可以根据不同的环境条件和通信需求调整 RSSI 和 SNR 的权重。例如在一个需要长距离传输的场景中可能会更侧重于 RSSI而在一个要求高数据速率和低错误率的场景中可能会更关注 SNR。
7.5 综合考虑信号质量的模型
在一些高级的信号质量评估模型中除了直接的 RSSI 和 SNR 之外可能还会考虑其他因素比如
路径损耗信号在传播过程中的衰减。干扰来自其他无线设备或环境的噪声。调制方式不同的调制方式对信号质量的敏感度不同。
这些因素也可能在加权过程中作为附加的输入进一步提升信号质量评估的准确性。
7.6 8812EU WiFi模块
M8812EU2 2T2R 802.11a/n/ac WiFi ModuleUsing BL-M8812EU2 (or other RTL8812EU-based) Wi-Fi Module
功率设置两个方法 WIP: Add support for RTL8812EU-based Wi-Fi adapters for FPV firmware #1344
driver_txpower_overridein /etc/wfb.conf. The range is 0~63iw dev wlan0 set txpower fixed mBm. The range is 0~3150, and can be set dynamically when transmitting.