【原创】OpenDDS笔记(四) 树莓派下的开发实例

       笔者以前的博客已经记录了Window10,Ubuntu18.04下的环境搭建及Demo实例开发,而树莓派下的开发资料很少,大多只提到了如何跑通自带实例,即Messenger实例下运行run_test.pl。但笔者的目标是自己编写IDL并单独编写一个Publisher和Subscriber实例,经过前面的经验总结和摸索,在躺了很多坑之后终于实现了既定目标,记录下来供各位借鉴。

一、前言

       与PC下Ubuntu系统中编译OpenDDS不同,采用【原创】OpenDDS笔记(二) Linux环境下的环境搭建   及   【原创】OpenDDS笔记(三) Linux环境下的开发实例 的方式,在RaspberryPi自带系统下可以编译,但是速度奇慢无比,笔者开始用这种方式编译了2天,终是以失败告终,觉得这不是一个科学的办法便放弃了。后来根据OpenDDS官网所述,采用了“交叉编译”的方式,即利用PC下虚拟机中Ubuntu系统(以下称为host)通过arm-linux-gnueabihf-g++来编译,最后通过ssh将压缩包传入RaspberryPi自带系统(以下称为target)指定目录下,解压缩,设置环境变量,运行,这样一个思路进行。

 

二、编译OpenDDS

       1. 之前有在Ubuntu下编译过OpenDDS的机器,需要将环境变量干掉,因为编译树莓派版本的OpenDDS,其目录结构与前者有差异,环境变量不干掉有可能导致找到的依赖文件不对,从而编译失败。那么之前在~./bashrc中或者etc/profile中设置过的DDS_ROOT,ACE_ROOT需要统统干掉,重启生效。

       2. 用于交叉编译的两个linux系统,都应该安装有perl,make,g++,gcc,cmake等软件,并保持软件最新 sudo apt-get update,sudo apt-get upgrade,这个是经常导致编译异常的主要原因之一。

       3. 下载OpenDDS,地址:http://download.objectcomputing.com/OpenDDS/,值得一提的是,如果为了和其他平台的实例进行通讯,最好OpenDDS版本与其保持一致,我使用的是OpenDDS-3.15版本,因此需要单击“previous-releases”去找到OpenDDS-3.15.tar.gz。总之根据你需要,下载对应版本即可。

      

         为了便于版本兼容,我将解压缩后将名称改为OpenDDS

        

       4. 下载 gcc-8.2.0-rpi.tar.bz2 交叉编译编译器,解压后将其放置于host系统中/opt目录下,将文件夹重命名为“cross-pi-gcc”。

         

        5. 下载 ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz ,将其复制一个到OpenDDS目录下,如下图:

         

      6. 在OpenDDS目录下执行如下命令,用于生成make需要的相关文件。

       值得一提的是,如果没有第5步的操作。直接执行该命令,会自动下载ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz,但是速度会慢到吐血。经过多次尝试,笔者直接用迅雷下载了一个到Windows下,拷贝到虚拟机的OpenDDS目录下,这样在运行以下命令时,直接就等于下载好了,命令会自动对其进行解压缩,供相关文件生成时使用。

./configure --target=linux-cross --target-compiler=/opt/cross-pi-gcc/bin/arm-linux-gnueabihf-g++

  注意:执行过以上命令,或者曾经make过以后,在执行以上命令有可能失败,可以尝试把OpenDDS文件夹整个删掉,再重新进行第5,6步。

                

          执行完以后,目录中应该会多一个build文件夹和ACE_wrappers文件夹,同时ACE+TAO-2.2a_with_latest_patches_NO_makefiles.tar.gz 包被自动删除掉了。build目录下有一个host文件和一个target文件夹,分别是对OpenDDS文件夹的一个拷贝,这包括自带实例DevGuideExamples文件夹

          

          

       7. cd到OpenDDS目录下,执行命令更改权限命令,防止因权限问题而导致编译失败,这步属于可选项。

sudo chmod 777 -R ./

      8. 分别打开build目录下的host及target目录,分别执行./setenv.sh命令,这步属于可选项。

      9. 第6步所述命令执行完没有报错的话,就可以在OpenDDS目录下执行make命令对代码进行编译,时间比较长,泡一杯茶边喝边等吧。

     10. 测试host与target之间的ssh服务是否已启动,Ubuntu和RaspberryPi系统一般默认都有安装ssh-client,为了测试连通性可以通过以下顺序:
           10.1 通过ifconfig查看两个系统的ip地址,然后通过ping命令检查其网络通讯是否正常。(笔者host地址为192.168.2.110,target地址为192.168.2.112)
           10.2 从host的终端执行ssh pi@192.168.2.112,红色部分更换为实际的ip,如果ssh服务没问题的话,会要求你输入树莓派系统密码,输入后即可进入树莓派远程终端模式。

          
           10.3 如果经过以上测试,ssh并不通。应该是系统ssh服务被禁用了,行之有效的解决办法就是拔下树莓派SD卡,通过读卡器插入PC,由于SD卡里是linux文件系统,windows下打不开。那就通过虚拟机来打开。并且在boot文件夹下通过touch ssh命令新建一个空白的ssh文件。拔出SD卡再插入到树莓派上,重复10.2步骤,应该就解决了,如果还解决不了,请百度搜索“树莓派 ssh connection refused”寻求更多帮助。

            也可以在windows下下载一个putty软件,选择SSH,输入IP后单击Open来测试ssh服务是否已开启。

          

           10.4 确认ssh服务没问题后,关闭终端,以暂时退出ssh服务。
          

    11. cd到OpenDDS上一级目录,分别执行以下命令:

tar czf OpenDDS.tar.gz OpenDDS

