就上篇文章的交叉编译方式下为树莓派搭建DDS运行环境存在无法编写DDS发布订阅程序的问题,本篇文章介绍一种新的思路来基于树莓派编译OpenDDS并编写DDS发布订阅程序。

1:树莓派编译OpenDDS

Linux:Ubuntu 18.04
Perl:树莓派自带perl,无需安装。
Make:6.3.0
gcc:6.3.0

建议SD卡:32GB或64GB,完全编译的OpenDDS代码至少10G。

首先需要为树莓派搭建DDS的运行环境。

1.1 ACE+TAO 与OpenDDS的下载

ACE+TAO下载地址 http://download.dre.vanderbilt.edu/  ,我选取的是ACE+TAO.tar.gz  Full下的HTTP版本。
OpenDDS下载地址 http://download.ociweb.com/OpenDDS/,我选取的是OpenDDS-3.13.tar.gz版本。

在home/pi目录下新建OpenDDS目录,将两个压缩包解压在OpenDDS目录下。

1.2 设置相关的环境变量

$ cd ~
$ ls -al  #会看到有.bashrc文件
$ gedit .bashrc

在.bashrc末尾添加如下的环境变量:

export ACE_ROOT=/home/pi/OpenDDS/ACE_wrappers
export TAO_ROOT=$ACE_ROOT/TAO
export DDS_ROOT=/home/pi/OpenDDS/DDS
export PATH=$ACE_ROOT/bin:$DDS_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$ACE_ROOT/lib:$DDS_ROOT/lib:$LD_LIBRARY_PATH

1.3新建config.h与platform_macros.GNU

新建 $ACE_ROOT/ace/config.h, 内容如下:

#include "ace/config-linux.h"

新建$ACE_ROOT/include/makeinclude/platform_macros.GNU, 内容如下:

include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU

1.5 分别编译ACE,TAO,OpenDDS

有几点需要注意:

  • 可能会存在相关目录下没有GNUmakefile文件的情况,这时需要自己去生成GNUmakefile文件。
  • ACE.mwc,TAO_ACE.MWC,DDS.MWC/DDS_no_tests.mwc,使用命令 mwc.pl XXX.mwc -type gnuace则会生成相应的GNUmakefile文件。
  • 本人在编译OpenDDS时,放弃编译tests目录,选取了DDS_no-tests.mwc,个人则针对实际情况选择。
cd $ACE_ROOT
make clean 
make
cd $TAO_ROOT
make clean
make
cd $DDS_ROOT
make clean
make

问题:DDS_ROOT目录下编译过程中,由于部分core相关的cpp文件过大导致无法编译通过,编译直接卡住几次,经常是由于初试配置时swap为100M,太小。

1.6 运行测试脚本:

$ cd $DDS_ROOT/example/DCPS/Messenger_Imr
$ run_test.pl

显示 test PASSED ,测试成功,表示OpenDDS环境已经搭建成功。

2:编写DDS发布订阅程序。

相关文件代码直接拷贝$DDS_ROOT/DevGuideExamples/DCPS/Messenger目录下文件即可

2.1 定义IDL文件,编写MPC文件。

module Messenger {

#pragma DCPS_DATA_TYPE "Messenger::Message"
#pragma DCPS_DATA_KEY "Messenger::Message subject_id"

  struct Message {
    string from;
    string subject;
    long subject_id;
    string text;
    long   count;
  };
};
project(*idl): dcps {
  requires += no_opendds_safety_profile
  TypeSupport_Files {
    Messenger.idl
  }

  custom_only = 1
}

2.2 生成GNUmakefile文件并编译。

mwc.pl -type gnuace
make

3.3 生成相关的DDS接口相关的文件。

3.4改写MPC文件,加入DDS实体

加入publisher,subscriber,datareaderlistener实体,同时添加publisher,subscriber的源文件和DataReaderListenerIlmpl的头文件和源文件,再次编译。

3.5 进行DDS发布/订阅。

添加rtps.ini 文件。

[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS
[transport/the_rtps_transport]
transport_type=rtps_udp

输入指令./subscriber -DCPSConfigFile rtps.ini和./publisher -DCPSConfigFile rtps.ini

       

至此完成的DDS的发布/订阅。

基本步骤如上所示,同时有需要交流的朋友可以加我QQ420516520,一起交流,一起进步!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