ROS 2 と互換な通信ライブラリ
- DDS と最低限の互換性がある
- std_msgs が使える
- Unity で使える
- Unity でクロスプラットフォームビルドできる (Windows, Mac, Android, ...)
Nix flake で ROS 2 Humble + Fast DDS の RMW (rmw_fastrtps_cpp) + .NET 8 SDK が揃います。
# Nix flake の devShell に入る (direnv 利用時は自動 reload)
nix developdevShell では RMW_IMPLEMENTATION=rmw_fastrtps_cpp を既定値にしています。
ros.cachix.org を利用するには trusted-users もしくは trusted-substituters に追加してください。未設定だと ROS パッケージを自前ビルドすることになります。
dotnet build
dotnet testUnity では API Compatibility Level を .NET Standard 2.1 に設定して利用します。
Unity 2022.3 の C# コンパイラは C# 11 の required members に対応していないため、
ライブラリ本体では required を使わず、Unity 同梱の .NET Standard 2.1 参照アセンブリで
コンパイルできる API に留めます。
Participant は DDSI-RTPS の lease timeout で remote から消えることを前提にします。
Publisher / Subscription の endpoint は Dispose 時に SEDP の built-in Topic へ
PID_STATUS_INFO 付き unregister DATA を送信し、remote の graph から早めに消えるようにします。
DomainParticipant.CreatePublisher は既定で Reliable publisher を作成します。
ROS 2 の sensor-data 相当の購読者へ送る場合は、ReliabilityQos.BestEffort を指定して
SEDP の endpoint reliability QoS を BestEffort として広告できます。
指定ドメインの SPDP マルチキャストに参加し、他の Participant (rclsharp 同士 / ROS 2 ノード) を検出します。
# Usage: dotnet run --project samples/SpdpDemo -- [domainId] [participantId] [entityName]
dotnet run --project samples/SpdpDemo -- 0 1 rclsharp_demo/chatter トピック (std_msgs/String) で文字列を送受信します。別シェルで起動してください。
# listener
dotnet run --project samples/TalkerListener -- listener
# talker
dotnet run --project samples/TalkerListener -- talkerlistener 側に I heard: 'Hello rclsharp: N' が出れば OK。
別シェルで ROS 2 talker を起動:
ROS_LOCALHOST_ONLY=1 ROS_DOMAIN_ID=0 ros2 run demo_nodes_cpp talkerSpdpDemo 側のログに ++ DISCOVERED ... unicast=UDPv4://127.0.0.1:7410 が出れば OK。