OpenIPC开源FPV之Adaptive-Link天空端代码解析

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”
  • majestic:80
  • wfb-cli:8000
  • Terminal:bash
  • 绑定默认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`
 └──> "Unknown"

3.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

注:这里采用了 rssisnr 权重方式。

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:%.1f&L30&F28 CPU:&C &Tc %s' >/tmp/MSPOSD.msg"
rangeMinrangeMaxsetGIsetMCSsetFecKsetFecNsetBitratesetGopwfbPowerROIqp
999999long0121533321.0610,0,0,0
10001150long0121533331.0600,0,0,0
11511300long1121566671.05912,12,12,12
13011700long21215100001.05812,8,8,12
17011850long31215125001.0568,0,0,8
18512001short31215140001.0564,0,0,4
  • rangeMin: Starting value of the range.

  • rangeMax: Ending value of the range.

  • setGI: 是无线通信系统中的 保护间隔(GI,Guard Interval)短GI(400 ns)和长GI(800 ns)是两种常见的保护间隔设置,用于管理OFDM(正交频分复用)符号之间的时间间隔。选择短GI或长GI会影响性能和抗干扰能力。它通常在无线通信协议的 物理层(PHY) 中进行设置,比如Wi-Fi(802.11标准)。

  • setMCS: 定义了用于数据传输的调制和编码方案MCS决定了数据是如何编码的(调制类型),以及为错误纠正添加了多少冗余数据(编码率)。在Wi-Fi(802.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.264H.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 以综合评估信号质量的做法,基于以下几个理论依据:

  1. RSSI 反映信号强度,而 SNR 反映信号与噪声的比率,两者结合能够更全面地评估信号质量。
  2. 加权方式可以根据应用场景和环境的变化,动态调整各个参数的影响,优化信号质量的评估。
  3. 加权系数的调整通常是基于实际的应用需求和实验数据优化的。

通过加权结合这两个指标,可以更准确地反映无线通信中的实际信号质量,进而为系统做出更合理的决策(如选择最佳基站、调整发射功率、优化资源分配等)。

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} Q=w1RSSI+w2SNR
    其中,$ 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 Module
  • Using 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~63
  • iw dev <wlan0> set txpower fixed <mBm>. The range is 0~3150, and can be set dynamically when transmitting.
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

metinfo的csrf漏洞复现

http://localhost/metinfo/install/index.php 管理员admin登录 抓修改信息包 进入点击受害链接 localhost/333.html 管理员被修改密码原来root错误被强制退出 输入密码123456登录正常

jclasslib Bytecode Viewer 安装

IDEA 2023.1.3 Settings->Plugins->Marketplace&#xff0c;搜索jclasslib Bytecode Viewer, install,apply 选中你所要分析的类&#xff0c;view->show bytecode with jclasslib gaoding

智能高效的IDE GoLand v2024.3全新发布——支持最新Go语言

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

Android学习路线图

‌Android系统的开发始于2003年&#xff0c;最初由安迪鲁宾在危险公司&#xff08;Danger, Inc.&#xff09;开发。2005年&#xff0c;Google收购了危险公司&#xff0c;并将其移动开发团队纳入旗下。2007年&#xff0c;Google正式发布了Android的第一个版本&#xff0c;并随后…

【含开题报告+文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

开题报告 近年来&#xff0c;随着互联网技术的迅猛发展&#xff0c;人们的生活方式、消费习惯以及信息交流方式都发生了深刻的变化。旅游业作为国民经济的重要组成部分&#xff0c;其信息化、网络化的发展趋势也日益明显。旅游论坛作为旅游信息交流和分享的重要平台&#xff0…

CTFshow-php特性(Web89-115)

CTFshow-php特性(Web89-115) Web89&#xff08;intval&#xff09; <?php include("flag.php"); highlight_file(__FILE__);if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num))…

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中&#xff0c;我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而&#xff0c;有时我们会遇到“IP地址获取失败”的困扰&#xff0c;这不仅阻碍了我们的网络访问&#xff0c;还可能带来一系列的网络连接问题。那么&#xff0c;IP地址获取…

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…

RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGB

RK3588 ,基于FFmpeg, 拉取RTSP,使用 mpp 实现硬解码. ⚡️ 参考: Rk3588 FFmpeg 拉流 RTSP, mpp 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode RTSPint open_stream(

ubuntu监测硬盘状态

安装smartmontools smartctl -l error /dev/sdk smartctl -i /dev/sda lshw -class disk smartctl -H /dev/sd 结果1&#xff1a; 结果2&#xff1a;PASSED&#xff0c;这表示硬盘健康状态良好 smartctl -a /dev/sdb sdk lsblk blkid 测试写入速度 time dd if/dev/zero of…

Yolov8源码分析

1、目录介绍 主要目录ultralitics&#xff08;重点&#xff09; 1、assets目录 这个文件保存了YOLO历史上可以说是最经典的两张图片&#xff0c;供大家测试程序来使用的。 2、cfg 这个文件下面保存了我们的模型配置文件&#xff0c;cfg目录是项目配置的集中地&#xff0c;其…

【学习笔记总结】华为云:应用上云后的安全规划及设计

一、背景和问题 数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势&#xff0c;如成本效益、可扩展性、灵活性以及便捷的资源共享等&#xff0c;已然成为了现代业务运营的重要支撑。 今年&#xf…

Unity全局光照详解

之前就学过但是太久没用又忘了&#xff0c;因此用最简洁易懂的语言做个记录。 全局光照分为两个系统&#xff0c;分别是实时光照和混合光照。&#xff08;点击window/Rendering/Lighing打开此面板&#xff09; 其中全局光照对于我来说都是新技术了&#xff0c;上一次学…

ZNN零化神经网络及其在机器人上的应用

1.解等式约束问题 1.1等式QP问题描述 考虑如下等式约束的时变二次规划&#xff08;QP&#xff09;问题&#xff1a; 采用拉格朗日乘数法将其转换为无约束优化问题&#xff1a; 对未知量求偏导&#xff1a; 将上式整理成矩阵的形式&#xff1a; 1.2ZNN解等式约束问题 定义误差…

HICE-day6

二层交换 交换基础 所谓的二层交换机指的是针对数据的二层头部&#xff08;以太网帧头&#xff09;中的MAC地址进行寻址并转发数据的交换设备。二层交换机不具备路由功能&#xff0c;它工作在OSI七层模型的第二层&#xff0c;因此被称为二层交换机。 上图中&#xff0c;PC1、…

ret2text

上一篇博客是对栈溢出的基本学习&#xff0c;做了几个题练习了一下&#xff0c;师兄给的建议是多用gdb&#xff0c;更直观&#xff0c;动态也可以查看寄存器和栈的变化 一、如何使用gdb 1.peda插件的安装 为了方便查看堆栈和寄存器&#xff0c;最好是安装peda插件&#xff0…

Ubuntu安装Gitlab详细图文教程

1、环境准备 1.1、Ubuntu环境 Ubuntu24.04Sever版安装教程 1.2、更新系统 sudo apt update -y sudo apt-get update sudo apt-get upgrade 2、安装Nginx 2.1 安装nginx # 安装 apt install nginx -y 2.2 修改nginx配置⽂件 # 修改nginx配置 vim /etc/nginx/si…

计算机网络之王道考研读书笔记-1

第 1 章 计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络概念 internet(互连网)&#xff1a;泛指由多个计算机网络互连而成的计算机网络。这些网络之间可使用任意通信协议。 Internet(互联网或因特网)&#xff1a;指当前全球最大的、开放的、由众多网络和路由器互连…

交互妙方Ethercat转Profinet网关连接雷赛伺服驱动器

客户需求&#xff1a;将雷赛DM3E伺服驱动器接入西门子系列PLC&#xff0c;该PLC使用Profinet协议通讯&#xff0c;而伺服驱动器为EthereCAT协议&#xff0c;故使用开疆智能EtherCAT转Profinet网关进行数据转换。 配置过程&#xff1a; 1&#xff1a;首先找到伺服驱动器的官网下…

TDengine 新功能 从 CSV 批量创建子表

1. 背景 我们在从一些数据源&#xff08;比如关系型数据库&#xff09;批量导入数据前&#xff0c;我们可能需批量创建出所需子表。TDengine 引擎从 v3.3.3.0 版本开始&#xff0c;提供了通过 CSV 文件批量创建子表的功能&#xff0c;使用者只要按约定的格式生成 CSV 文件&…