(予備) OpenMANIPULATOR-Xを使ったマニピュレーション

実験で用いるTurtlebot3は、上部に5自由度のOpenMANIPULATOR-Xマニピュレータを搭載しています。このアームもTurtlebot3本体同様にROSによって動作させることができます。

GazeboシミュレータでOpenMANIPULATORを制御する

Gazeboシミュレータの実行

roscoreを起動した後で、以下のlaunchファイルをつかってGazeboを起動します。

$ roslaunch exp3 gazebo_manipulator_handle.launch

roslaunch exp3 gazebo_manipulator_handle.launch

Gazebo上にOpenMANIPULATORを搭載したTurtleBot3 Waffle Piのモデルがロードされ、ロボットと通信するコントローラarm_controller、gripper_controllerがそれぞれ実行されます。これらはそれぞれ、ロボットアームの関節とグリッパーを制御するコントローラーです。 次節に説明するmove_groupノードがこれらのコントローラと通信してロボットを制御します。

move_groupノードの実行

アーム・グリッパの行動計画にはMoveItという衝突回避計画生成の機能を持った行動計画モジュールを用いると便利です。 MoveItと連動するためにはmove_groupノードを実行する必要があります。Gazeboシミュレータで[▶] 実行ボタンを押してシミュレーションを開始した後に、以下のコマンドを入力すると、下の図のように”You can start planning now!“というメッセージが表示されます。このメッセージが出力されない場合はGazeboの実行ボタンを押し忘れている可能性があります。

$ roslaunch exp3 move_group.launch

roslaunch exp3 move_group.launch

move_group.launchを実行すると、move_groupノードが起動されます。 move_groupノードは、RViZなどのグラフィカルユーザーインタフェースなどを介してコマンドを受けとり、ロボットコントローラーにaction形式で伝達します。

Rvizを実行

[Remote PC] RViZの起動時にMoveIt環境が設定されたmoveit.rvizファイルを読み込ませ、Rviz上でMoveItを使用可能にします。 GUIでInteractive Markerを活用したロボットアームを制御でき、目標位置への動作をシミュレートしてあらかじめ動きを確認してからロボット本体(Gazeboの場合はシミュレータ上のロボット)を実際に動かすことができます。

$ roslaunch exp3 moveit_rviz.launch

roslaunch exp3 moveit_rviz.launch

このコマンドでMoveItが有効になったRvizが実行されます。Motion Planning pluginが起動し、moveit_setup_assistantを介して既に保存されているモーションやinteractive markerを介して設定したモーションを、move_groupに伝達することができます。目標姿勢を設定した後、Plan and Executeボタンを押すと、ロボットが動きはじめます。

注意
MoveIt!のInteractive Marker(上図のグリッパ部分に赤青緑などで表示されているマーカー)をマウスでつまんでアームを動かし、目標姿勢をつくることができます。この場合、MoveIt! ソフトウェアの機構学解析アルゴリズムに限界があり、円滑なコントロールができない可能性があります。

ROBOTIS GUIコントローラーの実行

Rvizを使用せずにGazebo上のロボットと接続し、ロボットアームを制御する方法もあります。ROBOTIS GUIはOpenMANIPULATORの1番目のDYNAMIXEL(関節モーター)を基準にグリッパーの有効な把持位置(グリッパーの指間の赤い六面体)をリファレンスとするTask Space Controlや各ジョイント関節の角度を指定するJoint Space Controlをサポートします。 必要に応じて便利な制御方法を使用できます。

$ roslaunch exp3 gui_manipulation.launch

roslaunch exp3 gui_manipulation.launch

ユーザーインターフェースでC++ move_group_interfaceを使用したqt guiが実行されます。インタフェースを介して受けとった現在のジョイント角度およびグリッパ位置がGUI上に表示されます。Sendボタンをクリックすると、設定された位置についてインターフェースを介してmove_groupに伝え、コントローラーに伝達しロボットを動かします。

実機でのOpenMANIPULATORの制御

MoveItのmove_groupノードは、以下のように様々な情報をもとに計算されたアーム・グリッパの軌跡を、ROSがサポートするaction形式でロボットコントローラーに提供する統合装置(intergrator)としての役割を持ちます。ユーザーは、move_groupノードにmoveitが提供する3種のインターフェース(C++、Python、RViz GUI)を通じてアクセスすることができます。ユーザーインターフェースを介してコマンドを受け取ると、move_groupノードはmoveit config情報(ジョイント角度の制限、機構学解析、衝突感知)およびロボットの状態情報に基づいて軌跡を生成し、ロボットコントローラーに渡します。 この実験ではそこまで詳細な内部構造には踏み込みませんので安心してください:-) 。

roscoreを実行する

roscoreをユーザーのPCで動作させます。

$ roscore

Turtlebot3実機に接続する。

以下のコマンドによってrosserialとLDSセンサを動作させるノードを実行します(ロボット番号”09”の場合)。

$ roslaunch exp3 machine.launch id:=09

roslaunch exp3 machine.launch id:=09

machine.launchを実行すると、以前と同じくSSH経由でTurtlebot3内で必要なノードを自動起動します。その中でLRFや車輪の回転制御、アーム・グリッパーなどのモーターコントローラーノードなどが起動します。

Arm/Gripper Controllerを起動する。

以下のコマンドによってTurtlebot3のアームとグリッパを制御するノードを実行します。

$ roslaunch exp3 robot_manipulation.launch

roslaunch exp3 robot_manipulation.launch

