MoveIt! の Topic をハンドルする
意外と MoveIt! の Topic ハンドラのサンプルがないので。
なお、最近、ROS Indigo になって、MoveIt!のクラスライブラリも大きく刷新されたのらしく、サンプルがことごとくコンパイルできなくなっちゃってます。それもあってあまり親切な解説はないのですが、ROS の基本的な動作と、モダンな C++ について知識さえあれば、ヘッダファイルから動作を知ることはできます。
#include "ros/ros.h" #include "moveit_msgs/MoveGroupActionResult.h" #include "moveit_msgs/MoveGroupActionGoal.h" #include <iostream> // /move_group/result TOPIC ハンドラ void onMoveGroupResult(const moveit_msgs::MoveGroupActionResult& result ) { // 軌道計画の result 表示 std::cout << result << std::endl; } // /move_group/goal TOPIC ハンドラ void onMoveGroupGoal(const moveit_msgs::MoveGroupActionGoal& desired ) { // 軌道計画の desired 表示 std::cout << desired << std::endl; } // main 関数 int main(int argc, char **argv) { ros::init(argc, argv, "MoveItTopicSample"); ros::NodeHandle nodeHandle; ros::Subscriber subscribeResult, subscribeGoal; ros::Rate rate(10); // MoveIt! Topic ハンドラの登録 subscribeResult = nodeHandle.subscribe("/move_group/result", 1, onMoveGroupResult); subscribeGoal = nodeHandle.subscribe("/move_group/goal", 1, onMoveGroupGoal); ros::spin(); return 0; }
各 Topic ハンドラで渡される goal や desired の内容はヘッダファイルからメンバ変数を覗くことで確認できますが、基本的に Topic で表示される値そのままです。例えば、result の場合は、こんな感じで扱います。rqt や rostopic /echo などをうまく使って確認します。
// /move_group/result TOPIC ハンドラ void onMoveGroupResult(const moveit_msgs::MoveGroupActionResult& action ) { // 初期角度を取得 for( int i = 0; i < action.result.trajectory_start.joint_state.name.size(); i++ ){ // 関節名 std::cout << action.result.trajectory_start.joint_state.name[i] << std::endl; // 関節角度(rad) std::cout << action.result.trajectory_start.joint_state.position[i] << std::endl; } }