OpenHD改造实现廉价高清数字图传(树莓派+PC )—(四)OSD数据传输和画面显示

前面三篇文章分别讲了整体情况,wifibroadcast,以及OpenVG的移植等

OpenHD改造实现廉价高清数字图传(树莓派zero + ubuntu PC )——(一)概述_hoopertsau的博客-CSDN博客_openhd

OpenHD改造实现廉价高清数字图传(树莓派zero + ubuntu PC )——(二)Wifibroadcast Wifi广播通信_hoopertsau的博客-CSDN博客_openhd OpenHD改造实现廉价高清数字图传(树莓派zero + ubuntu PC )—(三)OpenVG和libshapes在PC上的移植_hoopertsau的博客-CSDN博客

这一篇文章重点说说OSD软件的移植,也是就是显示看到的那个浮在视频上面的画面。

一、OSD软件

        该软件可以独立拿出来运行,也是OpenHD里面最主要的一个软件之一。

        该程序位于wifibroadcast-osd目录下,是osd显示的主程序。刚才上面一篇文章介绍了两个底层库是它的主要显示支撑,libshapes和OpenVG实现在屏上绘制OSD动态叠的画面,表示飞机的各类状态。

        这个osd程序用了大量的FIFO和共享内存,通过这些来与其他程序配合使用。另外,还会输出一些记录文件。

        要想这个程序相对独立的运行,这些FIFO和共享内存,也是需要剥离可移植的重点,

二、FIFO

        FIFO是linux中一种进程通信的方式。通过mkfifo 指令可以创建一个fifo,可以把它当文件一样进行操作,一个程序可以对它write(),另一程序对它进行read(),从而实现进程间通信。

        osd显示的数据源是PX4飞控上发出来的mavlink消息,经过wifi广播发送到地面端的rx程序,然后rx将数据写入一个fifo中,最后osd程序不断读取这个fifo获得数据,并驱动画面变化。

        主要数据流如下所示。

PX4----serial_port--->Pi(Air)

~~~~~~~~wifibroadcast~~~~~~~~~~

rx----->/var/run/openhd/telemetryfifo1 -----> osd

        除此之外,不还有很多fifo,但都是通过wifbroadcast从rx上收数据,只是用作不同的用途,看一下定义。      

# telemetryfifo1: local display, osd
# telemetryfifo2: secondary display, hotspot/usb-tethering
# telemetryfifo3: recording
# telemetryfifo4: wbc relay
# telemetryfifo5: mavproxy downlink
# telemetryfifo6: serial downlink

        主要用到的就是第一个,因此在使用osd程序前,需要手动初始化一下这个fifo,重启电脑之后这个fifo就会消失,因此每次用osd之前都要创建这个fifo,否则无法使用,也会报错。位置在/var/run/openhd/telemetryfifo1。

sudo mkdir /var/run/openhd/
sudo mkfifo /var/run/openhd/telemetryfifo1
sudo chmod 777 /var/run/openhd/telemetryfifo1

# 从wifibroadcast接收udp数据包,直接传递给这个fifo,用于osd程序读取数据
netcat -ukl 14550 > /var/run/openhd/telemetryfifo1 &

三、共享内存

        Linux进程之间还可以通过共享内存来交换数据。

        共享内存使用shm_open()函数,可以类似文件一样打开,得到文件描述符fd后,可以通过mmap()函数将它映射到一个内存地址上,这样就可以直接操作这个地址,实现对共享内存的读写。

        在linux系统中,共享内存被抽象成一个设备文件,在文件夹/dev/shm/下,可以ls查看。

        OpenHD里面用到的共享内存比较多,也比较乱,还没有完全梳理清楚,但是基本上都是用来传递状态使用的,涉及到发送方和接收方,天空端和地面端都有收发。

        在接收方,有下列共享内存,用来存放接收相关的状态信息。

wifibroadcast_rx_status_0
wifibroadcast_rx_status_1
wifibroadcast_rx_status_rc
wifibroadcast_rx_status_sysair 
wifibroadcast_rx_status_uplink

        在发送方,有下列共享内存,用来存放待发送各类状态数据。

wifibroadcast_tx_status_0:主要的状态都在这个共享内存里。

wifibroadcast_rx_status_3:看了一下代码,比较混乱。在sharedmem_init_tx中初始化了一下;在rssitx中打开了这个共享内存,然后读取这里的数据。uplink_function脚本里面有使用tx_telemetry程序用3号端口对外发送数据。

四、测试运行

  1. 使用wifibroadcast作为数据传输的通道,注意:可以与视频传输指定不同的port,这样可以实现视频和OSD数据同时传输
  2. 发送端的树莓派使用串口接收pixhawk的TELM2的数据,格式是MAVLINK;接收到后,通过管道输入给wfb进行广播;
  3. 接收端wfb收到后,重定向输出到fifo中,供OSD程序读取;
  4. Osd程序读取fifo,并显示OSD画面。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值