皆様こんにちは、21-ibukiです。今回はキャチロボ2025に出場した機体の紹介をします。

はじめに
今回のロボットは主に私(21-ibuki)とMaquinistaの21代のリーダーを務めていた21-horieで作りました。
ハード周り(機械設計・電装・低レイヤーの制御系の実装)は21-ibukiが、ソフト周り(ROS2連携・UI製作・シミュレーション)は21-horieが担当しています。ソフト担当が優秀すぎて直前期にはかなり助けになりました(ありがてぇ~。)他にもフィールド作成等で2名ほどのお手伝い要員を含めて計4人で大会に参加してきました!
今回キャチロボへの参加に至った経緯は……
「かっこいいロボット作りたい!」からです。
結構これは私のエゴが強くて、機体の写真を見てもらえば分かると思いますが無駄な(?)こだわりがいっぱいあります。ほかのメンバーはどっちかというとそれに振り回された感じになっていて少しは申し訳ないと思っています(いや、思ってないか。)
そういう経緯があるので今回のロボットの製作費は全額私負担です!割り勘とかにしても後々めんどくさいですもんね~。なのでこのブログも書きたいように書かせてもらいます!
ルール紹介
といっても正直、公式のホームページ見てもらった方が分かりやすいと思います。
ワークは「プチアソート」でアソートを持って運ぶ競技です!(キャチロボだからそれはそう)
ボーナスが少し難しくて、アソートの向き(表裏)に指定があるのでそこが難しいポイントになるみたいです。ちなみに私のチームはボーナスなんて狙ってなかったのでそんなこと全然意識してませんでした(は?)

機体外観

※これはエンドエフェクタなしバージョンです。
キモイですね~
ここ数年のキャチロボの動画とかを見てきましたが、パラレルリンクを使った構造のロボットってほとんどないんです。シリアルリンク系のロボットはちょこちょこあるんですけどね。キャチロボに出る大半のロボットがrθ、xy系です。
この外観から会場でもちょっと注目集めれたのは嬉しかったです。
パラレルリンクのロボットにしたことで最長辺が(最長リーチ長)/2になったので運搬の負担が軽くてすごく助かりました。特に東京から京都まで行くとなると輸送が問題になりがちだと先駆者から聞いていたので。実際の輸送は、ロボットをスーツケースに入れて夜行バスのトランクルームで運んできました(激安運搬できてお財布に優しい!)

(持って行った荷物はこれだけ)
以降の項目ではそれぞれの機構について詳しく解説していきます。
五節リンク
このロボットの最も大きな特徴というべきクソデカ五節リンク。
各節がφ10mm、長さ500mmのカーボンパイプで作られてるので一番伸ばした状態でリーチが1m程度あります。カーボンの加工は出来ない(というより粉塵が危ない)のでカーボンパイプの固定部分は3Dプリント部品でクランプしてます。材質は靭性が欲しかったのでASA使ってます。polymakerのオレンジ色いい感じ。
中間の節にあたる部分にはミスミで買える適当なSUS304の軸をぶっさして、ベアリングで関節にしてます。五節リンクで問題になりがちな臨界点に来ないようにトーションばねで関節部分を外向きに押してます。

で、五節リンクの問題点としてリンク長が長くなっちゃうことがあるんですよね。なので根元にかかるトルクがえぐいことになってます。
だからこれまでパラレルリンクのロボットが少なかったのかなと思いつつ……。
そういうことなので関節部分のASAの3Dプリント部品が結構な頻度で割れて交換が必要になるんですよね。大会当日も2,3回壊れてて、試合時には直前まで五節リンクを付けないでセッティングタイムに取り付ける形にしてました(おかげで試合に壊れることはなかったです)
根元の駆動部分にはSteadywinのGIM8108-8というQDDモーターを使ってます。詳しい話はここではしませんが、こいつは内部の駆動がOdriveなので制御するのが簡単で嬉しい!アブソリュートエンコーダも内蔵してる(やつを買った)ので毎回原点取ったりしなくて済むのはいいですね。ちなみに最大トルクは22Nmで、値段はaliexpressで1.6万くらいだったと思います。
ピッチ&ヨー
五節リンクならヨー軸周りの自由度いらなくねと言われそうですが、キャチロボのルール的にヨー軸が回転できないとシューティングエリアまで到達できません。なのでヨー軸の自由度もついてます。
ヨー軸の回転に使うのはみんな大好きDJIのm2006です。いわゆるロボマスモーターですね!
ヨー軸は内歯車を使って駆動してます。絶対角は軸中心についたas5600の磁気エンコーダーで取ってます。ここの制御系はROSで組んでるそうです(詳しいことは知らん。)なので制御周期がちょっと遅い(けどそんなに問題にはならなかった。)

