1. Merry Christmas! そして運命の結果発表
メリークリスマス!
25日間にわたり、3次元倒立振子(Cubli)の製作記録(アドベントカレンダー)にお付き合いいただきありがとうございました。
PyBulletによるシミュレーション、STM32でのFOCドライバ自作、EKFによる姿勢推定、そして昨日のCLIツール……。
私はこの25日間で、現代制御と組込み技術の粋(すい)を集めた「最強の頭脳」と「最強の心臓」を一人で作り上げました。あとは、3Dプリンタで作った「肉体」にこれらを宿すだけ。
それでは、ご覧ください。
私の技術の全てを結集し、大地に立ったCubliの姿を!!
...
...
ごめんなさい!! 間に合いませんでした!!!!
「時間が足りない」
エンジニアが最も恐れる言葉が、クリスマスの朝に現実のものとなりました。
今日の記事は、輝かしい成功報告ではなく、「なぜハードウェアは難しいのか」 という屍(しかばね)を越えていくための、愛と反省の組立記録となります。
2. 25日間の軌跡:狂気のフルスタック開発(ソロ)
言い訳をする前に、私が駆け抜けたこの25日間を振り返らせてください。ただ作っただけではありません。「シミュレーションから実機への実装(Sim2Real)」 を見据えた、技術的な深掘りの記録です。
Phase 1 (Sim): 物理エンジン上でのロボット構築と学習
すべてはPCの中の仮想空間から始まりました。
- モデリング: Fusion 360で筐体をパラメトリック設計し、URDFとしてエクスポート。
- 制御理論の比較: PyBullet上で「PID制御」と「LQR(最適レギュレータ)」を実装し、さらに「深層強化学習(Deep RL)」による姿勢制御を行いました。
- Sim2Realへの布石: ノイズあり/なし環境での学習比較を行い、実機投入に向けたロバスト性を検証。
- 推論器の埋め込み: PyTorchの学習モデルを計算グラフを維持したまま ONNX形式 へ変換し、STマイクロの X-CUBE-AI を用いてマイコン上で動作する軽量かつ高速なCコードへ変換するフローを確立しました。
Phase 2 (HW): STM32G4による回路設計
シミュレーション上の脳波を受け止めるための、強靭な神経系を設計しました。
- MCU選定: 数学演算ユニット(CORDIC/FMAC)を持つ STM32G474 を採用し、計算負荷の高い制御演算に備えました。
- 基板設計: 3つのブラシレスモータを駆動するため、ノイズ対策を考慮した高密度なインバータ回路を設計・実装しました。
Phase 3 (Motor): 数学で回すFOC(ベクトル制御)
既存のライブラリを使わず、制御の根本から理解するためにドライバを自作しました。
- FOC実装: クラーク・パーク変換、SVPWM(空間ベクトル変調)をC言語で実装。
- 電流フィードバック: モータの電流値を100μs以下の周期でフィードバック制御し、指令通りのトルクを出力する「電子バネ」のような挙動を実現しました。
Phase 4 (Algo): 姿勢を知るためのEKF
ロボットが自分の傾きを知るための「三半規管」を作りました。
- センサフュージョン: 高性能IMU (ICM-42688) をSPI駆動し、加速度とジャイロの値を統合。
- 拡張カルマンフィルタ(EKF): 非線形な姿勢変化に対応するため、クォータニオンベースのEKFを実装し、ドリフトのない正確な角度推定を実現しました。
Phase 5 (Tools): 開発効率の魔改造
「コンパイル待ち時間」を撲滅するための環境構築です。
- デジタルツイン: Processingと連携し、実機の姿勢をPC画面上にリアルタイム同期。
- オレオレCLI: USB CDCによる高速通信を確立し、稼働中のマイコンに対してPIDゲイン等のパラメータを動的に書き換えるツールを自作しました。
ソフトとエレキの基礎は、間違いなく完成しました。
しかし、最後の**「メカ(筐体)」** と**「統合(インテグレーション)」** の壁が高かったのです。
3. 筐体組立:メカトロニクスの密度
それでは、昨日から徹夜で挑んだ組み立ての様子をご覧ください。
詰め込まれた「内臓」たち
3Dプリンタで出力したフレームに、モータドライバ基板とブラシレスモータを配置していきます。

