Ardupilot OpenIPC 基于WFB-NG构架分析和数据链路思考

Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考

  • 1. 源由
  • 2. OpenIPC安装
    • 2.1 安装
    • 2.2 配置
      • 2.2.1 天空端配置文件
      • 2.2.2 地面端配置文件
    • 2.3 当前配置选择
  • 3. WFB-NG安装
    • 3.1 RTL8812AU安装
      • 3.1.1 驱动安装
      • 3.1.2 定位设备
    • 3.2 wfb-ng安装
      • 3.2.1 传输层安装
      • 3.2.2 配置调整
    • 3.3 wfb-ng-osd安装
      • 3.3.1 编译安装
      • 3.3.2 使用事项
    • 3.4 video-viewer安装
  • 4. 总结
  • 5. 参考资料

1. 源由

最近入手一套OpenIPC(SCC338Q+IMX415+Hi3536DV100+RTL8812AU),为了更好的配合GPU的AI运算,进行视频图像分析,初步计划如下:

  1. 天空端:视频(伴机电脑)
  2. 地面端:GPU视频分析/决策+遥控+地面站

为此,前面的准备工作:

  • ArduPilot飞控之Gazebo + SITL + MP的Jetson Orin环境搭建
  • ArduPilot开源飞控之lida2003套机+伴机电脑首飞
  • ubuntu22.04@Jetson Orin Nano之OpenCV安装
  • Linux 36.2@Jetson Orin Nano之Hello AI World!
  • ubuntu22.04@laptop OpenCV Get Started
  • ExpressLRS硬件实测性能分析

当然,这些仅仅是已经做过的一些,对于上面的设想,远远不够,不过我们始终在靠近我们的愿景!

接下来,就将实时视频这块内容增加进来,已经知道的链路大概已经有很多条了,整理下:

a)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Hi3536DV100 ==> FPV Goggles/Display
b)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Hi3536DV100 ==> Ground Control Station
c)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Jetson Orin Nano (GPU/AI)
d)【视频链路】IMX415 ==> SCC338Q ==> Raspberry Pi3B+ (GPU/CPU/AI)
e)【控制链路】FC <== SCC338Q <== RTL8812AU <== Hi3536DV100 <== Ground Control Station
f)【控制链路】FC <== RC Receiver <== RC Transmitter <== RC Controller
e)【控制链路】FC <== SCC338Q <== RTL8812AU <== Jetson Orin Nano (GPU/AI)
g)【控制链路】FC <== SCC338Q <== RTL8812AU <== Raspberry Pi3B+ (GPU/CPU/AI)

注:这里不考虑中继等问题,因为中继进来,整个链路就更加复杂了。

2. OpenIPC安装

  • Alternative open firmware for your IP camera

2.1 安装

略. 后续根据情况再做展开,目前可以看做是一个开源的黑匣子,它的底层实现依赖于WFB-NG。

2.2 配置

2.2.1 天空端配置文件

  • /etc/wfb.conf
# cat /etc/wfb.conf
### unit: drone or gs
unit=dronewlan=wlan0
region=00
### By default used channel number, but, you may set freq instead. For ex: 2387M
channel=64
frequency=
txpower=20
driver_txpower_override=20
bandwidth=20
stbc=0
ldpc=0
mcs_index=1
stream=0
link_id=7669206
udp_port=5600
rcv_buf=456000
frame_type=data
fec_k=8
fec_n=12
pool_timeout=0
guard_interval=long
  • /etc/majestic.yaml
# cat /etc/majestic.yaml
system:staticDir: /var/wwwwebPort: 80httpsPort: 443plugins: falsebuffer: 1024
isp:antiFlicker: disabledexposure: 20aGain: 40sensorConfig: /etc/sensors/imx415_fpv.bin
image:mirror: falseflip: falserotate: 0contrast: 50hue: 50saturation: 50luminance: 50
video0:enabled: truecodec: h265fps: 60bitrate: 2048rcMode: cbrgopSize: 1size: 1024x768
video1:enabled: falsecodec: h264size: 704x576fps: 15
jpeg:enabled: falseqfactor: 50fps: 5
osd:enabled: falsefont: /usr/share/fonts/truetype/UbuntuMono-Regular.ttftemplate: "%d.%m.%Y %H:%M:%S"posX: 16posY: 16
audio:enabled: falsevolume: 30srate: 8000codec: opusoutputEnabled: falseoutputVolume: 30
rtsp:enabled: trueport: 554
nightMode:enabled: falseirCutSingleInvert: falsecolorToGray: trueirSensorPinInvert: false
motionDetect:enabled: falsevisualize: falsedebug: false
records:enabled: falsepath: /mnt/mmcblk0p1/%F/%H.mp4maxUsage: 95
outgoing:enabled: trueserver: udp://127.0.0.1:5600naluSize: 1200
watchdog:enabled: truetimeout: 300
hls:enabled: false
onvif:enabled: false
ipeye:enabled: false
youtube:enabled: false

