gucchiyの日記

仕事や生活の備忘録的に。

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;
    }
}