Jetson Nanoで学習済みモデルを使って、いろいろやってみる(8-1)ROS2(DDS)


ROS2(Robot Operating System 2)はRobot OS となっていますがフツーの意味のOSではなく、ミドルウェアです。

ROS2で採用されたDDS(Data Distribution Service)を使ってノード間通信をやってみます。

注:ここでは未だ学習済みモデルは使いません。

 

ROS2 とかDDS って例えばこんな感じのもん

ROSチュートリアル(ROS1ですが概観を把握)

 

コンピュータ間通信はsocketを使えばシンプルに実現できますが、ここではより高信頼性とリアルタイム性、汎用性を持つROS2のDDSを使ってみます。

こんな感じのネットワークを作っていろいろ試してみます。

 

まずは、Jetson Nano で同じコンピューター内の異なるノードと、違うJetsonのノードとのTOPIC通信です。

環境はJetson Nano + コンテナ

 


 


環境構築

OSイメージはともにJetpack 4.5.1

まずここにROS2(Foxy)のドッカーイメージを作成します(4GBで1時間ちょい、2GBで2時間ちょいかかります)。

作成されたイメージ

これを使ってコンテナを作ります(USBカメラを接続しておいてください、今回は使いませんが)

作業用ディレクトリを作っておきます(今回は使いませんが)。

コンテナ作成

シンプルなコンテナ

sudo docker create -it --name my_ros2 --gpus all --network host ros:foxy-ros-base-l4t-r32.4.4

カメラやWindowを使う場合

sudo docker create -it --name my_ros2 --gpus all --network host -e DISPLAY=$DISPLAY --device /dev/video0:/dev/video0 -v /tmp/.X11-unix/:/tmp/.X11-unix -v /home/jetson/work-ros2:/work ros:foxy-ros-base-l4t-r32.4.4

 

コンテナ起動

アップデート&アップグレード、エディタもインストールしておきます。

~/.bashrcに追記しておきます。

 

コンテナを一旦終了

Ctrl + D

 


demo_nodes_cpp(demo_nodes_py)というパッケージを使って通信テスト

Nano(4GB)とNano(2GB)でコンテナ起動

 

4GBでターミナルをもう一つ開いておきます。

 

各ターミナルで共通のDOMAIN_IDを設定(0~65532、例えば10)

 

どれかのターミナルから”Hello World”というメッセージをキャストします。

 

他のターミナルでメッセージを待ち受けます。

 

同じDOMAIN_IDを持っているターミナルが受信します。

 

Jetson(4GB)のコンテナ同志のノード間通信

違うJetson(2GB)ですが、同じDOMAIN_IDでlistenしています。

違うDOMAIN_IDでターミナルを立ち上げれば、逆方向のノード間通信を同時に行うこともできます。

また、同一コンピュータ内で異なるコンテナ間で通信する場合は、どちらか一方のnetworkオプションは不要です。明示的に指定する場合はhostの代わりにbridge を使います。

ネットワーク越しにコンテナ間で通信する場合、networkオプションはhostです。

 

では、request & responce (reply) はどうなっているのか?->調査中

同じDOMAIN_IDで送受信を混在させることも出来るようなので、自分のユニークIDを送受信すれば1対1でなくてもいいのかもしれないけど….。

 

ちなみに、Python版のros2 run demo_nodes_py talkerでメッセージを変更したい場合は

/opt/ros/foxy/src/demo_nodes_py/demo_nodes_py/topics/talker.py

を編集したりします(日本語もいけます)。

メッセージを受けて何かしたい….というような場合もPython版の/opt/ros/foxy/src/demo_nodes_py/demo_nodes_py/topics/listener.py

を編集すれば簡単です。

上記talker.pyのサンプルソースではタイマで断続してメッセージが出されます。

1回だけでいんですけど….という場合は、こちらのページをご参照ください。

Jetsonからラズパイにメッセージを届けてみる(ROS2/DDS)

 


topicを使って、”Hello World” 以外のメッセージを送ってみる

data: の後ろにメッセージをセットします。

受ける側はこういう感じ。

日本語も送れるようです。

demo_nodes_cppパッケージのlistner でも受信できます。

また、talkerの送信をtopicのchatterで受けることも出来てしまいます。

 

topic名はchatter とかgreeting とかありますが、自分で名前をつけることもできるようです。

例えばtopic名をABCとします。

publishします。

listで確認

/ABCが確認できると思います。

 

echoでtopicのメッセージを出力します。

 


通信メッセージを独自定義して使ってみる

 

工事中

 

 


ROSグラフが大きく複雑で大規模なシステムの場合

ROS 2は互いのノードを分散処理で探します。 しかし、大規模なシステムの場合、ROSグラフに参加する全てのノードを発見するには時間がかかります。そこで、ノード名のリストを取得するなどのROSグラフ関連のクエリにより早く応答するために、専用のデーモンをバックグラウンドで起動しておきます。

開始

状態確認

停止

 

ROSグラフが大きく複雑になる大規模なシステムでは有用になります。

 


Appendix

ROS2 は大規模システムから、マイコンレベルのデバイスにも対応するなど多才です。

コマンドラインでどんなことができるか、チートシートが用意されています。

ROS2 チートシート

 


参照

NVIDIA Jetson プラットフォームでの ROS2 と AI を使用したロボットアプリケーションの実装

 


Appendix2

いろいろ使いまわせるようにコンテナをイメージにしてDocker Hub にpush しておきます。

pushする場合はHubのあなたのリポジトリ名をつけてイメージを作成しておきます。

コンテナ名がAAAでリポジトリ名がBBB、イメージ名をCCCにするとしたらこんな感じ。

で、pushします。

イメージをダウンロード

 

 


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*