robot_manipulation.launchを実行すると、アーム・グリッパに関連するノードとして、arm_controllerとgripper_controllerのコントローラーノードが実行されます(これらはturtlebot3の中ではなくリモートPC側で実行されます)。またロボットの姿勢状態を表す座標変換(tf:transform)情報をpublishするrobot_state_publisherノードを起動します。move_groupと通信するaction serverコントローラーの役割として、それぞれmove_groupを介してアームとグリッパー関節の目標軌跡を読み込み、順にpublishします。publishされたトピックは、ロボットの関節に組み込まれたモータに伝達され、OpenMANIPULATORを動かします。

move_groupを実行する

MoveItと連動しているユーザーインターフェースであるmove_groupノードを実行します。

$ roslaunch exp3 move_group.launch

roslaunch exp3 move_group.launch

move_group.launchを実行すると、move_groupノードが起動されます。 move_groupノードは、RViZなどのグラフィカルユーザーインタフェースなどを介してコマンドを受けとり、ロボットコントローラーにaction形式で伝達します。

RVizを実行する

各種データの視覚化とInteractive Markerを活用したOpenMANIPULATORの制御のため、RVizを実行します。

$ roslaunch exp3 moveit_rviz.launch

roslaunch exp3 moveit_rviz.launch

このコマンドでMoveItが有効になったRvizが実行されます。Motion Planning pluginが起動し、moveit_setup_assistantを介して既に保存されているモーションやinteractive markerを介して設定したモーションを、move_groupに伝達することができます。目標姿勢を設定した後、Plan and Executeボタンを押すと、ロボットが動きはじめます。

ROBOTIS GUI を実行する

RVizとは別に、必要に応じてROBOTIS GUIを介し、OpenMANIPULATORを制御することもできます。

$ roslaunch exp3 gui_manipulation.launch

roslaunch exp3 gui_manipulation.launch

ユーザーインターフェースでC++ move_group_interfaceを使用したqt guiが実行されます。インタフェースを介して受けとった現在のジョイント角度およびグリッパ位置がGUI上に表示されます。Sendボタンをクリックすると、設定された位置についてインターフェースを介してmove_groupに伝え、コントローラーに伝達しロボットを動かします。

課題(Gazebo/実機編)

  1. GazeboシミュレータとRViZを起動して、RViZ上のMotion Planningタブ上でアームとグリッパそれぞれに目標姿勢を指定し、軌道生成を行ってアームとグリッパを動作させてみよ。2通りくらいの例を実行し、初期姿勢の状態と動作後のゴール状態についてRViZ上のロボット表示とGazebo上のロボットの様子を画面キャプチャしてノートに貼り付けよ。
  2. 1.と同様の内容を実機ロボットと接続して実行せよ。Gazebo上のロボットの代わりに実機の姿勢をスマフォ等で撮影して貼り付けよ。
  3. 実機を操作して適当な物体を把持してみよ。レンジセンサの出力をRViZ上で確認すると目標位置の参考になるかもしれない。

発展テーマ(解説未完成)

この節はROSパワーユーザ用の発展課題用メモです。以下の説明では実行することが困難なので、あくまで参考のための資料です。

MoveIt!

MoveIt!はロボットの動作軌道を自動生成するためのツールで、RViZに組み込まれたGUIからも操作できますが、pythonスクリプトから実行することもできます。 詳細は次のページに記載されています。ロボットとシーンを定義し、ロボットに対してエンドエフェクタ(手先)の三次元位置と向きのゴール姿勢を指定すると、現在姿勢からゴール姿勢までの動作軌道を計画して動作命令を発行することができます。 MoveIt!

Obstacle Detector

Obstacle Detectorは、LRF(レーザーレンジセンサー)の計測データ(/scanトピックにpublishされている)をsubscribeして、線上のオブジェクトと円形状のオブジェクトを検出し、obstacle_detector/Obstacles型のメッセージとして/obstaclesトピックに検出された座標を出力するROSノードモジュールです。 日本語解説記事 Github

これらを組み合わせると、ペットボトルのような円筒形の物体を検出してグリッパをその位置に移動しつかむ動作を生成することができます。

ただし、Obstacle Detectorは配布したLinuxシステムにインストールされていないので、Githubからダウンロードしてインストールする必要があります。

$ cd ~/exp3_ws/src
$ git clone https://github.com/tysik/obstacle_detector.git
$ cd ~/exp3_ws
$ catkin_make

上記の操作はかならず教員に相談してから実行してください。ROSの環境を壊してしまう可能性があります。

Turtlebot3用のlaunchファイルのダウンロードと起動

obstacle_detection.launchをここからダウンロードして起動するとturtlebot3のLRFセンサで検知された物体がRViZに表示されます。 障害物の情報は/Obstaclesトピックに出力されます。これをsubscribeしてmoveitの逆運動学のモジュールをつかってアームの関節位置を動かすことができます(詳細はまだ記載できていません)。

$ roscd exp3
$ cp ~/Downloads/launch-rviz.tar.gz .
$ mkdir ../tmpdir
$ cp -r launch rviz ../tmpdir
$ tar zxvf launch-rviz.tar.gz
-----
(turtlebot3実機操作のためのlaunchを起動)
-----
$ roslaunch exp3 obstacle_detection.launch

roslaunch exp3 obstacle_detection.launch

LRFセンサーの情報をもとに平面もしくは円筒状の障害物を検知して、RViZ上に表示することができます。