どうですか、この密度!
FOCドライバ基板を3枚、立体的に配置する設計です。配線がスパゲッティになるのを防ぐため、最短経路で結線しています。ここから筐体の設計ミスが発覚していきます… ねじがうまくはまらない…
完成した姿(外観)
見た目は完全にCubliです。今にも起き上がりそうな風格があります。
しかし、この中には 「動かない理由」 が詰まっていました。
4. 発生した不具合:なぜ動かせないのか
組み立てて初めて分かる設計ミスが次々と露見しました。
① 「見えないネジ」問題
CAD上では完璧でも、現実には「ドライバー(工具)」が入るスペースが必要です。
私が設計した配置では、モータを固定するためのネジ穴に対し、他のパーツが邪魔をしてドライバーが物理的に入らない箇所がありました。
結果、一部のモータ固定が甘くなり、振動の原因となってしまいました。
② フレームとホイールの「擦れ」問題
これが致命的でした。
外枠のガードフレームを取り付けたところ、黄色のリアクションホイールとのクリアランス(隙間)が足りず、「シュルシュル」と擦れてしまいました。
FOC制御において、予期せぬ摩擦は天敵です。微細なトルク制御でバランスを取ろうとしているのに、物理的なブレーキがかかっていては制御不能です。
ヤスリで削って抵抗しましたが、スムーズに回転させるまでには至りませんでした。
③ 統合制御への時間不足
基板の基礎設計や、モータ単体のドライブ、センシングといった個別の「部品」は完成しています。
しかし、それらを複合させた 「統合制御システム」 として安定動作させるまでのチューニング時間が、どうしても足りませんでした。
5. 成功した点:慣性モーメント増大機構
もちろん、失敗ばかりではありません。会心の出来だったのがリアクションホイールの設計です。
倒立振子において、ホイールは「重ければいい」わけではなく、「回転中心から遠い場所に重さがある(慣性モーメントが大きい)」 ことが重要です。
そこで、3Dプリントした軽量なホイールの外周部に、六角ナットの形の穴を設計し、そこに金属製のナットとネジを埋め込みました。

これにより、プラスチックの軽さを保ちつつ、外周部に質量を集中させることに成功しました。手で回すと「ズッシリ」とした手応えがあり、強力な反作用トルクを生み出せそうです。
この「埋め込みウェイト機構」は、確実に機能しています。
6. 私の戦いはこれからだ! 〜Sim2Realへの道〜
というわけで、アドベントカレンダー最終日のCubliは**「物理的には存在しているが、まだ産声を上げていない」**状態となりました。
しかし、ここで終わるわけにはいきません。
なぜなら、私の本当のゴールは「ただ立たせること」ではないからです。
「Phase 1で作った機械学習モデルで、実機を制御する」
Day 7でPyBulletの中で育てた「転ばないAI」。彼をこの現実世界(Real)の筐体に宿すことこそが、このプロジェクトの真の終着点です。
そのために、ONNX変換やX-CUBE-AIのフローを確立し、あえてハイスペックなSTM32を選んできたのです。すべては、AIを受け入れるための「最強の肉体」を作るための布石でした。
- 回路設計: ノイズ耐性を強化し、AIの計算を邪魔しないクリーンな信号へ。
- 筐体設計: メンテナンス性を高め、何度でも実験できる構造へ。
これらを修正し、まずはPIDで立たせ、そして最終的にはニューラルネットワークによる制御で、このCubliを大地に立たせてみせます。
アドベントカレンダーは完結しますが、開発は続きます!
今後の進捗(リベンジとSim2Realへの道)は、引き続きQiitaで記事としてアップしていく予定です。
いつか必ず、「AIが実機で立ったぞーー!!」という報告記事を書きますので、その時まで待っていてください。
25日間、本当にありがとうございました!
Sim2Real(シミュレーションから現実へ) を成し遂げるその日まで、私の戦いはこれからだ!!
(Fin... and to be continued to Sim2Real!)
あとがき:25日間を走り抜けて
最後に、個人的な振り返りを少しだけ。
正直なところ、この25日間は毎日の進捗と記事更新に追われる、まさに 「自転車操業」 の日々でした(笑)。
予定通りにいかないことの方が多く、毎晩冷や汗をかきながらキーボードを叩いていました。
しかし、そのプレッシャーがあったからこそ、毎日必死に手を動かし、新しい知識を吸収し続けることができました。これほど濃密に、そして「がっつり」とモノづくりに没頭したのは久しぶりで、心から 「開発って楽しい!」 と感じられる1ヶ月でした。
未完成のCubliですが、ここまでの試行錯誤の記録(ログ)が、同じように制御やロボット制作に挑む誰かの役に、少しでも立てば幸いです。
ここまで読んでいただき、本当にありがとうございました!
アドベントカレンダー参加中
STM32×AIで「3軸倒立振子」を作る25日間(ひとりアドカレ)Advent Calendar 2025


