対向二輪の倒立振子型ｽﾀｯｸﾁｬﾝ[ﾀｲﾘﾝﾁｬﾝ]を作った話

**本稿は[ACCESS Advent Calendar 2024](https://qiita.com/advent-calendar/2024/access) 23日目の記事としてお送りします！**

## 緒言

こんばんは．昨夜寝落ちして遅刻しましたごめんなさい...先週はM5StackからDYNAMIXELサーボをを動かすためのツールについて書きました．今週はこれを作るきっかけになった車輪型倒立振子なｽﾀｯｸﾁｬﾝの開発について紹介しようと思います！

**注**
ｽﾀｯｸﾁｬﾝはししかわさんが開発したすーぱーかわいい手乗りロボットです．公式リポジトリはこちら: https://github.com/stack-chan/stack-chan

## ﾀｲﾘﾝﾁｬﾝの概要

ﾀｲﾘﾝﾁｬﾝは対向二輪型倒立振子をｽﾀｯｸﾁｬﾝのビジュアルで実現したロボットです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/5d9eee24-b345-c0bc-a7e0-026593713f64.png)

外観&各部の構成はこんな感じです．お顔はｽﾀｯｸﾁｬﾝベースに，大輪の花をイメージした髪飾りをつけています．

GitHubリポジトリはこちら: https://github.com/kim-xps12/bsl-balancer
部品リストも載せていますので，どなたでもお作りいただけますぜひ！


### 諸元
諸元はざっくり以下の通り．

- MPU: M5Stack Core2
- IMU: MPU6886 (included M5Stack)
- アクチュエータ: XL330-M077-T (DYNAMIXEL製シリアルサーボ)
- 電源: DC 4.5[V] @AAA Type x3
- フレーム: 3DP製, PLA+ (eSUN)

M5Stack Core2とDYNAMIXE+サーボ2個と単4電池を買ってきたら，ボディは3Dプリンタで印刷するだけで作れます．比較的お手軽！！3DPをお持ちでない方向けにボディの頒布も実施してみたいですね．

### 倒立振子とは？

一番イメージしやすいのは「手のひらの上にホウキを立ててバランスを取る遊び」でしょうか．あるいは二昔前くらいに話題になったセグウェイが浮かぶ方もいるかもしれません．

これらのように上手にバランスをとるように逆立ちした状態を制御によって実現するシステムのことを総じて倒立振子と呼んでいます．

## コンセプト

ﾀｲﾘﾝﾁｬﾝのコンセプトはずばり**安全 x 手軽 x かわいい**です．

### 安全
開発の動機としては，「制御工学を実機で手軽に学べる教材が欲しい！」と思ったのが始まりでした，私はもともと制御高額が専門でしたが，倒立振子を作ったことなかったな...と思い，せっかくなら電源を乾電池にして安全・安心な実機で作ろうと決めたのが始まりです．

### 手軽
ここは「何を以て手軽とするか」にもよりますが，ﾀｲﾘﾝﾁｬﾝは「できるだけ制御だけに専念できるように」を目標に据えました．手作りで倒立振子を作ろうとすると，メカの設計や組み立て時の微調整に振り回されがちなイメージ ~~(偏見)~~ があり，それもまた楽しさの一つではあると思いますが，今回はメカのことを気にせずに**色々な制御則を手軽に**楽しく学べるようなプラットフォームを目指しています．

これを実現するため，M5StackとDYNAMIXELで安定動作する機体に仕上げました．
両品とも高性能・高品質かつ安定供給されているのが魅力です．

また細かい機能のうちの1つですが，パラメータ調整も手軽に行いやすいようにM5Stack Core2のタッチパネルを活かして調整UIも実装しています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/7f28203f-5794-3d30-e2a9-a4144d0f9095.png)


### かわいい
かわいいは正義です．それ以上の理由はいりません．せっかく作るのなら可愛く仕上げたいじゃないですか．私の前作はｽﾈｰｸﾁｬﾝというヘビ型のｽﾀｯｸﾁｬﾝなのですが，引き続きその流れてｽﾀｯｸﾁｬﾝファミリーの1台として開発しました．これからも沢山のｽﾀｯｸﾁｬﾝが生まれたら嬉しいです．

## 主な構成部品

### M5Stack Core2
- M5Stack社が提供するESP32ベースの開発キット
- タッチパネル，IMU，バッテリを内蔵していて便利

### DYNAMIXEL XL330
- ROBOIRS社が提供するシリアルサーボ
- シリアル通信で角度や角速度を入力して使えて便利
- 4000円/個と（性能に対して比較的）安価

### オリジナルIF基板
- M5Stack Core2とDYNAMIXELを接続するための自作基板
- コンパクト＆省配線
- MITライセンスで公開中([GitHub](https://github.com/kim-xps12/m5stack_board_dynamixel_ttl_rs3485)）

## メカ設計

筐体部分はAutodesk社のFusionで設計しました（3Dモデルが公開されている既製品部分は除きます）．メインフレーム，車輪のマウンタ，トップカバーの3パーツですね．これらは3Dプリンタで印刷することを前提にできるだけ印刷しやすくなるようにデザインしています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/e7d6ff00-4b40-4bc2-41fc-0f142781bc2e.png)


## 制御手法

とりあえず実装が早いからの理由でPID制御を採用しています．PIDとはProportional-Integral-Differentialの頭文字を取ったもので，制御目標と現在の値の差分に対して，比例するゲイン，これの微分に対するゲイン，これの積分に対するゲインの3要素で次の制御入力を決める手法です．非常に実装が簡単で実践的なので様々な場所で用いられ，Parameter-wo-Iikanjini-Donikasuru 制御と呼ばれていたりもします．

ﾀｲﾘﾝﾁｬﾝでは現在のボディの角度に対してPIDをかけています．ゆくゆくはもっと賢い現代制御なども試してみたいです．

## 実装

実装にはM5StackのArduinoフレームワークの下回りであるFreeRTOSの機能を使っています．（Free)RTOSとはReal Time Operating Systemの頭文字をとったもので，命令実行の実時間性が重視されています．

制御のループは「短い周期で精度良く安定している」ことが理想的であり，これを実現するにはFreeRTOSの`vTaskDelayUntil`の機能がぴったりです．M5Stack Core2ではプロセッサのコアを2コア同時に使えるので，片方ではこの制御ループを，もう片方では顔や調整パネルのUI描画を担当するように割り振っています．

## オープンソース化

ﾀｲﾘﾝﾁｬﾝはメカ＋エレキ＋ソフトの全てをMITライセンスで丸っと公開しています．改変はもちろん，商用利用も再頒布もOKです．（再頒布時には一声かけていただけると心情的に嬉しいです！）ビジュアルのベースになっているｽﾀｯｸﾁｬﾝも「皆がユーザであり開発者である」というコンセプトのもとで全てオープンソースになっているのに倣いました．

他にも集合知でブラッシュアップされてより賢く育ったらいいなーとか，これまでの開発でたくさんのオープンソースプロジェクトや技術ブログに助けられて生きてきた御恩を少しでも世の中に還元したいなーとか，エンジニアの生存戦略としてのポートフォリオ的な側面とか，その辺の願いも込めています．

## 結言

本稿ではPID制御で動作する対向二輪型倒立振子ｽﾀｯｸﾁｬﾝことﾀｲﾘﾝﾁｬﾝの開発についてまとめてみました．興味を持っていただけた方，冬休みの工作にぜひいかがでしょうか！！

それでは．