2.2.2 地面端配置文件

  • /etc/wfb.conf
# cat /etc/wfb.conf
### unit: drone or gs
unit=gswlan=wlan0
region=00
### By default used channel number, but, you may set freq instead. For ex: 2387M
channel=64
frequency=
txpower=20
driver_txpower_override=20
stream=0
link_id=7669206
udp_addr=127.0.0.1
udp_port=5600
telemetry=true
  • /etc/vdec.conf
# cat /etc/vdec.conf
### Port for video rx (default: 5000)port=5600### Codec: h264 or h265 (default: h264)codec=h265### Incoming data format: stream or frame (default: stream)format=frame### Screen output mode:
# 720p60       - 1280 x 720  @ 60 fps
# 1080p60      - 1920 x 1080 @ 60 fps
# 1024x768x60  - 1024 x 768  @ 60 fps
# 1366x768x60  - 1366 x 768  @ 60 fps
# 1280x1024x60 - 1280 x 1024 @ 60 fps
# 1600x1200x60 - 1600 x 1200 @ 60 fps
# 2560x1440x30 - 2560 x 1440 @ 30 fpsmode=1024x768x60### Mavlink port for telemetry (default: 14750)mavlink_port=14750### Osd: none, simple or custom for use own lvgl based osd (custom osd binary need to be upload to /usr/bin directory) (default: simple)osd=simple### Records archive (Mount ssd, set up full path to records archive, file names generated automatically. example: /mnt/sda1/recorder)records=### Extra param (write in one line split by space):#    --ar [mode]        - Aspect ratio mode               (Default: keep)
#      keep             - Keep stream aspect ratio
#      stretch          - Stretch to output resolution
#      manual           - Manual image size definition#    --ar-bg-r [Value]  - Fill color red component      (Default: 0)
#    --ar-bg-g [Value]  - Fill color green component    (Default: 0)
#    --ar-bg-b [Value]  - Fill color blue component     (Default: 0)#    --ar-x [Value]     - Image position X
#    --ar-y [Value]     - Image position Y
#    --ar-w [Value]     - Image width
#    --ar-h [Value]     - Image height#    --bg-r [Value]     - Background color red      (Default: 0)
#    --bg-g [Value]     - Background color green    (Default: 96)
#    --bg-b [Value]     - Background color blue     (Default: 0)extra="--bg-r 30 --bg-g 0 --bg-b 30"

2.3 当前配置选择

鉴于手头测试设备的限制,为了更好的使用,配置如下:

  • 分辨率:1024x768 //配合一台VGA液晶显示器
  • 编解码:H265 //SCC338Q & Hi3536DV100 支持
  • 编码率:60FPS //Hi3536DV100 支持最高的解码率
  • WiFi频点:channel=64

注:H265编解码存在花屏现象,可能与底层分包组装有关,详见:How to configure 720P@120fps on wfb_gs on ubuntu(not OpenIPC gs)
#336

3. WFB-NG安装

  • ubuntu22.04@laptop安装&配置wfb-ng

3.1 RTL8812AU安装

3.1.1 驱动安装

$ sudo apt-get install dkms
$ git clone -b v5.2.20 git@github.com:svpcom/rtl8812au.git
$ cd rtl8812au/
$ sudo ./dkms-install.sh

3.1.2 定位设备

如果设备正确安装了,那么将会看到类似下面的输出:

$ nmcli...
wlan1: unmanaged"Realtek RTL8812AU 802.11a/b/g/n/ac 2T2R"wifi (rtl88xxau_wfb), 20:0D:B0:32:DA:3A, hw, mtu 4052
...

注:这里笔者环境WiFi设备为Realtek RTL8812AU 802.11a/b/g/n/ac 2T2R 设备号:wlan1

3.2 wfb-ng安装

3.2.1 传输层安装

之前已经定位WiFi设备为wlan1,安装地面站:

