こんにちは、小銭です。インターンシップで書籍「ROS 2とPythonで作って学ぶAIロボット入門」を読み進めてCRANE+ V2で実際に動かしています。前回は、アームロボットの基礎知識、順運動学、逆運動学を学びました。

今回は、最後のブログです!
今回はROS 2のアクション通信を利用するプログラム、tfを用いて他のノードから指令を受けて動作するサンプルプログラムを動かし、最後に物体把持のプログラムを作成しました。
インターンで使用したもの
8月30日に発売された書籍「ROS 2とPythonで作って学ぶAIロボット入門」にてアールティが販売するアームロボットCRANE+ V2を教材としてご紹介いただきました。

CRANE+ V2について詳しくは下記の製品ページをご覧ください。
6.5.8 ROS 2のアクション通信を利用するプログラム
書籍の6.5.8項では、ROS 2の通信方法の1つであるアクション通信について解説されています。
アクション通信はロボット(ROSノード)が指令(リクエスト)を受け取り、動作の途中経過(フィードバック)を指令した側に送り、動作が終了したら結果(リザルト)を送ります。
アクション通信は時間がかかる動作または、途中で動作を変える場合などに使います。
CRANE+ V2でアクション通信を使用してみた
実際にアクション通信がどうなっているかCRANE+ V2でサンプルプログラムを動かしてみました。
次のコマンドでサンプルプログラムを実行します。
#CRANE+ V2の起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#サンプルプログラム
$ ros2 run crane_plus_commander commander4
実行した様子はこちらです。
サンプルプログラムを実行すると、端末にコマンド入力画面が表示されます。
例えばzerosを入力するとすべての関節角度の値が0radになり、onesを入力するとすべての関節角度の値が1radになります。
チャレンジ6.4をやってみた
このサンプルプログラムを用いた課題(P.215のチャレンジ6.4)が書籍に載っているので実践してみました。
チャレンジ6.4
1. commander4.py を変更して,保持している目標のポーズを増やしてみましょう.
2. commander1.py と commander4.py を合体させましょう.
3. 上のプログラムに,さらに, r キーを押すと現在のポーズを登録する機能も追加しましょう.
出村公成・萩原良信・升谷保博・タン ジェフェリー トゥ チュアン(2022)ROS 2とPythonで作って学ぶAIロボット入門 講談社
※commander1.pyはキー操作で関節角度を少しずつ変更するサンプルプログラムです。
私が作成したプログラムをGitHubにて公開します。※ネタバレ注意です
チャレンジ6.4のプログラムは次のコマンドで実行できます。
#CRANE+ V2 起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#challenge6.1,3,4
$ ros2 run crane_plus_commander challenge6_134
以下の動画はcommander1.pyにcommander4.pyのプログラム内容を合体させたものです。
チャレンジ6.4の課題を作成し、登録したポーズと既存のポーズで物体把持をしてみました。
キー入力を繰り返してもロボットは動けますが、手間が掛かります。アクション通信を使えば、指示だけ与えてロボットが自動で動くプログラムも作れそうですね。
6.6.1 URDFとtf
書籍の6.6.1項では、URDFとtfについて解説されています。
URDFはロボットのモデルや構造が書かれたテキストファイルです。
tfは、システム内のすべての座標系間の関係を保持し管理するツールです。
URDFで定義されたロボットの座標係だけでなく、新たに座標系を登録することも出来ます。
例えばカメラで物体を検出した場合に、物体の位置をtfに登録することで、ロボットから見た物体の相対位置を自動で取得できます。
CRANE+ V2でtfを使用してみた
書籍6.6.3項にtfを用いたサンプルプログラムがあります。
次のコードでサンプルプログラムを実行しました。
#CRANE+ V2を起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#サンプルプログラム
$ ros2 run crane_plus_commander commander5
#RViz起動(airobot_wsは私が作成したROS 2のワークスペースです)
$ rviz2 -d airobot_ws/install/crane_plus_description/share/crane_plus_description/launch/display.rviz
実行した様子はこちらです。
RViz内のCRANE+ v2に座標系手先位置(endtip)が追加され、commander2.pyと同様のキー操作で手先位置を変更するプログラムも実行されます。
チャレンジ6.5をやってみた
書籍の課題(P.221チャレンジ6.5)をやってみました。
チャレンジ6.5
commander5.py を変更して,座標系 crane_plus_endtip の位置・姿勢を変更してみましょう.
出村公成・萩原良信・升谷保博・タン ジェフェリー トゥ チュアン(2022)ROS 2とPythonで作って学ぶAIロボット入門 講談社
私が作成したプログラムをGitHubにて公開します。※ネタバレ注意です
チャレンジ6.5のプログラムは次のコマンドで実行できます。
#CRANE+ V2 の起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#challenge6.5
$ ros2 run crane_plus_commander challenge6_5
#RViz起動(airobot_wsは私が作成したROS 2のワークスペースです)
$ rviz2 -d airobot_ws/install/crane_plus_description/share/crane_plus_description/launch/display.rviz
tfは難しすぎて、ハッキリ理解できるまではもう少し時間が掛かりそうです…。
何回か使用して理解を深めたいと思います。
6.8.1 サービスサーバ
書籍の6.8.1項にはサービスサーバについて解説されいます。
サービスサーバはサービス通信のサーバ側のことをいいます。
サービス通信はアクション通信のように依頼する側(クライアント)と依頼を処理する側(サーバ)で通信をします。
アクション通信と違い、途中経過が見れません。
CRANE+ V2でサービス通信をしてみた
サービス通信にもサンプルプログラムが用意されています。
次のコマンドでプログラムを実行できます。
#CRANE+ V2を起動 $ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py #サンプルプログラムの実行 $ ros2 run crane_plus_commander commander6 #クライアント起動 $ ros2 run crane_plus_commander test_client
実行した様子はこちらです。
クライアント側のノード(キー入力端末)を起動すると、サンプルプログラムとの通信を開始します。
端末にキーを入力することで、クライアントからサンプルプログラムへ目標値を送信します。
例えば、set_pose zeros を入力するとすべての関節角度が0radの値になります。
チャレンジ6.6をやってみた
書籍の課題(P.226チャレンジ6.6)をやってみました。
チャレンジ6.6
commander6.py を変更して,サービスで受け付ける指令を追加して,座標系の名前で指定された位置・姿勢に手先を移動できるようにしてください.
出村公成・萩原良信・升谷保博・タン ジェフェリー トゥ チュアン(2022)ROS 2とPythonで作って学ぶAIロボット入門 講談社
私が作成したプログラムをGitHubにて公開します。※ネタバレ注意です
チャレンジ6.6のプログラムは次のコマンドで実行できます。
#CRANE+ V2 の起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#challenge6.6 miniproject6.2
$ ros2 run crane_plus_commander challenge6_6_minipro6_2
#クライアントの作成
$ ros2 run crane_plus_commander test_client
#tf追加
$ ros2 run tf2_ros static_transform_publisher 0.2)` 0.1 0 0 0 crane_plus_base target
#RViz起動(airobot_wsは私が作成したROS 2のワークスペースです)
$ rviz2 -d airobot_ws/install/crane_plus_description/share/crane_plus_description/launch/display.rviz
実行した様子はこちらです。
アクション通信みたいにフィードバックが返ってこないのは不便でした。
しかし、サーボのon / offのような簡易的な情報をサービス通信でやりとりするのはとても便利だと思います。
物体把持をしてみよう
書籍の第6章の終わりにはミニプロジェクトという課題があります。課題のテーマは、カメラで物体検出することを想定した、CRANE+ V2による物体把持です。
物体の位置が分かった状態で、CRANE+ V2がどのような動きをしたら物体をつかめるのか考えなければなりません。
最初に物体の座標を適当に設定し、以下の手順通りにCRANE+ V2が動くか確認しました。
- グリッパーを開く
- 物体の手前に手先が移動
- 物体をつかめる場所まで移動
- 物体を掴む
- 物体を持ち上げて
- アームを引っ込める
プログラムはchallenge6_6_minipro6_2.pyとして作成しました。
下記ののコマンドで実行できます。
#CRANE+ V2 の起動
$ ros2 launch crane_plus_commander crane_plus_control_rsp.launch.py
#challenge6.6 miniproject6.2
$ ros2 run crane_plus_commander challenge6_6_minipro6_2
#クライアントの作成
$ ros2 run crane_plus_commander test_client
#tf座標を追加
$ ros2 run tf2_ros static_transform_publisher 0.236 0 0.082 0 0 0 crane_plus_base ball
#RViz起動(airobot_wsは私が作成したROS 2のワークスペースです) $ rviz2 -d airobot_ws/install/crane_plus_description/share/crane_plus_description/launch/display.rviz
実行した様子はこちらです。
物体把持らしい動作が作れたので実際に物体を置き、tfを用いて物体の座標を登録しました。
物体の座標を登録できたら、微調整をして物体把持できるか挑戦してみました。
取れました!
細かい微調整をしていくにつれてロボットの動きが良くなるのは楽しかったです。
おわりに
今回は、ROS 2のアクション通信を利用するプログラムと他のノードから指令を受けて動作するサンプルプログラムをいくつか動かし、最後に物体把持のプログラムを作成しました。
書籍「ROS 2とPythonで作って学ぶAIロボット入門」の6章を短期間で勉強しましたが、順運動学と逆運動学は理解できましたが、tfはまだ頭の中で整理出来ていないため習得まで時間が掛かります…。
インターンシップを体験して、ロボット開発の楽しさを改めて教えてもらいました。
アールティの社員の皆さんは、ロボットの大会、学会、イベントで活躍していて、ロボットに対しての熱意がとてもすごいと実感しました!
私ももっと技術力を上げてたくさんのロボットを開発したいと思います!
貴重な体験をさせて頂きありがとうございました!