2021/02/20更新:ROS2で動くパッケージを作成しました。
誤家庭モータをROS2で回してみた(EPOS4) - えいあーる・れいの技術日記
ロボット製作者なら誰でも知っているMAXONモータ。性能も価格もぶっ飛んでいることで有名ですね。
私は過去に技術奨学金を獲得したことがあり、その予算でMAXONモータと専用モータドライバ(EPOS4)を2セット購入しました。学生で自分で自由に使えるMAXONを持っているのは自分の強み(?)だと思っています。
所持しているモータはRE35+GP32A+HEDL5540で、モータドライバはEPOS4です。モータセットが¥69000で、モータドライバが¥72,600…1セットだけで高コスパゲーミングPC組むだけの予算組めそう。
しかし、MAXONモータドライバは高額故に実装例があまりありません(Githubで検索してみてください)。いくつかのROS1向けのパッケージを探して使ってみたのですが、解説が全く無いこともあり動かず…
そこで、自分でライブラリを編集してROS1向けにプログラムし直しました。残念ながら、このプログラムではオドメトリが取れません。
ROS1環境の罠?
MAXONモータにはWindows向けとLinux向けのAPIが提供されています。どちらもC++だったと思います。APIは、Definitions.hとlibEposCmd.soとlibftd2xx.so(シンボリックリンク)で構成されています。それらをCMakeLists.txtで-lEposCmdでリンク付けすることで使用可能になります。
しかし、-lEposCmdは、ROS1の環境を読み込むと必ずビルドが失敗してしまいます。この原因は私もよくわかっていません。
また、ROS1環境外でビルドしたプログラムをROS1環境で実行しても必ず失敗してしまいます。具体的には、EPOS4との通信開始が失敗しているようです。EPOSxドライバ自体は前からあったので、もしかしたら今の環境では動かないのかもしれません。これは、詳しいことが分かれば書くかもしれません。(誰得なのか)
原始的な方法を使う
ROS1環境のロードが禁止となるとROS1との通信は絶望的になります。ROS masterと通信ができなくなるからです。そこで、共通のファイルを編集→読み込み→編集→読み込み…を繰り返すことで通信をすることにしました。オドメトリを取ることはかなり難しくなってしまいますが、Realsense T265やVelodyne Lidarもあるので私はそれほど気にしませんでした。
実際のプログラムでは、1輪ごとにテキストファイルを指定し、fstreamを用いてrpmが記載されている1行目のみを読み取り、値の変化を検知したときにモータに対してコマンドを送信するようにしました。許しがたいアルゴリズムではありますが、実装時間は最小限にしたいと思っていたので妥協しました。
次にROS1側のプログラムです。ROS1側では、Twistメッセージを受け取ったらlinear.xとangular.zをもとに2輪それぞれの速度を算出し、速度の変化があれば、テキストを編集します。Twistの送信はキーボードやジョイスティックの情報を使えばいいと思います。
結果、MAXONモータプログラムを作ることを思い立ってから4日程度で完成しました。ライブラリは自分の使いやすいように改造しているので、プログラムの追記もそんなに苦労しないと思います。
やったぁぁあ❗
— Ar-Ray (@Ray255Ar) 2021年2月3日
ROSのTwistメッセージ受け取ってマクソンモータ回せたー😂
今月一日からまる三日苦労してプログラミングした甲斐があった pic.twitter.com/dbJxaG23gn
プログラムはGithubリポジトリにあります。他の人のプログラムで動くならそのほうがいいと思います。私のプログラムは最終手段として使用してください。
- ROSに依存しないEPOSプログラム
- Twistを解析して2輪用のテキストを生成するROS1パッケージ
GitHub - Ar-Ray-code/twist_2wheel_pub: Subscribe Twist msgs and write text file for EPOSx_2wheels.
とりあえず「動く」ことは実現しました。機会があればROS2化やテキストを使わない通信を実現したいと思います。