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環境を確認してくれるツール。色々チェックしてくれるっぽい。