えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

誤家庭モータをROS1で回してみた(MAXON EPOS4)

2021/02/20更新:ROS2で動くパッケージを作成しました。

誤家庭モータをROS2で回してみた(EPOS4) - えいあーる・れいの技術日記


 ロボット製作者なら誰でも知っているMAXONモータ。性能も価格もぶっ飛んでいることで有名ですね。

 私は過去に技術奨学金を獲得したことがあり、その予算でMAXONモータと専用モータドライバ(EPOS4)を2セット購入しました。学生で自分で自由に使えるMAXONを持っているのは自分の強み(?)だと思っています。

 所持しているモータはRE35+GP32A+HEDL5540で、モータドライバはEPOS4です。モータセットが¥69000で、モータドライバが¥72,600…1セットだけで高コスパゲーミングPC組むだけの予算組めそう。

www.maxongroup.co.jp

 しかし、MAXONモータドライバは高額故に実装例があまりありません(Githubで検索してみてください)。いくつかのROS1向けのパッケージを探して使ってみたのですが、解説が全く無いこともあり動かず…

 そこで、自分でライブラリを編集してROS1向けにプログラムし直しました。残念ながら、このプログラムではオドメトリが取れません。

f:id:Ray_ar:20210205124608p:plain


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日程度で完成しました。ライブラリは自分の使いやすいように改造しているので、プログラムの追記もそんなに苦労しないと思います。

 プログラムはGithubリポジトリにあります。他の人のプログラムで動くならそのほうがいいと思います。私のプログラムは最終手段として使用してください。

  • ROSに依存しないEPOSプログラム

GitHub - Ar-Ray-code/EPOSx_2wheels: This program is for communicating and controlling two Maxon Motors (Motor Driver : EPOS4).

  • Twistを解析して2輪用のテキストを生成するROS1パッケージ

GitHub - Ar-Ray-code/twist_2wheel_pub: Subscribe Twist msgs and write text file for EPOSx_2wheels.

とりあえず「動く」ことは実現しました。機会があればROS2化やテキストを使わない通信を実現したいと思います。