#该命令的目的是将OpenDDS文件夹打包为一个OpenDDS.tar.gz压缩包。
scp OpenDDS.tar.gz pi@192.168.2.112:/home/pi/DevOpenDDS

#该命令的目的是将OpenDDS.tar.gz压缩包发送到树莓派指定目录下,:后面即为目标路径
ssh pi@192.168.2.112

#该命令用于通过ssh连接树莓派
tar xzf OpenDDS.tar.gz

#该命令用于远程解压缩OpenDDS.tar.gz

12. 在ssh远程模式下,进入树莓派OpenDDS所在目录,分别执行以下命令,用于设置环境变量。

export DDS_ROOT="$PWD/build/target"
export ACE_ROOT="$DDS_ROOT/ACE_wrappers"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:"$ACE_ROOT/lib":"$DDS_ROOT/lib"
export PATH=${PATH}:"$ACE_ROOT/bin":"$DDS_ROOT/bin"

13. 通过以下命令cd到DDS默认实例“Messenger”目录下,然后执行./run_test.pl。

cd $DDS_ROOT/DevGuideExamples/DCPS/Messenger

  实例会分别启动一个InfoRepo, publisher, 和subscriber。类似下图所示,说明部署成功。

 

 

三、编写编译自定义工程

      前面笔者讲了,网上大部分只是进行到以上步骤就结束了,没看到如何开发新的工程,生成相关文件和如何make。在经过一些试验后,笔者发现了规律,并成功实现了编译和部署。本节中,我以Demo为工程名来实现一个自定义实例,文件仍来自于前几篇所定义过的同一套文件,Demo文件夹内容如下:

    

    关于这些文件的内容,请翻看笔者前面几篇相关介绍的博文,本篇的目的是对他们实现编译,并部署到树莓派下执行。

    观察OpenDDS自带的几个实例,笔者打算采用“将Demo文件夹与原始OpenDDS实例放在一起,重新执行OpenDDS编译”的思路来解决问题。OpenDDS自带实例$DDS_ROOT/DevGuideExamples/DCPS/Messenger的文件结构,有一个CMakeLists.txt文件,其内容如下,

project(OpenDDS_DevGuide_Messenger CXX)
cmake_minimum_required(VERSION 3.8.2)

find_package(OpenDDS REQUIRED)

set(CMAKE_CXX_COMPILER ${OPENDDS_COMPILER})

set(opendds_libs
  OpenDDS::Dcps # Core OpenDDS Library
  OpenDDS::InfoRepoDiscovery OpenDDS::Tcp # For run_test.pl
  OpenDDS::Rtps OpenDDS::Rtps_Udp # For run_test.pl --rtps
)

# Publisher
add_executable(publisher
  Publisher.cpp
)
OPENDDS_TARGET_SOURCES(publisher Messenger.idl)
target_link_libraries(publisher ${opendds_libs})

# Subscriber
add_executable(subscriber
  Subscriber.cpp
  DataReaderListenerImpl.cpp
)
OPENDDS_TARGET_SOURCES(subscriber Messenger.idl)
target_link_libraries(subscriber ${opendds_libs})

 1. 将Messenger文件夹下的CMakeLists.txt文件拷贝到自定义工程Demo文件夹下,并将以上Messenger.idl修改为Demo.idl,用来适配Demo工程。

    

2. 删除掉之前编译好的OpenDDS文件夹,并重新解压缩一个未编译过的,按照    “二、编译OpenDDS      中第5步和第6步”的过程重新生成文件。果然build/host及build/target下的DevGuideExamples文件夹下都自动生成了一个Demo文件夹,并产生了GNUmakefile及其他相关类型文件。

3. 照这个思路,按照“二、编译OpenDDS”其他步骤进行部署,最终实现了既定目标。以下展示了,树莓派启动一个Publisher实例,Windows10启动了一个Subscriber实例,由于我将配置文件路径下载了cpp中,因此这里不用写成./Publisher -DCPSConfigFile config_Pub.ini这样的形式,而是直接运行。

 

四、引申

                1.  上一节通过run_test.pl执行实例属于集中式发现,也可以通过对等发现的方式:

                    cd 到Messenger目录下,执行./publisher -DCPSConfigFile rtps.ini   及   ./subscriber -DCPSConfigFile rtps.ini

                2. 在上一节第9步以后,可以将OpenDDS压缩后,通过U盘拷贝到树莓派中再进行如下操作:

                     2.1 设置环境变量

                            在etc/profile最后一行添加如下环境变量,将$PWD替换为实际路径,我的实际路径为/home/pi/DevOpenDDS/OpenDDS/build/target重启生效。

                           export DDS_ROOT="$PWD/build/target"                                                                                          
                           export ACE_ROOT="$DDS_ROOT/ACE_wrappers"
                           export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:"$ACE_ROOT/lib":"$DDS_ROOT/lib"
                           export PATH=${PATH}:"$ACE_ROOT/bin":"$DDS_ROOT/bin"

                     2.2 设置依赖库路径

                           在设置完环境变量以后,笔者尝试在Demo文件夹下直接运行./Publisher,出现以下错误,说明找不到可执行程序所以来的so文件。

                          

                           2.2.1 在/etc/ld.so.conf(注意ld.so.conf第一个字母是小写的L)的最后一行,根据自己项目实际路径,添加如下3行lib路径并保存。可以看到前面两个是OpenDDS内核相关的lib,而最后一个是咱们Demo项目文件夹,因此后面再写别的工程,也需要再单独加进去一个。

                         

                         2.2.2 切换到root用户,执行/sbin/ldconfig -v(注意ldconfig第一个字母是小写的L)其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

                3. 再回到Demo目录下执行./Publisher和./Subscriber,成功启动。

                   

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jamie.T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值