$ git clone -b stable git@github.com:svpcom/wfb-ng.git
$ cd wfb-ng
$ sudo ./scripts/install_gs.sh wlan1

注:Jetson Orin平台安装时,会存在问题,需要修复安装脚本,详见:[Jetson Orin] wfb-ng/env/bin/pip: No such file or directory

3.2.2 配置调整

  1. 调整通信频点与SCC338Q channel=64一致
$ sudo cat /etc/wifibroadcast.cfg
[common]
wifi_channel = 64     # 161 -- radio channel @5825 MHz, range: 5815–5835 MHz, width 20MHz# 1 -- radio channel @2412 Mhz,# see https://en.wikipedia.org/wiki/List_of_WLAN_channels for reference
wifi_region = 'BO'     # Your country for CRDA (use BO or GY if you want max tx power)[gs_mavlink]
peer = 'connect://127.0.0.1:14550'  # outgoing connection
# peer = 'listen://0.0.0.0:14550'   # incoming connection[gs_video]
peer = 'connect://127.0.0.1:5600'  # outgoing connection for# video sink (QGroundControl on GS)
  1. 配置地面站与天空端的秘钥
$ wfb_keygen
Drone keypair (drone sec + gs pub) saved to drone.key
GS keypair (gs sec + drone pub) saved to gs.key$ ls
drone.key  gs.key
  • drone.key --> 天空端 /etc/drone.key
  • gs.key --> 地面端 /etc/gs.key

3.3 wfb-ng-osd安装

3.3.1 编译安装

$ sudo apt-get install libcairo2-dev gstreamer1.0-tools libgstreamer1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly libgstreamer-plugins-base1.0-dev
$ make osd

3.3.2 使用事项

$ ./osd --help
./osd: invalid option -- '-'
./osd [-p mavlink_port] [-P rtp_port] [ -R rtsp_url ] [-4] [-5] [-j rtp_jitter] [-x] [-a] [-w screen_width]
Default: mavlink_port=14551, rtp_port=5600, rtsp_url=none, codec=h264, rtp_jitter=5, screen_width=1920
WFB-ng OSD version 23.12.15.60076-1acd315d
WFB-ng home page: <http://wfb-ng.org>
  • 鉴于当前OpenIPC使用venc/vdec进行编解码,所以无法被用于RTP相兼容的majectic streamer。
  • 若真想要尝试使用,需要在调整OpenIPC的venc0_P0_MAIN/venc1_P0_MAIN进程,暂不深入分析。目前在Jetson Orin平台上可以使用gstDecoder解码。

3.4 video-viewer安装

鉴于前面谈到的编解码问题,若要在Jetson Orin平台上能够对OpenIPC现在venc编码视频流进行解码,可以简单使用video-viewer这个工具,但是性能上现在看来并不理想,因为平台使用了GPU和CPU来介入。也许切换到常规RTP编解码会有更好的效果。

关于工具的安装,这里不再展开,感兴趣的朋友可以自行阅读:Linux 36.2@Jetson Orin Nano之Hello AI World!

4. 总结

鉴于:

  1. 目前最新数据720P@120FPS响应时间35~40ms延迟,具备FPV四轴高速飞行要求
  2. wfb_ng是传输层代码,在进行视频传输的同时,具备小数据电传链路功能
  3. wfb_ng是加密传输,开源代码
  • wfb-ng 开源工程结构&代码框架简明介绍

以下链路分析:

  • 相对传统链路:
    a)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Hi3536DV100 ==> FPV Goggles/Display
    b)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Hi3536DV100 ==> Ground Control Station
    e)【控制链路】FC <== SCC338Q <== RTL8812AU <== Hi3536DV100 <== Ground Control Station
    f)【控制链路】FC <== RC Receiver <== RC Transmitter <== RC Controller

  • 大数据分析链路:
    c)【视频链路】IMX415 ==> SCC338Q ==> RTL8812AU ==> Jetson Orin Nano (GPU/AI)
    d)【视频链路】IMX415 ==> SCC338Q ==> Raspberry Pi3B+ (GPU/CPU/AI)
    e)【控制链路】FC <== SCC338Q <== RTL8812AU <== Jetson Orin Nano (GPU/AI)
    g)【控制链路】FC <== SCC338Q <== RTL8812AU <== Raspberry Pi3B+ (GPU/CPU/AI)

Raspberry Pi3B+(Companion Computer)和Jetson Orin(DataCenter) 组成了大数据决策和边缘AI的构架模型。

  • DataCenter负责广域范围内的分析和决策
  • CompanionComputer负责局域范围内的分析和决策

