mc_rtc::Configuration 設定ROS(ロボットオペレーティングシステム)は、ロボット工学の分野で非常に有名なミドルウェアで、この分野で使用されている数多くのツールがROSを使用してデータをやり取りすることができます(ツールによってはROS専用のものもあります)。ただし、ROSはリアルタイムアプリケーション用に設計されていないため、ROSの製品をmc_rtcと統合する際は、その点を考慮する必要があります。このドキュメントでは、ROSの原理についてある程度習熟していることを前提として説明します。
mc_rtcは、提供されているオプションに応じて以下の情報をパブリッシュします。
前者はcontrol名前空間でパブリッシュされ、後者はreal名前空間でパブリッシュされます。
これ以外の情報については、コントローラーのコードで処理する必要があります。特に、mc_rtcは回転について関知しません。
外部のツールがロボットの状態をROSにパブリッシュできるように、mc_rtc::RobotPublisherクラスが用意されています。
以下のコードにより、mc_rtc によって作成された ros::NodeHandle にアクセスできます:
#include <mc_rtc/ros.h>
std::shared_ptr<ros::NodeHandle> nh = mc_rtc::ROSBridge::get_node_handle();
```cpp
#include <mc_rtc/ros.h>
std::shared_ptr<ros::NodeHandle> nh = mc_rtc::ROSBridge::get_node_handle();
mc_rtcがROSサポートなしでビルドされた場合、またはROSが初期化できなかった場合(通常はマスターが利用できないため)、返されるポインタはNULLになります。
この機能を使用するには、mc_rtc::mc_rtc_rosでリンクしていることを確認してください:
target_link_libraries(${YOUR_LIBRARY} PUBLIC mc_rtc::mc_rtc_ros)
mc_rtc が ROS サポートを有するか確認する方法は 3 つあります。
#ifdef MC_RTC_HAS_ROS_SUPPORT
// mc_rtc は ROS サポート付きでコンパイル済み
#endif
#include <mc_rtc/config.h>
if(mc_rtc::MC_RTC_SUPPORT_ROS)
{
// mc_rtc は ROS サポートあり
}
#include <mc_rtc/ros.h>
if(auto node = mc_rtc::ROSBridge::get_node_handle())
{
// mc_rtc は ROS サポートあり、かつ ROS マスターが実行中 (ROS1)
}
(mc_rtcで)ROSを使用する際に最も問題となるのは、リアルタイム処理がサポートされていないことです。そのため、以下の場所ではROSの関数を使用しないことを強く推奨します。
reset()関数run()関数これらの関数はいずれも、リアルタイムループ内か、リアルタイム性が要求される場面で実行されます。ROSによる操作をすべて別のスレッドで行わせることを推奨します。本ドキュメントでは同期に関する問題については扱いませんが、C++11以降では同期に関するさまざまなツールが用意されています。