関心分野 >> Ros4Winのインストール >> ROSノード
ROSノード
このページでは、ROSシステムにおける基本となる「ノード」(ROSノード)とその操作について解説していきます。
''ROSノード''は、ROSをベースに構成されるロボットシステムにおける最小単位の機能モジュールであり、OS上では1つのプロセスに対応します。(ROS2では、ノードはプロセスではなくスレッドに対応しています)ROSノードは、他のノードとの情報交換にトピック通信、サービス、パラメータサーバーを使っています。
''トピック通信''は、Publish-Subscribe方式のデータ通信に使われるデータストリーミングです。
''サービス''は、RPC(Remote Procedure Call)であり、Request-Responseの対となるデータ通信です。ROSシステムでは、RPCをトピック通信上に実現されており、同期、非同期通信をサポートしています。
''パラメータサーバー''は、ネットワークAPIを介してアクセスできる共有データスペースです。
''トピック通信''は、Publish-Subscribe方式のデータ通信に使われるデータストリーミングです。
''サービス''は、RPC(Remote Procedure Call)であり、Request-Responseの対となるデータ通信です。ROSシステムでは、RPCをトピック通信上に実現されており、同期、非同期通信をサポートしています。
''パラメータサーバー''は、ネットワークAPIを介してアクセスできる共有データスペースです。
ROSシステムでは、ノードを動作させるには、roscoreというプログラムを動作させておく必要があります。
''roscore''は、''rosmaster(ROSのネームサーバー)''と''rosout(ROSの標準出力)''及びパラメータサーバーからなり、ノードの通信において必要不可欠なものです。(roscoreは、必ずしもノードが動作している計算機上で動作している必要はないのですが、ROSシステム内で必ず1つ動作している必要があります)
''roscore''は、''rosmaster(ROSのネームサーバー)''と''rosout(ROSの標準出力)''及びパラメータサーバーからなり、ノードの通信において必要不可欠なものです。(roscoreは、必ずしもノードが動作している計算機上で動作している必要はないのですが、ROSシステム内で必ず1つ動作している必要があります)
クライアントライブラリ
ROSノードを開発するには、クライアントライブラリが必要になります。ROSのクライアントライブラリは、オフィシャルには、C++とPythonの2つのプログラミング言語をサポートしています。(ROSのコミュニティでは、LispやC#などで開発するためのライブラリを公開されているものもあります)
- rospy = Pythonクライアントライブラリ
- roscpp = C++ クライアントライブラリ
ROSノードを動かしてみる
Ros4Winでは、ROSチュートリアルが含まれていますので、ROSノードを実際に動かしてみたいと思います。
roscoreの起動
ROSシステムでは、ROSノードを実行する前に roscoreを起動させておく必要があります。
> start roscore
このコマンドを実行すると下のように新たなターミナルウィンドウが起動し、roscoreが起動します。
Windowsでは、startコマンドを使うと新たにターミナルウィンドウを生成させた後に、コマンドを実行することができます。
rosnodeでノードを調査
roscoreを起動させると rosoutというノードが起動します。ROSシステムでは、起動しているノードの状態を調査するためにrosnodeというコマンドを使用します。では、下のように rosnode listコマンドを実行してみてください。
> rosnode list
このコマンドは、現在実行中のノードの一覧を得ることができます。このチュートリアルでは、下のように表示されると思います。
/rosout
また、rosnode infoコマンドでノードの情報を得ることができますので、 '/rosout'の情報を取得してみます。
> rosnode info /rosout
--------------------------------------------------------------------------------
Node [/rosout]
Publications:
* /rosout_agg [rosgraph_msgs/Log]
Subscriptions:
* /rosout [unknown type]
Services:
* /rosout/get_loggers
* /rosout/set_logger_level
contacting node http://DESKTOP-SRBNMG7:62945/ ...
Pid: 110720
このコマンドでは、ノードのPublisher, Subscriber, Serviceの情報と通信ポートおよびPIDを得ることができます。
次に他のノードについても調査してみます。そのために、rosrunコマンドを使って別のノードを起動しましょう。
rosrunでノードを起動
rosrunコマンドは、パッケージ名とノード名を指定して、パッケージに含まれるノードを起動します。Ros4Winでは、rosrunコマンドは、バッチファイルで実装しています。
rosrunコマンドは、Ros4Winでは若干の機能拡張をおこなっており、使用方法は下のようになります。
rosrunコマンドは、Ros4Winでは若干の機能拡張をおこなっており、使用方法は下のようになります。
> rosrun [--start] package_name [node_name]
rosrunコマンドは、ノード名が省略された場合には、node_nameをpackage_nameと同じととて起動します。通常は、package_nameとnode_nameの両方を指定します。また、'--start'オプションを指定した場合には、新たにターミナルウィンドウを生成した後にノードを起動します。
では、turtlesimパッケージのturtlesim_nodeを起動してみます。
> rosrun --start turtlesim turtlesim_node
このコマンドで新規にターミナルウィンドウを生成して、下のようなturtlesimのウィンドウが表示されます。
次に、rosnode listコマンドを実行して、現在起動中のノードを参照します。
>rosnode list
/rosout
/turtlesim
このように '/turtlesim'というノードが起動指定ことがわかります。ROSでは、rosnodeコマンドで参照される名前をノード起動時に指定することもできます。turtlesimの右上の'X'を押下してウィンドウを閉じて終了させて、再度下のコマンドでturtlesimを起動してみてください。
> rosrun --start turtlesim turtlesim_node "__name:=my_turtle"
上記の "__name:=my_turtle" は、リマップ引数(Remapping Arguments)と呼んでいます。Windowsでは、このように " で囲む必要がありますので、注意してください。
ここで、rosnode listコマンドを実行すると下のように表示されます。
>rosnode list
/my_turtle
/rosout
このように '/my_turtle'というノードが見えます。rosnode pingコマンドで、my_turtleノードが起動中かどうかをチェックしてみましょう。
>rosnode ping my_turtle
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://DESKTOP-SRBNMG7:63833/ time=2024.397135ms
xmlrpc reply from http://DESKTOP-SRBNMG7:63833/ time=0.000000ms
xmlrpc reply from http://DESKTOP-SRBNMG7:63833/ time=0.998497ms
ping average: 675.131877ms
rosnode pingコマンドは、Ctrl+Cで中断できます。
以上でROSノードの起動と状態のチェックができました。次は、ROSのトピック通信について見ていきましょう。