ピッチ軸もロボマスモーターで駆動してます。
駆動方法としてはウォームギヤを用いて思いっきり持ち上げるって感じです。ウォームを使ってるので電源落としても自由落下しないのはいいポイントなんですけど、バックドライブしないからモーターの尻側に手で回すハンドルをつけてます。
ここはリミットスイッチで原点取ってピッチ角を推定してます。(再現性が微妙とか言わない)

でここ最近ロボマスモーター買った人ならわかると思いますが、ここで大きな問題に直面しました。
c610(m2006用のドライバ)がない!
そうなんです。c610がなぜか全世界から消えました。
ちなみに私は日本の倉庫にあった最後の一個を買ってます(3つ買おうとしたら1個しかないよ、って言われてそれ買ってから在庫復活してません。)
え、じゃあどうするのってことですけど我々と縁の深いMaquinistaの方からc610を貸してもらいました。
ありがとー!
ということでとりあえず事なきを得ました。
エンドエフェクタ
しれっと設計に苦労したのがエンドエフェクタ。
何が難しいって、ワークをとるハンドのど真ん中にカメラを配置してワークとかの認識をしようと考えていたから。使ってるのは普通のUSBカメラなんですけど、意外とサイズが大きくてこいつを配置するのが結構な難問でした。

こいつがその外観。
ハンドの開閉にはカムを使ってカムを駆動するモーターからは傘歯車を使って力を伝達してます。超ギリギリモーターとカメラが接していないこの設計、かなり痺れました!

(薄い水色のやつがUSBカメラです)
ちなみにカメラからの画像はこんな感じ。

残りの自由度はピッチとヨー。この二つはいろいろあって本番では取り外されました(思ったより重くて五節リンクがトルクに耐えられなかったため。)
ちなみに使ってるモーターはすべてfeetech sts3215の12Vバージョンです。
先端のワークを照らすためについてるLEDは秋月で売ってた12V駆動のLEDバーです。ちょうどいい感じのサイズで12Vのやつが売っていてビビりました。(これのために作ってくれたの⁉)
そういうことなので、何とエンドエフェクタに行く配線はUSB+3芯のロボットケーブルだけです!スッキリしててGood!
電装系
低レイヤー側の制御はM5stack + commu moduleでやってます。この構成でCANが吐けるので使いやすくていいですね。ただ、M5stackのCANを使うときにいろいろ制約があってその辺は苦労したけど(この話もどっかのQiitaでそのうちします。)
弱電系の配線はほとんど自作してます。千石で買ってきたシールド付きのロボットケーブルをたくさん圧着して配線作りました。なかなか骨の折れる作業だったけど、統一感のあるかっこいい見た目になったので苦労した甲斐はあったのかな~と。
自作してる基板は強電とCANのハブだけです。強電のハブはデタッチャブルにして任意の長さにできるようにしてみました。要らん機能だっけけど。
他の基板も自作予定だったんですけど、電気担当が途中で消えてしまったので結局既製品で作ってます。来年は私が作ってみようかな。

制御
制御を担当した堀江です。やったことは
- ROS2を使った制御
- GUIの作成
- 本番の操縦
各項目について簡単に説明します。
ROS2を使った制御
MaquinistaでROS2 とros2_controlを使用していたこともあったので、キャチロボでも同じ構成にしました。
実際に完成したrqt_graphはこんな感じでした。