在这里插入图片描述

以上是根据FPV无人机方面的一些简单想法(实际应用还可以进行适当的调整部署,以适应实际应用需求)。随着技术的发展,今后科技发展在各个领域都将会逐步形成细分的领域大数据决策和边缘AI应用,这也是为什么我们非常看好《一种部件生命期监测方法》在细分应用领域具有指导意义的重要原因。

好了,废话不多说,上点这套OpenIPC(SCC338Q+IMX415+Hi3536DV100+RTL8812AU) + Jetson Orin Nano的视频,感性认识下ubuntu22.04@Jetson Orin Nano安装WFB-NG&OpenIPC性能。

为什么说感性,因为测试环境配置都不高:(有过有朋友能提供更好的测试环境,那倒是可以考虑测下极限)

  1. 台式老显示器 1024x768@60Hz
  2. 裸奔测试屏幕1920x1080@60Hz
  3. 非高速拍摄&记录设备,使用老式小米手机
  4. 计时器显示屏幕2736x1824@59.96Hz (SurfacePro6)

注:受到venc/vdec编码器的影响,Jetson Orin似乎并不太支持这个解码流,效果不好。

OpenIPC(SCC338Q+IMX415+Hi3536DV100+RTL8812AU)性能测试

上述配置摄像头端(SCC338Q+IMX415+RTL8812AU)是能够满足720P@120FPS H265的,从延时报告的数据,大约能做到30~40ms。

实际看电视的效果,大家感受下:

ssc338q+imx415+nvr3536 OpenIPC看视频

5. 参考资料

【1】 wfb-ng Release 23.01镜像无头烧录&配置(1)
【2】 wfb-ng Release 23.01镜像无头烧录&配置(2)
【3】wfb-ng 锁定WiFi接口
【4】Linux 36.2@Jetson Orin Nano之基础环境构建
【5】Aocoda-RC H743Dual BMI270x2飞控,支持Ardupilot

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

Jenkins CI/CD 持续集成专题二 Jenkins 相关问题汇总

一 问题一 pod [!] Unknown command: package 1.1 如果没有安装过cocoapods-packager&#xff0c;安装cocoapods-packager&#xff0c;sudo gem install cocoapods-packager 1.2 如果已经安装cocoapods-packager&#xff0c;还是出现上面的错误&#xff0c;有可能是pod的安…

javaScript数组-(进阶算法)-计算滑动窗口最大值

滑动窗口 给定数组中的连续子数组&#xff0c;使其和达到最大值&#xff0c;并记录该子数组的起始和结束索引。最后&#xff0c;将最大和及其起始和结束索引存储在数组当中。 const arr [-1,-2,3,9,-4,8];let max null; let sum null;let i0,j0;let length arr.length;if…

什么是康养专业产教融合实训中心

康养专业产教融合实训中心是高等教育体系中的一种创新型教学设施&#xff0c;它整合了产业实践与教学研究的双重功能&#xff0c;旨在培养适应康养产业发展需求的专业人才。这种实训中心通过深度对接康养产业链上的各个环节&#xff0c;创建一个集教学、实训、科研、服务于一体…

什么是中医养生康复实训中心

中医养生康复实训中心是高等教育机构中专门设立的&#xff0c;集教学、实践、研究于一体的综合性教育平台&#xff0c;主要面向中医养生康复、针灸推拿、康复治疗技术等专业学生&#xff0c;目的是传承和发扬中医养生康复理念&#xff0c;培养具有扎实中医理论基础和实践经验的…

防、治、管融合一体化旅居健康守护系统

随着人口老龄化趋势的加剧和人们生活水平的提高&#xff0c;养老服务需求不断增长。旅居养老作为一种新型的养老模式&#xff0c;逐渐受到广大老年人的青睐。在生命健康服务运营平台中&#xff0c;为了给老人提供全方位、个性化的生命健康服务&#xff0c;我们平台也特意开设了…

31 信号量

概念 共享内存在通信的过程中&#xff0c;没有任何保护机制。当A进程写入了一部分&#xff0c;就被B、拿走了&#xff0c;导致双方发和收的数据不完整&#xff0c;数据不一致问题 1.A和B看到同一份资源&#xff0c;共享资源&#xff0c;如果不加保护&#xff0c;会导致数据不…

Uni-App 生命周期

