直交座標系における軌道計画入門¶
モチベーション¶
MoveIt! はロボットを A 点から B 点に移動させることを目的とした, 「フリースペース」モーションを主な目的としたフレームワークで, それがどのように処理されているかについて ユーザは特に気にしなくても大丈夫なようになっています. このようなタイプの問題は実行されるタスクの多くあるケースの一部にすぎません. 溶接や塗装といった製造の「プロセス」を想像してみてください. ロボット動作の最初から最後まで ツールがどこを指しているのかについて非常に気を配っています.
このチュートリアルでは, 任意のプロセス経路に沿ってロボットを動かすための Descrates: 直交座標系(Cartesian/カーテジアン) モーション・プランナを紹介します. これはこの種の問題を解決する数多くの方法の1つではありますが, それはいくつかの巧妙な特性を持っています.
- 決定論的で,かつ全体としてみると(ある程度の検索解像度においては)最適です.
- 課題の冗長自由度を探索できます. ( 7つのロボット関節がある, もしくはツールのZ軸回転が問題ではないプロセスのような場合 )
リファレンス¶
追加情報とリソース¶
APIs:
Scan-N-Plan アプリケーション: 演習問題¶
本演習では次のリファレンス・テンプレートに基づいて Scan-N-Plan アプリケーションに新しいノードを追加します.
- マーカーの公称姿勢を ROS サービスを介して入力として受け取ります.
- ロボットにマーカーの周囲をトレースするように命令する 関節軌道を生成します. ( 接着剤を塗布するような場合を想定 )
Scan-N-Plan アプリケーション: ガイダンス¶
時間節約のために,次の内容の descartes_node.cpp
というファイルを導入します.
- 直交座標系における動作軌道計画のための 新しいノードと関連クラスを定義
- 実際のサービスを定義し 直交座標系ライブラリを初期化
- 高レベルの作業フローを提供(参照: planPath 関数)
演習課題として次のことを行います.
- ロボット「軌道」を構成する 一連の直交座標系上の姿勢を定義します.
- これらの軌道を Descartes が処理できるものに変換します.
ワークスペースのセットアップ¶
Descartes リポジトリを ワークスペースの src/ ディレクトリにクローンします.
cd ~/catkin_ws/src git clone -b kinetic-devel https://github.com/ros-industrial-consortium/descartes.git
ur5_demo_descartes
パッケージを ワークスペースの src/ ディレクトリにコピーします.cp -r ~/industrial_training/exercises/4.1/src/ur5_demo_descartes .
descartes_node_unfinished.cpp
を コアパッケージの src/ フォルダにコピーして,descartes_node.cpp
に名前を変更します.cp ~/industrial_training/exercises/4.1/src/descartes_node_unfinished.cpp myworkcell_core/src/descartes_node.cpp
これまでの演習と同じように下記のパッケージの依存関係を
CMakeLists.txt
とpackage.xml
ファイルに記述します.ur5_demo_descartes
descartes_trajectory
descartes_planner
descartes_utilities
descartes_node
という名前の 新しいノードをビルドするために,myworkcell_core
パッケージのCMakeLists.txt
にルールを作成します.これまでの演習と同じように, これらの行をテンプレートファイルの類似した行の近くに追加します. ( 下は1つのブロックではありません )
add_executable(descartes_node src/descartes_node.cpp) add_dependencies(descartes_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(descartes_node ${catkin_LIBRARIES})
Descartes ノードを完成させる¶
Descartes 動作計画アルゴリズムを実行するための サービス・インタフェースを作成します.
PlanCartesianPath.srv
という名前の新しいサービスをmyworkcell_core
パッケージのsrv/
ディレクトリに定義します.このサービスは目標物のセンタ位置を取得し, 目標物のエッジをトレースするための関節軌道を計算します.
# request geometry_msgs/Pose pose --- # response trajectory_msgs/JointTrajectory trajectory
新しく作成したサービスファイルを パッケージの
CMakeLists.txt
のadd_service_file()
ルールに追加します.この新しいサービスは 他のパッケージのメッセージタイプを参照しているので,
myworkcell_core
のCMakeLists.txt
(3行)とpackagework.xml
(1行)に依存関係として 他のパッケージ(trajectory_msgs
)を追加する必要があります.descartes_node.cpp
を見返してコード構造を理解してください. 特にplanPath
メソッドは主要な手順の要点を記述しています.Descartes ノード・ファイルにて TODO 指示を検索し, それらの部分を次のように拡張します.
makeToolPoses
では 目標物 "AR Marker" の外側をトレースする経路の 残りの3辺を生成します.makeDescartesTrajectory
で, 作成した経路を直交座標系軌跡に1点1点変換します.- 公称点を指定された参照ポーズで変換することを忘れないでください.
ref * point
- 公称点を指定された参照ポーズで変換することを忘れないでください.
makeTolerancedCartesianPoint
では, 与えられたポーズからnew AxialSymmetricPt
を作成します.- このポイント型の詳細については ここ を参照してください.
- 90[deg]( PI/2[rad] )加算して,
点を Z 軸対称(
AxialSymmetricPt::Z_AXIS
)にします.
プロジェクトをビルドし, 新しい
descartes_node
にエラーがないことを確認してください.
作業セルノードの更新¶
Descartes ノードが完成した後,
新しい ServiceClient
をメインの作業セルノードに追加して,
そのロジックを呼び出す必要があります.
このサービスの出力はこの後にロボットで実行する関節軌道です.
ロボットでの実行は様々な方法で達成できますが,
ここでは JointTrajectoryAction
を直接呼びます.
myworkcell_node.cpp
に 次のヘッダの include 文を追加します.#include <actionlib/client/simple_action_client.h> #include <control_msgs/FollowJointTrajectoryAction.h> #include <myworkcell_core/PlanCartesianPath.h>
これらのライブラリとメッセージは MoveIt! から引かれているので 新しい依存関係を追加する必要はありません.
ScanNPlan クラスで 新しい
PlanCartesianPath
変数のServiceClient
とFollowJointTrajectoryAction
の アクションクライアントを追加します.ros::ServiceClient cartesian_client_; actionlib::SimpleActionClient<control_msgs::FollowJointTrajectoryAction> ac_;
これらの新しいオブジェクトを コンストラクタで初期化します. アクションクライアントは
initializer list
と呼ばれるもので 初期化されなければならないことに注意してください.ScanNPlan(ros::NodeHandle& nh) : ac_("joint_trajectory_action", true) { // ... code cartesian_client_ = nh.serviceClient<myworkcell_core::PlanCartesianPath>("plan_path"); }
start()
関数の最後で, 新しい直交座標系サービスを作成し, サービス要求を行います.// Plan cartesian path myworkcell_core::PlanCartesianPath cartesian_srv; cartesian_srv.request.pose = move_target; if (!cartesian_client_.call(cartesian_srv)) { ROS_ERROR("Could not plan for path"); return; }
続けて次の行を追加して, ( MoveIt! をバイパスして)アクションサーバに 直接アクションを送信することで その軌道を実行します.
// Execute descartes-planned path directly (bypassing MoveIt) ROS_INFO("Got cart path, executing"); control_msgs::FollowJointTrajectoryGoal goal; goal.trajectory = cartesian_srv.response.trajectory; ac_.sendGoal(goal); ac_.waitForResult(); ROS_INFO("Done");
プロジェクトをビルドし, 新しい
descartes_node
にエラーがないことを確認してください.
アプリケーション全体のテスト¶
workcell_node を除くすべてのノードを起動する 新しい
setup.launch
ファイルをworkcell_support
パッケージ内にを作成してください.<include file="$(find myworkcell_moveit_config)/launch/myworkcell_planning_execution.launch"/> <node name="fake_ar_publisher" pkg="fake_ar_publisher" type="fake_ar_publisher_node" /> <node name="vision_node" type="vision_node" pkg="myworkcell_core" output="screen"/> <node name="descartes_node" type="descartes_node" pkg="myworkcell_core" output="screen"/>
新しいセットアップファイルを実行してから メイン作業セルノードを実行します.
roslaunch myworkcell_support setup.launch rosrun myworkcell_core myworkcell_node
RViz で動作計画のループアニメーションが常に実行されていると 何が起きているのかを確認するのが難しくなります. RViz でこのループアニメーションを無効にし ( Displays -> Planned Path -> Loop Animation ) それから
myworkcell_node
を再実行します.
ヒントとヘルプ¶
- ヒント:
makeToolPoses()
で定義した軌道は 作業部分の既知の参照点からの相対的なものです. したがって (0, 0, 0) のツール姿勢は ワールド座標系の原点ではなく参照点そのものに位置します.makeDescartesTrajectorty(...)
では "ref" 姿勢を使って 相対的なツール姿勢をワールド座標に変換する必要があります.makeTolerancedCartesianPoint(...)
では, 一般的な関節軌道の特定の実装に関する 次のドキュメントを考慮してください.- ヘルプ:
- さらに詳しいヘルプは
〜/industrial_training/exercises/4.1/src
の完成コードを参考にしてください.