字が小さくてすいません…
作成したノードは
- 目標位置から各モータの角度を計算するノード(https://github.com/SameSameIndustry/arm_move)
- カメライメージを処理して誤差修正するノード
カメラの方は時間がなくて完成しなかったので本番では使いませんでした。
ros2_control関連は
- Hardware Componentは各モータの角度をM5Stackにシリアルで流すものを作成(https://github.com/SameSameIndustry/m5_hardware)
- Controllersはros2_controlが用意しているPID ControllerとPosition Controllerを使用
c610は電流入力しか受け付けないのでPID Controllerを組み合わせて位置と速度のカスケード制御にしました。
制御周期は40Hzとなかなか遅く設定しました。c610のエンコーダーの値が飛ぶとかの問題があったのでかなり遅くしていました。
後悔としては各モータの動きを単に目標の回転角を決めるのではなく、時間と目標角度を合わせた軌道を決定してJointTrajectoryControllerで制御すればより美しい動きができるのだなと思いました。
GUI
今回5節リンクを制御するということなので、モーターの角度を操縦して行うのは無理だったので目標位置からモーターの角度を決めることにしました。PS4コントローラーとかで目標位置を十字キーで動かすとかでもよかったんですけど、なんか面白くなかったのでGUI作ることにしました。
実際に作ったGUIはこちらです。

最初はAndroidStudioで作ろうと思ったんですけど、Android端末を自分が持っていなかったので、iPadでも操作できるように、Webで作成しました。
アピールポイントは
- ワークの場所をタッチすることでその位置にロボットが動くこと
- 構成をフロントにReact、バックエンドにGoを使用
です。
ROS2を使用している場合のWebコンはros-bridge-suite
を使用するのが主流かと思いますが、Goを触ってみたいと考え今回はこのような構成にしました。正直この構成にしたメリットは何も感じませんでした。まぁ選択肢の一つとしてはありかも…
Goを使ってros2とのネットワークをするためにrclgoを使いました。今回はノード作成(web_app_backendの名前で作成)とtopicのpub,subしかしてないのでserviceやactionなどの他の機能が使えるかはわからないです。たぶんできると思います。
今回作成したリポジトリはcatchrobo_appです。コードはほとんどAIに書かせましたが、大きな問題はなさそうでした。
大会時はPCとiPadを有線LANでつないでiPad側でWebGUIを操作しました。ros2 のtopicを投げてくれだけですが、問題なく動作してくれました。
その他
シミュレーションはunityを使用して各モータの角度の計算が合っているかや、試合を想定した動きを練習できるようにしたいという考えました。ROS2とのやり取りはros2-for-unityを使用しました。結局、時間がなくて断念しました。
リポジトリは
- unity環境catchrobo_sim
- unity用のHardware Component unity_hardware
unity用のHardware Componentの正しい作り方はわからなかったので、中でノードを作ってtopicのpub subしてます。
シミュレーション環境はこんな感じでした。

結果報告
ということで大会結果ですが、もちろんこんな強くもないロボットを作ってるので予選敗退でした。一応、予選で1点は取ったので当初の目標「大会で思い通りに動くこと」は達成しました。
ただ、逆にここまでこだわりまくったロボットを作ったためか、エキシビジョンに出れることになりました。
エキシビジョンでは点が取れませんでしたが、クソデカパラレルリンクが動く姿を披露出来てよかったです!
ということで

審査員特別賞をいただきました!
うれしい!!!
審査員特別賞ということで賞金5万円を参加費3万円に加えて頂きました。
ロボット製作費が大体10万ちょいなので案外元を取れそうですね。でも、今年のホテルが高かったうえに4泊もしてるので大赤字なのは変わらずです。(ひと夏の思い出としては安かったです!)

これはプリンスホテルでロボマスの音を鳴らしながらデバッグしている様子。
最後に
今回は初めてのキャチロボでしたがいろいろとやりたいことができて結構楽しかったです。
来年も21-horieと機会があればもっともっとキモイロボット作って戻って来たいと思っています。センシング系もちゃんと構築して、完全自動とかが本当は五節リンクの本領を発揮できる場面だと思っているので。
来月、本学大岡山キャンパスで開催予定の工大祭でもこのロボット(のアップグレード版)を動かす予定なのでお時間がある方はぜひ見に来てください!操縦体験もする予定です(by 制御やってる人)

このデタッチャブルなパソコン置き場の設計は結構好きだった。