ROS統合

ROS(ロボットオペレーティングシステム)は、ロボット工学の分野で非常に有名なミドルウェアで、この分野で使用されている数多くのツールがROSを使用してデータをやり取りすることができます(ツールによってはROS専用のものもあります)。ただし、ROSはリアルタイムアプリケーション用に設計されていないため、ROSの製品をmc_rtcと統合する際は、その点を考慮する必要があります。このドキュメントでは、ROSの原理についてある程度習熟していることを前提として説明します。

mc_rtcはROSとどのようなデータをやり取りするか

mc_rtcは、提供されているオプションに応じて以下の情報をパブリッシュします。

  1. ロボットの制御状態。これは、mc_rtcが参照情報として使用します。
  2. ロボットの実際の状態。インターフェイスによって提供されますが、完全な情報が得られないことがあります。

前者はcontrol名前空間でパブリッシュされ、後者はreal名前空間でパブリッシュされます。

これ以外の情報については、コントローラーのコードで処理する必要があります。特に、mc_rtcは回転について関知しません。

外部のツールがロボットの状態をROSにパブリッシュできるように、mc_rtc::RobotPublisherクラスが用意されています。

NodeHandle(ノードハンドル)を取得する

以下のコードを使用すると、mc_rtcによって作成されたros::NodeHandleにアクセスできます。

#include <mc_rtc/ros.h>

std::shared_ptr<ros::NodeHandle> nh = mc_rtc::ROSBridge::get_node_handle();

なお、ROSのサポートなしでmc_rtcがビルドされている場合や、ROSを初期化できなかった場合(通常、マスターを利用できなかった場合)には、nullポインターが返されます。

推奨事項

リアルタイム処理を行う箇所でROSのコードを使用しない

(mc_rtcで)ROSを使用する際に最も問題となるのは、リアルタイム処理がサポートされていないことです。そのため、以下の場所ではROSの関数を使用しないことを強く推奨します。

  1. reset()関数
  2. run()関数

これらの関数はいずれも、リアルタイムループ内か、リアルタイム性が要求される場面で実行されます。ROSによる操作をすべて別のスレッドで行わせることを推奨します。本ドキュメントでは同期に関する問題については扱いませんが、C++11以降では同期に関するさまざまなツールが用意されています。