【ROS】rostopic list はできるのに rostopic echo ができない現象が解決できた

スポンサーリンク

rostopic listでトピック一覧表示はできる、なのにrostopic echoでトピック内容は表示できない。 そんな現象にちょっと前から遭遇していた。

ネットで調べるとファイヤーウォール等の通信制限や、環境変数ROS_MASTER、ROS_IPの設定ミスというケースでも発生するらしいが、自分の場合はどちらにも該当せず、ひとまず後回しにしていた。先日調べて解消できたので、そのメモです。

環境

端末の情報

端末とIPアドレスは次のとおり。

PC:192.168.2.148
Jetson Nano:192.168.2.146

どちらにもUbuntu 18.4、ROS Melodicをインストール済み。
roscoreはJetson nanoで動かしている。

名前解決しなくてもいいように、環境変数ROS_IP, ROS_MASTERはIPアドレスを直接指定していた。

PC側の環境変数

$ env | grep ROS
ROS_IP=192.168.2.148
ROS_MASTER=http://192.168.2.146:11311
省略

Jetson Nano側の環境変数

$ env | grep ROS
ROS_IP=192.168.2.146
ROS_MASTER=http://192.168.2.146:11311
省略

rostopic listの動作状況

rostopic listは、PC側、Jetson Nano側共に正しく表示される。

$ rostopic list
/cmd_vel
/command
省略

rostopic echoの動作状況

Jetson Nano上では、rostopic echoは正常に動作する。
PC側だとrostopic echoを実行しても何も反応がない。
表示しようとしている/commandトピックは、あるノードから10Hz間隔で配信している。

$ rostopic echo /command
何も反応がない。。。

原因

rosnode infoで確認してみると、ノードのURLにはホスト名が使われていた。
環境変数IPアドレスを直接指定してホスト名を使わないことを期待してたけど、実際にはホスト名が使われていて、名前解決できずにノード間通信ができていなかった。

$ rosnode info /pca9685_node 
--------------------------------------------------------------------------------
Node [/pca9685_node]
Publications: 
 * /rosout [rosgraph_msgs/Log]

Subscriptions: 
 * /command [std_msgs/Int32MultiArray]

Services: 
 * /pca9685_node/get_loggers
 * /pca9685_node/set_logger_level

contacting node http://nano-4gb-jp441:41603/ ...
省略

nano-4gb-jp441はJetson Nanoのホスト名で、PC側からは名前解決ができないため通信できない。

解決方法

名前解決を行えば、問題は解消された。
具体的にはPCの/etc/hostsに「192.168.2.146 nano-4gb-jp441」を登録した。

無事トピックの内容も受け取れるようになったので、やっとこれでROSを遠隔操作できる。

リンク

ROS.org NetworkSetup
ROSのネットワーク確認方法について、ping、netcatと順をおって丁寧に書かれている

roswtf
ROS環境を確認してくれるツール。色々チェックしてくれるっぽい。