Open5
Cyclone DDS (CycloneDDS)
sudo apt update && sudo apt install -y ros-humble-rmw-cyclonedds-cpp
Validate the sysctl settings
現状の設定を確認する(下記はデフォルトのパラメータになっていることを示している)
sysctl net.core.rmem_max net.ipv4.ipfrag_time net.ipv4.ipfrag_high_thresh
net.core.rmem_max = 212992
net.ipv4.ipfrag_time = 30
net.ipv4.ipfrag_high_thresh = 4194304
Tune system-wide network settings
1. 一時的にコマンドでネットワーク設定を反映する方法
# Increase the maximum receive buffer size for network packets
sudo sysctl -w net.core.rmem_max=2147483647 # 2 GiB, default is 208 KiB
# IP fragmentation settings
sudo sysctl -w net.ipv4.ipfrag_time=3 # in seconds, default is 30 s
sudo sysctl -w net.ipv4.ipfrag_high_thresh=134217728 # 128 MiB, default is 256 KiB
2. 設定内容を永続化するために設定ファイルを生成する方法
sudo nano /etc/sysctl.d/10-cyclone-max.conf
下記をコピー&ペーストして保存
# Increase the maximum receive buffer size for network packets
net.core.rmem_max=2147483647 # 2 GiB, default is 208 KiB
# IP fragmentation settings
net.ipv4.ipfrag_time=3 # in seconds, default is 30 s
net.ipv4.ipfrag_high_thresh=134217728 # 128 MiB, default is 256 KiB
とりあえずリブートして設定が反映されるか簡単に確認する
sudo reboot
再び設定確認コマンドを実行(設定が反映された)
sysctl net.core.rmem_max net.ipv4.ipfrag_time net.ipv4.ipfrag_high_thresh
net.core.rmem_max = 2147483647
net.ipv4.ipfrag_time = 3
net.ipv4.ipfrag_high_thresh = 134217728
CycloneDDS Configuration
CycloneDDS の設定ファイルを作成する HOMEパスに作成する一例:~/cyclonedds.xml
- 共有メモリによるゼロコピー設定のチュートリアル
https://github.com/ros2/rmw_cyclonedds/blob/rolling/shared_memory_support.md#configuration
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/master/etc/cyclonedds.xsd">
<Domain Id="any">
<General>
<!-- 使用するネットワークインタフェースを自動判断に設定(手軽) -->
<Interfaces>
<NetworkInterface autodetermine="true" priority="default" multicast="default" />
</Interfaces>
<!-- 使用するネットワークインタフェースを任意のインタフェースに固定する場合の設定 -->
<!-- <Interfaces>
<NetworkInterface autodetermine="false" name="enp38s0" priority="default" multicast="default" />
</Interfaces> -->
<!-- 使用するネットワークインタフェースを lo に固定する場合の設定 -->
<!-- <Interfaces>
<NetworkInterface autodetermine="false" name="lo" priority="default" multicast="default" />
</Interfaces> -->
<AllowMulticast>default</AllowMulticast>
<MaxMessageSize>65500B</MaxMessageSize>
</General>
<Internal>
<SocketReceiveBufferSize min="10MB"/>
<Watermarks>
<WhcHigh>500kB</WhcHigh>
</Watermarks>
</Internal>
</Domain>
</CycloneDDS>
設定ファイルなどが自動的に読み込まれるように設定する
echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc
echo "export CYCLONEDDS_URI=file://${HOME}/cyclonedds.xml" >> ~/.bashrc
source ~/.bashrc
- cyclonedds が有効になっていることを確認
ros2 doctor --report
RMW MIDDLEWARE
middleware name : rmw_cyclonedds_cpp
ROS 2 INFORMATION
distribution name : humble
distribution type : ros2
distribution status : active
release platforms : {'rhel': ['8'], 'ubuntu': ['jammy']}
Time synchronization
複数端末間での時刻同期。chrony
を使うとできるよ、とアドバイスが書かれているが現状はWIPの模様。
が、とりあえず試してみる。
sudo apt update && sudo apt install -y chrony