myCobotでほんとうにmoveitする


意味深なタイトル

先日、myCobotでmoveitするというタイトルで記事を投稿しました。とりあえず動かして、とりあえず記事投稿しましたが「本当にこれで合ってるの? なんか違う気がする」ともやもやと気になってました。moveitについて調べ、先人の記事を片っ端から読んでいくと、あれ?全然違う。。。恥ずかしい。。。

良かった点をあえて挙げると、myCobotの公式のリポジトリにはまだmoveit対応されたものがありませんので、記事投稿することで「moveitで動かせた」実績が残せたことに意味があったと思います(なんちゃってなんだけど)。

とういうわけで、moveitのお作法に正しく従ったパッケージを作成しました。

パッケージのリポジトリ

こちらに置きました。使用方法などはreadmeを読んでください。
nisshan-x / mycobot_moveit

作成の裏側

moveitのお作法にしたがって書いたら動きました。

・・・だと話しが終わってしまうので、「moveit対応していないロボットアームをどうやって対応させたか?」を自分なりに書いてみたいと思います。

前提条件

今回のmyCobotは以下の条件が整っていました。このおかげでmoveit対応ができました。
- ハードウェアインタフェースが用意されている。
- URDFで書かれた3Dモデルが用意されている
どちらも自分で対応するのは骨が折れますので、揃っててラッキーです。

手順1. URDFの書き直し

公式リポジトリにURDFと3Dモデル(Colladaフォーマット)が用意されていますが、これを使わずにURDFを書き直しました。Rvizで表示するだけなら良いのですが、Gazeboで表示できる書き方になっていないです。あと、公式のURDFはリンクとジョイントが混ざってて正直「あかんー」とおもいました(笑)

なお、なぜか公式のColladaファイル(dae拡張子)はGazeboで表示できませんでした。先にGazebo表示に成功したたいりょーくんのファイルを利用させていただきました。ありがとうございます!

手順2. moveitのsetup_assistant

URDFができたので、moveitのsetup_assistantを立ち上げて読み込みます。やり方はやはりmoveit公式のチュートリアルの通りです。前回なんちゃって対応だったので、今回は入念に読みました。

手順3. HardwareInterfaceの記述

moveitはHardwareInterfaceという実機を抽象化するコンセプトを取り入れており、それゆえに様々な会社のロボットアームやオリジナルアームを制御することができます。また、前述のGazeboといったPC内のシミュレータと実機が同じインタフェースで切り替えができるようになっています。

このHardwareInterfaceやros_controlの使い方がさっぱり理解できず、途方に暮れていたのですが、 @MoriKen さんの記事 Controller と HardwareInterface との間の処理の仕組み(1. ロボットモデルの定義と登録) のおかげでなんとか理解し、組むことができました。srcの下のコードを見ると分かるのですが、全部で100行にも満たないです。HardwareInterfaceさまさまです。

完成

ラズパイやAI本で有名なからあげさんが私のパッケージを使ってくださいました!!!
(しかもデバッグさせてしまった…)

最後に反省: 前回、なぜ間違えたのか?

myCobot公式のpythonスクリプトの中に、アームの関節の角度を指定して動かすROSノードがあります。このノードがjoint_stateをsubscribeしているのを見て「これでいいじゃん」と無理矢理合わせてmoveitを動かしてしまいました。joint_state は本来アームの状態を示すトピックなので「指示する用途には使ってはいけない」ですね。良く調べもせずに現物合わせで作ってはいけない、と反省です。

参考