在 Uni-App 中&#xff0c;页面和组件都有自己的生命周期函数&#xff0c;以下是一些常用的生命周期函数&#xff1a; 页面生命周期函数&#xff1a; onLoad: 页面加载时触发 onShow: 页面显示时触发 onReady: 页面初次渲染完成时触发 onHide: 页面隐藏时触发 onUnload: …

PyCharm添加外部工具

QtDesigner 可视化UI设计客户端工具 路径&#xff1a;File | Settings | Tools | External Tools点号&#xff0c;给External Tools组添加一个条目&#xff0c;填写如下内容 Name&#xff1a;QtDesignerProgram&#xff1a;C:\Users\用户名\AppData\Local\Programs\Python\Py…

在誉天学习云计算HCIE,担心考试考不过?

誉天定制化课程内容覆盖了所有考试重点&#xff0c;可以系统地掌握理论与实践知识。 对于笔试&#xff0c;类似于备考驾照理论学习阶段&#xff0c;誉天为大家提供在线模拟测试系统&#xff0c;帮助大家掌握云计算笔试考点。笔试通过后&#xff0c;18个月内&#xff08;一年半…

【QT进阶】Qt http编程之nlohmann json库使用的简单介绍

往期回顾 【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客 【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客 【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客 【QT进阶】Qt http编程之nlohmann json库使用的简单介绍 一、nlohman json库 1、C常用Json库 J…

Github 2024-04-22 开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4C++项目2Go项目2JavaScript项目1TypeScript项目1非开发语言项目1Zig项目1免费编程书籍和学习资源清单 创建周期:3762 天协议类型:…

Docker 哲学 - docker save | load | export | import 及实践

当我们说 "归档文件包含了容器的所有文件&#xff0c;但不包含容器的元数据和配置"&#xff0c;我们是指 docker export 命令导出的 tar 归档文件包含了容器的文件系统中的所有文件&#xff0c;包括应用程序、库、数据等。但是&#xff0c;这个归档文件不包含关于容器…

Python 网络与并发编程(一)

文章目录 并发编程介绍串行、并行与并发的区别进程、线程、协程的区别进程线程协程 并发编程解决方案同步和异步介绍 并发编程介绍 串行、并行与并发的区别 有任务A、B、C&#xff0c;一个CPU去执行他们&#xff0c;有几种方式 1、一个cpu按顺序执行ABC&#xff0c;这就是串行…

go语言并发实战——日志收集系统(六) 编写日志收集系统客户端

上节回顾 在上一篇文章中我们介绍了编写客户端的四个步骤&#xff0c;分别是&#xff1a; 读取配置文件&#xff0c;寻找日志路径初始化服务根据日志路径l来收集日志将收集到的日志发送Kafka中 关于上述的内容博主画了一个思维导图(有点丑&#xff0c;大家勉强看看&#xff0…

燃冬之yum、vim和你

了解了很多指令和权限&#xff0c;搞点真枪实弹来瞅瞅 学Linux不是天天就在那掰扯指令玩&#xff0c;也不是就研究那个权限 准备好迎接Linux相关工具的使用了么码农桑~ yum 软件包 什么是软件包呢&#xff1f; 首先来举个生活中常见点的例子&#xff1a;比如我的手机是华为…

Leetcode 20:有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

【项目部署-apache】windows系统下apache部署django+channels

一、系统环境 1、原生的python3.8.5&#xff08;默认安装&#xff0c;不更改安装目录&#xff09;&#xff0c;不要使用Anaconda做虚拟环境。 2、在windows系统下需要&#xff0c;mod_wsgi 模块。 创建虚拟环境&#xff1a;(在当前目录下创建名为 gzgs_alert 的虚拟环境) py…

Tensor张量的属性dim、type、size、shape、numel的使用方法介绍

本文重点 Tensor张量有一些常用的属性&#xff0c;我们可以通过这些基本的属性判断张量的类型&#xff0c;维度&#xff0c;以及元素个数&#xff0c;本节课程我们将对tensor属性进行简单的介绍。 代码 import torch import numpy as np atorch.Tensor(2,3,4) print(a) prin…

【论文笔记 | 异步联邦】 FedBuff

1. 论文信息 Federated Learning with Buffered Asynchronous Aggregation&#xff0c;International Conference on Artificial Intelligence and Statistics&#xff0c;2022&#xff0c;ccfc 2. introduction 2.1.1. 背景&#xff1a; 同步 FL &#xff0c;随训练过程中…