- 一、 demo存放目录创建(examples/camera)与IDL文件上传
- 二、Image.idl文件与idlc文件产生源文件和头文件
- 三、修改CMakeLists.txt文件
- 四、添加CMakeLists.txt文件
- 五、Camera目录下XXX数据demo编写(编写pub/sub)
- 六、Camera目录下创建build目录准备编译
- 七、实现跨域进行DDS通信前的准备工作
- 八、编写进行SOC端跨域通信的xml配置文件(完成准备工作)
- 九、Chmod命令给可执行文件和所需要的库文件添加执行权限
- 十、解决拷贝进来ARM下C/C++库文件软链接失效问题
- 十一、export CYCLONEDDS_URI加载配置文件开始执行
本篇文章介绍XXXXXXIDL demo编写、编译以及实现跨域的DDS通信(SOC m -> SOC n),代码是基于ARM编译的C++版本的cyclonedds。
一、 demo存放目录创建(examples/camera)与IDL文件上传
首先在cyclonedds/examples
目录下面新建一个目录camera
作为存放XXXdemo
程序以及CMakeLists.txt
等文件的目录。并且将现成的Image.idl
文件从Windows上传到Linux,如下图所示,使用scp指令:
Image.idl
文件现有
二、Image.idl文件与idlc文件产生源文件和头文件
先在camera
目录下面利用idlc
文件和Image.idl
文件生成源文件和头文件,在生成过程中可能需要C++和C在ARM下的库文件,直接CP过来即可。
拷贝ARM_CPP如下图所示,拷贝ARM_C同理。
使用命令:./idlc -l cxx ./Image.idl
生成Image.cpp
和Image.hpp
文件如下图所示:
三、修改CMakeLists.txt文件
外层examples下面的CMakeLists.txt
中添加了对于camera
新文件中的install
和add_subdirectory
,如下图所示:
配置解析:
其中,在 CMake 构建系统中,install(FILES ... DESTINATION ... COMPONENT ...)
是用来安装文件的命令。它用于指定要安装的文件列表、目标安装路径以及所属的组件。
各个参数的含义如下:
1、 FILES:
指定要安装的文件列表。可以是一个文件名,也可以是多个文件名的列表。这些文件可以是源代码文件、配置文件、文档等。
2、DESTINATION:
指定文件的目标安装路径。可以是绝对路径,也可以是相对路径。如果指定为相对路径,则会相对于安装目录进行解析。
3、 COMPONENT:
指定文件所属的组件。组件是一个逻辑上的概念,用于将不同类型的文件分组。通过指定不同的组件,可以灵活地控制安装过程中包含哪些文件。
举例说明:
假设有以下 CMakeLists.txt
文件:
install(FILES file1.txt file2.txt DESTINATION /path/to/install COMPONENT my_component)
这个命令将会安装 file1.txt
和 file2.txt
文件到 /path/to/install
目录下,并将它们归属于 my_componen
t 组件。
在执行 make install
或者构建项目时,CMake 将会将这些指定的文件拷贝到指定的安装路径,并按照组件进行分类。这样,在安装时可以选择只安装某个特定的组件,而不是全部安装。
add_subdirectory
是添加存放源文件的子目录
四、添加CMakeLists.txt文件
Examples/camera目录下
重点关注对于ARM架构下idlc_generate
配置指令失效的问题
五、Camera目录下XXX数据demo编写(编写pub/sub)
这一步中主要完成demo中publisher.cpp
和subscriber.cpp
代码的编写
5.1 publisher文件编写
本篇主要是基于现有的publisher.cpp
和subscriber.cpp
文件来做修改
对于publisher
文件修改有以下几处:
1、 头文件的引入Image.hpp
2、域名和类名的替换:DiData::ImageMsg
3、对于摄像头数据类型的赋值,根据Image.hpp
头文件中的数据类型进行赋值,如下图所示:
5.2 subscriber文件编写
对于subscriber
文件修改有以下几处:
1、头文件的引入Image.hpp
2、域名和类名的替换:DiData::ImageMsg
3、对于摄像头数据类型的赋值已经在publisher.cpp
中做过,需要在subscriber.cpp
文件中将这些数据打印出来
至此,准备工作完成,camera目录下应该有以下文件:
六、Camera目录下创建build目录准备编译
6.1 指定安装路径等并执行cmake指令
终端输入:
cmake -DCMAKE_PREFIX_PATH=/home/ubuntu/Documents/ARM_CPP_CycloneDDS/cyclonedds-cxx-master/install_DDS_ARM/lib/cmake/CycloneDDS-CXX -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/arm.cmake -DENABLE_SSL=NO ..
如果显示如下的报错:
添加`ARM_C`的路径即可:
cmake -DCMAKE_PREFIX_PATH=/home/ubuntu/Documents/ARM_C_CycloneDDS/cyclonedds-master/install_DDS_ARM/lib/cmake/CycloneDDS -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/arm.cmake -DENABLE_SSL=NO ..
6.2 cmake --build .进行编译
由下图所示,成功变异出可执行文件并且文件类型正确
至此,demo整理完毕,下面开始实现跨域的DDS通信
七、实现跨域进行DDS通信前的准备工作
修改电脑IP地址为192.168.XXX.X,连接到板子上面。(注意:连接板子之后才能改IP)
打开MobaXterm
软件连接到板子
连接之后创建两个SOC
域窗口,地址分别为:
192.168.195.m 192.168.195.n
分别给两个SOC中上传代码(已经编译好的代码,直接拖拽即可)
以上均为琐碎的准备工作
八、编写进行SOC端跨域通信的xml配置文件(完成准备工作)
配置文件的格式可以参考ARM_C
中的readme.md
文件(直接查找,注意X哥的操作手法!!)
ARM_CPP
中的config_simple
中有较为简单的模版可用,但是注意将
<Domain id = “3”>换成<Domain id = “any”>
如下图配置文件中:192.168.195.m 和 192.168.195.n域中的xml配置文件中address分别为:
address = “192.168.195.m ”,address = “192.168.195.n ”
配置文件格式:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright(c) 2006 to 2022 ZettaScale Technology and others
This program and the accompanying materials are made available under the
terms of the Eclipse Public License v. 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
v. 1.0 which is available at
http://www.eclipse.org/org/documents/edl-v10.php.
SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause-->
<CycloneDDS>
<!-- Simple config-file for testing whether a config-file can be picked up correctly. -->
<Domain id="any">
<General>
<Interfaces>
<NetworkInterface address="127.0.0.1(换)"></NetworkInterface>
</Interfaces>
<AllowMulticast>true</AllowMulticast>
<EnableMulticastLoopback>true</EnableMulticastLoopback>
</General>
</Domain>
<Compatibility>
<StandardsConformance>lax</StandardsConformance>
</Compatibility>
</CycloneDDS>
九、Chmod命令给可执行文件和所需要的库文件添加执行权限
下图所示两个可执行文件是白色的噻,不具备在域控执行的权限
通过命令chmod +x ddscxxImage*
给其添加可执行权限如下图所示:
我们想要执行他们,我们需要知道他们依赖于那些库文件,使用ldd
命令进行查看,如下图所示:
如下图所示我们将ARM架构下C/C++编译之后的库文件加载进来
这些文件同样需要使用chmod命令添加可执行权限 chmod +x libdds*
,如下图所示:
十、解决拷贝进来ARM下C/C++库文件软链接失效问题
下次如何避免软链接失效,在上传代码时不要直接拉上来,打包成tar包形式再弄上来就不会让软链接失效
我们在Linux上可以看到C/C++中的库文件软链接都是完好的,但是拷贝进来之后就会失效,软连接完好时如下图所示:
但是现在没有软链接存在,因此通过命令ln -s 源文件 目标文件
的命令形式给这些库文件之间重新建立起软链接。 如下图所示:
特别注意: ln -s libddscxx.so.0 libddscxx.so
构建结果是:
libddscxx.so—> libddscxx.so.0
的指向
所以需要先将libddscxx.so删掉
构建出libddscxx.so—> libddscxx.so.0
之后:
删掉 libddscxx.so.0
如下图所示:
输入 ln -s libddscxx.so.0.11.0 libddscxx.so.0
构建:
libddscxx.so.0—>libddscxx.so.0.11.0
切记顺序一定要正确
结果如下图所示:
至此C++版本的库文件中的软链接已经重新构建完成,C中的同样的办法构建如下图所示:
十一、export CYCLONEDDS_URI加载配置文件开始执行
其实加载配置文件这一步可以直接在这里用指令加载进行,也可以直接将指令加到xmll配置文件中去,可以参考另一篇文章:Soc侧跨域进行Cycloneddds通信时xml配置文件的格式以及注意事项
SOC1域控中:(配置文件起名为:config1.xml)
使用指令:export CYCLONEDDS_URI=config1.xml配置文件的路径
并且执行可执行文件(SOC1执行pub),如下图所示:
SOC2域控中:(配置文件起名为:config2.xml)
完成同样的准备工作并且开始执行sub,结果如下图所示:
到此全部完成
需要加深总结的地方:
1、可执行文件如何添加权限
2、软链接失效以后如何进行重新构建
3、Xml库文件如何正确书写并且加载进来