• OpenHD改造实现廉价高清数字图传(树莓派zero + ubuntu 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上收数据,只是用作不同的用途,看一下定义。      

    1. # telemetryfifo1: local display, osd
    2. # telemetryfifo2: secondary display, hotspot/usb-tethering
    3. # telemetryfifo3: recording
    4. # telemetryfifo4: wbc relay
    5. # telemetryfifo5: mavproxy downlink
    6. # telemetryfifo6: serial downlink

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

    1. sudo mkdir /var/run/openhd/
    2. sudo mkfifo /var/run/openhd/telemetryfifo1
    3. sudo chmod 777 /var/run/openhd/telemetryfifo1
    4. # 从wifibroadcast接收udp数据包,直接传递给这个fifo,用于osd程序读取数据
    5. 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画面。
  • 相关阅读:
    百望云携手华为发布金融信创与数电乐企联合方案 创新金融合规变革
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    Redis之持久化和事务
    【全】【ES集群安装+配置教程】装ElasticSearch到CentOS 8中liunx
    2022下半年前端面试题总结
    Pandas统计列NaN值,这4步轻松搞定!
    李宏毅《机器学习》丨6. Convolutional Neural Network(卷积神经网络)
    《HTML+CSS+JavaScript》之第15章 边框样式
    【MYSQL】索引
    TOGAF(企业架构)
  • 原文地址:https://blog.csdn.net/hoopertsau/article/details/127114941