OpenIPC开源IPC之重要源码包
OpenIPC开源IPC之重要源码包
- 1. 源由
- 2. 分析
- 2.1 功能角度
- 2.2 数据角度
- 3. 软件包
- 3.1 wfb-ng
- 3.1.1 目标板配置
- 3.1.2 软件版配置
- 3.1.3 视频数据发送 & 接收
- 3.2 datalink
- 3.2.1 目标板配置
- 3.2.2 软件版配置
- 3.2.3 数据发送 & 接收
- 3.3 *mavfwd
- 3.3.1 目标板配置
- 3.3.2 软件版配置
- 3.3.3 MAVLink数据采集&接收
- 3.4 *mavlink-router
- 3.4.1 目标板配置
- 3.4.2 软件版配置
- 3.4.3 MAVLink数据采集&接收
- 3.5 majestic
- 3.5.1 目标板配置
- 3.5.2 软件版配置
- 3.5.3 摄像视频采集
- 3.6 *vdec-openipc
- 3.6.1 目标板配置
- 3.6.2 软件版配置
- 3.6.3 视频播放&OSD渲染
- 4. 启动
- 4.1 数据链路启动
- RF链路
- LTE链路
- 4.2 视频链路启动
- 5. 参考资料
1. 源由
OpenIPC FPV设备,在软件层面,其体现功能的重要软件包的梳理,有助于更好的理解工作原理。
从软件部署的思路去考虑,我们将设备的软件大块的进行简单切割:
- 设备引导代码:uboot
- 操作系统代码:Linux
- 基础文件系统:FileSystem(含基础功能代码)
- 功能执行代码:Application
前面《OpenIPC开源IPC之工程框架》已经整体上介绍上面四大块内容整合工具Buildroot
。
本章将重点放在Application
上,期望通过梳理,将天空端和地面端的具体功能实现与源代码一一对应,以便更好的去维护和开发后续功能。
2. 分析
首先,从功能颗粒度的角度进行基本分析。
2.1 功能角度
- 天空端
- 摄像视频采集
- 视频数据发送
- MAVLink数据采集
- MAVLink数据发送
- 地面端
- 视频数据接收
- 摄像视频播放
- MAVLink数据接收
- OSD图层渲染
2.2 数据角度
- 视频流
摄像视频采集 --> 视频数据发送 --> 视频数据接收 --> 摄像视频播放
- MAVLink数据流
MAVLink数据采集 --> MAVLink数据发送 --> MAVLink数据接收 --> OSD图层渲染
3. 软件包
通过功能角度和数据角度分析,寻找对应软件包的方式关联的脚本或者代码证据,将整个流程串联起来。
3.1 wfb-ng
3.1.1 目标板配置
- devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig#L103
BR2_PACKAGE_WIFIBROADCAST=y
3.1.2 软件版配置
- general/package/wifibroadcast/wifibroadcast.mk#L7
WIFIBROADCAST_VERSION = 24.08
3.1.3 视频数据发送 & 接收
- general/package/wifibroadcast/files/wifibroadcast#L109-L117
start_drone_wfb() {
wfb_tx -p "$stream" -u "$udp_port" -R "$rcv_buf" -K "$keydir/$unit.key" -B "$bandwidth" \
-M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
-T "$pool_timeout" -i "$link_id" -f "$frame_type" -C 8000 "$wlan" > /dev/null &
}
start_gs_wfb() {
wfb_rx -c "$udp_addr" -u "$udp_port" -p "$stream" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
}
3.2 datalink
3.2.1 目标板配置
- devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig#L102
BR2_PACKAGE_DATALINK=y
3.2.2 软件版配置
- general/package/datalink/files/telemetry#L13-L16
if [ ! -f /usr/bin/telemetry_rx ] && [ ! -f /usr/bin/telemetry_tx ]; then
ln -s /usr/bin/wfb_rx /usr/bin/telemetry_rx
ln -s /usr/bin/wfb_tx /usr/bin/telemetry_tx
fi
- general/package/datalink/files/telemetry_drone.conf#L15-L20
stream_rx=144
stream_tx=16
link_id=7669206
frame_type=data
port_rx=14551
port_tx=14550
- general/package/datalink/files/telemetry_gs.conf#L15-L20
stream_rx=16
stream_tx=144
link_id=7669206
frame_type=data
port_rx=14651
port_tx=14650
3.2.3 数据发送 & 接收
- general/package/datalink/files/telemetry
start_drone_telemetry() {
if [ "$one_way" = "false" ]; then
telemetry_rx -p "$stream_rx" -u "$port_rx" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
fi
telemetry_tx -p "$stream_tx" -u "$port_tx" -K "$keydir/$unit.key" -B "$bandwidth" \
-M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
-T "$pool_timeout" -i "$link_id" -f "$frame_type" "$wlan" > /dev/null &
}
start_gs_telemetry() {
if [ "$one_way" = "false" ]; then
telemetry_tx -p "$stream_tx" -u "$port_tx" -K "$keydir/$unit.key" -B "$bandwidth" \
-M "$mcs_index" -S "$stbc" -L "$ldpc" -G "$guard_interval" -k "$fec_k" -n "$fec_n" \
-T "$pool_timeout" -i "$link_id" -f "$frame_type" "$wlan" > /dev/null &
fi
telemetry_rx -p "$stream_rx" -u "$port_rx" -K "$keydir/$unit.key" -i "$link_id" "$wlan" > /dev/null &
}
3.3 *mavfwd
注:天空端设备软件包。
3.3.1 目标板配置
- devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig#L105
BR2_PACKAGE_MAVFWD=y
3.3.2 软件版配置
- general/package/mavfwd/mavfwd.mk#L7-L9
MAVFWD_SITE_METHOD = git
MAVFWD_SITE = https://github.com/openipc/mavfwd
MAVFWD_VERSION = 70da7adbdbe36d371ca849c4a3bc3cadb54498d3
3.3.3 MAVLink数据采集&接收
- general/package/datalink/files/telemetry#L42-L43
mavfwd --channels "$channels" --master "$serial" --baudrate "$baud" -p 100 -t -a "$aggregate" \
--out 127.0.0.1:$port_tx --in 127.0.0.1:$port_rx > /dev/null &
3.4 *mavlink-router
注:地面端设备软件包。
3.4.1 目标板配置
- br-ext-chip-hisilicon/configs/hi3536dv100_fpv_defconfig#L109
BR2_PACKAGE_MAVLINK_ROUTER=y
3.4.2 软件版配置
- general/package/mavlink-router/mavlink-router.mk#L7-L9
MAVLINK_ROUTER_SITE_METHOD = git
MAVLINK_ROUTER_SITE = https://github.com/mavlink-router/mavlink-router
MAVLINK_ROUTER_VERSION = 18c06da77563db9ba1b7c4173ff5cae1646b383e
- general/package/mavlink-router/files/mavlink_drone.conf#L8-L16
[UdpEndpoint telemetry_tx]
Mode = Normal
Address = 127.0.0.1
Port = 14550
[UdpEndpoint telemetry_rx]
Mode = Server
Address = 0.0.0.0
Port = 14551
- general/package/mavlink-router/files/mavlink_gs.conf#L5-L25
[UdpEndpoint external_use]
Mode = Server
Address = 0.0.0.0
Port = 14550
[UdpEndpoint vdec]
Mode = Normal
Address = 127.0.0.1
Port = 14750
[UdpEndpoint telemetry_tx]
Group = wfb
Mode = Normal
Address = 127.0.0.1
Port = 14650
[UdpEndpoint telemetry_rx]
Group = wfb
Mode = Server
Address = 127.0.0.1
Port = 14651
3.4.3 MAVLink数据采集&接收
- general/package/mavlink-router/files/S97mavlink#L7
mavlink-routerd &
- general/package/datalink/files/telemetry#L40
mavlink-routerd -c /etc/mavlink.conf > /dev/null 2>&1 &
3.5 majestic
3.5.1 目标板配置
- devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig#L71
BR2_PACKAGE_MAJESTIC=y
3.5.2 软件版配置
请注意,这个代码并非全部开源。
- general/package/majestic/majestic.mk#L7-L10
MAJESTIC_SITE = https://openipc.s3-eu-west-1.amazonaws.com
MAJESTIC_SOURCE = majestic.$(MAJESTIC_FAMILY).$(MAJESTIC_VARIANT).master.tar.bz2
MAJESTIC_LICENSE = PROPRIETARY
MAJESTIC_LICENSE_FILES = LICENSE
- devices/ssc338q_fpv_openipc-urllc-aio/br-ext-chip-sigmastar/configs/ssc338q_fpv_openipc-urllc-aio_defconfig#L33-L34
BR2_OPENIPC_SOC_FAMILY="infinity6e"
BR2_OPENIPC_VARIANT="fpv"
3.5.3 摄像视频采集
通过链接下载应用程序:二进制+配置文件
3.6 *vdec-openipc
注:地面端设备软件包。
3.6.1 目标板配置
- br-ext-chip-hisilicon/configs/hi3536dv100_fpv_defconfig#L105
BR2_PACKAGE_VDEC_OPENIPC=y
3.6.2 软件版配置
- general/package/vdec-openipc/vdec-openipc.mk#L7-L8
VDEC_OPENIPC_SITE = $(call github,openipc,silicon_research,$(VDEC_OPENIPC_VERSION))
VDEC_OPENIPC_VERSION = HEAD
- general/package/vdec-openipc/files/vdec.conf
### Port for video rx (default: 5000)
port=5600
### Mavlink port for telemetry (default: 14750)
mavlink_port=14750
3.6.3 视频播放&OSD渲染
- general/package/vdec-openipc/files/S98vdec#L22
vdec -p ${port} -d ${format} -c ${codec} -m ${mode} --mavlink-port ${mavlink_port} ${osd_variant} ${extra} > /dev/null 2>&1 &
4. 启动
4.1 数据链路启动
RF链路
- general/package/datalink/files/S98datalink#L40
wifibroadcast start
- general/package/wifibroadcast/files/wifibroadcast#L139
telemetry start
LTE链路
- general/package/datalink/files/S98datalink#L36
telemetry start
4.2 视频链路启动
注:对于这块尚不是很清楚,待详查。
- general/package/majestic/files/S95majestic#L7-L18
start() {
ulimit -c unlimited
echo "/tmp/core.majestic" > /proc/sys/kernel/core_pattern
echo -n "Starting $DAEMON: "
start-stop-daemon -b -m -S -q -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_ARGS
if [ $? -eq 0 ]; then
echo "OK"
else
echo "FAIL"
fi
}
5. 参考资料
【1】OpenIPC开源IPC之工程编译
【2】OpenIPC开源IPC之工程框架
【3】Ardupilot & OpenIPC & 基于WFB-NG构架分析和数据链路思考