使用sudo apt install ros-foxy-rmw-cyclonedds-cpp 直接安装的无法支持共享内存,所以采用源码编译,也利于版本管理
1. cyclonedds版本
ros2 选用foxy版本
rmw_cyclonedds 选用foxy分支 0.7.11版本
https://github.com/ros2/rmw_cyclonedds.git
cyclonedds 选用foxy分支 0.10.5版本
https://github.com/eclipse-cyclonedds/cyclonedds.git
iceoryx 选用v2.95.0版本
https://github.com/eclipse-iceoryx/iceoryx.git
2. cyclonedds编译
- 准备目录及包
mkdir -p /mnt/ros2/ros2_cyclonedds/src
cd /mnt/ros2/ros2_cyclonedds/src
# 将三个需求的包放到/mnt/ros2/ros2_cyclonedds/src目录下并解压
# cyclonedds-0.10.5.tar.gz iceoryx-2.95.0.tar.gz rmw_cyclonedds-0.7.11.tar.gz
- 安装依赖包
# 安装依赖包
cd /mnt/ros2/ros2_cyclonedds
rosdep install --from src -i
- 编译cyclonedds
# 安装到/opt/ros/cyclonedds
mkdir /opt/ros/cyclonedds
cd /mnt/ros2/ros2_cyclonedds
colcon build --symlink-install --install-base /opt/ros/cyclonedds/
以上为编译成功。
注意:这里在编译时会进行git拉取,而板卡上一般很难访问github,所以这里的解决方法是在板卡中开启了vpn访问(这里需要各显神通…)
3. 配置内存池
- 编辑内存池配置
mkdir /opt/ros/cyclonedds/config
vi /opt/ros/cyclonedds/config/iox_config.toml
将以下内存池配置粘贴
[general]
version = 1
[[segment]]
[[segment.mempool]]
size = 512
count = 1024
[[segment.mempool]]
size = 1024
count = 1024
[[segment.mempool]]
size = 4096
count = 1024
[[segment.mempool]]
size = 1048576
count = 32
- 使能内存池
启用刚刚编辑的内存池配置使能内存池
/opt/ros/cyclonedds/install/iceoryx_posh/bin/iox-roudi -c /opt/ros/cyclonedds/config/iox_config.toml &
内存池成功使能,打印如下
4. 使用共享内存进行通信
- 编辑cyclonedds配置文件,使用内存池
# 创建配置文件cyclonedds.xml,配置使用内存池
vi /opt/ros/cyclonedds/config/cyclonedds.xml
内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/iceoryx/etc/cyclonedds.xsd">
<Domain id="any">
<SharedMemory>
<Enable>true</Enable>
<LogLevel>info</LogLevel>
</SharedMemory>
</Domain>
</CycloneDDS>
- 使用官方demo进行测试
export CYCLONEDDS_URI=file:///opt/ros/cyclonedds/config/cyclonedds.xml
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
source /opt/ros/foxy/setup.bash
source /opt/ros/cyclonedds/setup.bash
ros2 run demo_nodes_cpp talker &
ros2 run demo_nodes_cpp listener &
运行效果如下,能成功通信