はじめに
Rhinoceros+Grasshopperは、モデリングツールとしてだけでなく、プラグインや自作スクリプトを組み合わせることで構造解析や最適化といった高度な処理にも活用できます。
弊社のエンジニアも、業務の中でGrasshopperを魔改造して使っています。例えば、過去のTechblogでは耐震設計を行う、パズルを解くといった事例が紹介されています。(獺と鮪で行う木造住宅の耐震設計,弊社のパズル事情)
今回は、そうした取り組みの一環として、Grasshopper上のリンク機構を動かすと現実のリンク機構が追従して動くシステムを構築しました。
システム全体構成
本システムでは、以下の流れでGrasshopper 上のリンク機構と実機を連動させています。(図1)
- Grasshopperでリンク機構の姿勢を計算し、モータ角度を算出
- モータ角度をシリアル通信(UART)でマイコンに送信
- マイコン側で受信したデータを元にサーボモータへ指令を出力
- 指令に応じて実機が動作
今回は、マイコン(M5Stack Atom Lite[1]) + モータドライバ(Atomic Motion Base v1.2[2])を使って、サーボモータ(SG90)を動かしています。

Grasshopperからサーボモータを動かす
まずは、Grasshopperからサーボを動かしていきましょう。「Grasshopperとマイコンとの通信機能」、「マイコンからサーボモータを動かす機能」を作って、二つを繋げば実現できます。
「Grasshopperとマイコンとの通信機能」を実装していきます。Atom LiteはPCとUSBケーブルで接続するだけでUART通信[3]が可能なため、マイコン側の回路実装は不要です。PC側にターミナルソフト(例:Tera Term[4])があれば通信できます。Grasshopperには、Firefly[5]やSuperSerial[6] といった通信用のプラグインもありますが、今回は勉強もかねて、Grasshopper内で動作するPythonコンポーネントとして実装しました。文字列をSendに入力すると、その文字列をマイコン側へ送信できます。

マイコン側では、サーボドライバ(Atomic Motion Base)の公式サンプルを参考に、受信した文字列に応じてサーボモータを指定角度に動かすコードを用意しました。
これでGrasshopperからサーボモータを動かす準備が整いました。早速動かしてみましょう。
このように、Grasshopperのスライダの数字を動かすと、サーボモータがスライダの数字に対応して動くようになりました。後は、好きな機構を作れば、サーボモータで動かすことができますね。

Grasshopper上で5節リンクを作る
サーボの準備が整ったところで、リンク機構を作成していきます。
今回は、5本のリンクを5つの回転対偶で接続した2自由度平面5節リンクを作っていきます。
図4に示すように、根元側の2本のリンク角度を動かすことで、先端部(赤丸)を操作できます。この機構は、一組のモータ角度に対して「上側に折れ曲がる姿勢(上凸)」と「下側に折れ曲がる姿勢(下凸)」の2種類が生じるため、可動域をそれぞれ色分けして示しています。

先端位置に対して、各リンクの位置を解析的に解いていくことも可能ですが、今回は、Grasshopperに標準搭載されているKangaroo2[7]を使って、各リンクの節に対して幾何拘束を与えることで数値的に求めていきます。Kangaroo2を用いれば、各辺(リンク)と節(点)に対して長さと移動の拘束を与えることで、各辺と点の位置を動的緩和法で計算することができます。また、点をマウスで動かす拘束も与えることができます。
(※幾何拘束や数値的なリンク解析の仕組みに興味のある方は、弊社エンジニアが執筆した以下の記事もあわせて読んでいただければと思います。リンク機構を「解く」:連続最適化による機構設計入門 )
図5にGrasshopper上で動かせる5節リンクを示します。やはり、マウスでリンク機構を動かせるのはうれしいですね。5節リンクの姿勢を求められるようになったので、初期姿勢と変位後のリンクのなす角度から、マイコンに送るモータ角度も求めることができるようになりました。

また、せっかく弊社の記事なので、形状探索もやりましょう。
「リンク先端位置をなるべく広く丸い領域を動かすこと」を目的として、「リンク長さとサーボモータ初期角度」を設計変数として形状探索を行いました。サーボ可動域は、組付け時の調整分のマージンを取って、本来の可動域の180度から160度に狭めてあります。
- 変数:4本の可動リンクの長さ、サーボモータの初期角度(±180度)
- 目的:上凸姿勢で到達できる可動域に対し、その内部に収まる最大内接円の半径を最大化
- 制約:サーボモータの可動域160度、可動リンク4本の合計長さ≤250 mm、モータ軸間の距離=100 mm
Optuna(NSGA-III)を用いて最適化を行った結果を図6,7に示します。非対称なサーボ初期姿勢とリンク比形状によって、上凸姿勢での可動域を、広く、かつ丸く取ってくれる形状が実現できました。


Grasshopperと実機を繋いで動かす
これで必要な要素がそろったので、Grasshopper側の見た目も整えつつ、最適化結果を実機に反映し、Grasshopperと繋いで動かしてみました。
このように、PC画面上でリンク機構を動かすと、現実のリンク機構も追従して動いてくれます。リンクの先端をつかんで動かすことも、各関節をつかんで動かすこともできます。通常の逆運動学とはまた違った味わいがあってうれしいですね。

今回用いた技術を活用すれば、
- 好きなアクチュエータやセンサーをつけて、入出力を元にGrasshopper上で制御する
- 好きなソルバを組み込み、compliant mechanismや折り紙構造を動かす
など、まだまだ面白いものを作れそうです。
まとめ
本記事では、
- Grasshopperからサーボモータを動かす仕組みの構築
- Kangaroo2を使い5節リンクをGrasshopper上で実装
- 5節リンクのリンク長さと初期サーボ角度の形状探索
を行い、上記の要素をつなげて、現実世界の5節リンクをGrasshopper上から動かすシステムを構築しました。
最後までお読みいただきありがとうございました。

参考文献
[1] M5Stack,”Atom Lite 公式ドキュメント”
URL:https://docs.m5stack.com/ja/core/ATOM%20Lite(最終アクセス:2025/11/20)
[2] M5Stack,”Atomic Motion Base v1.2”
URL:https://docs.m5stack.com/ja/atom/Atomic_Motion_Base_v1.2(最終アクセス:2025/11/20)
[3] ルネサスエレクトロニクス(Renesas Electronics),”シリアル通信”
URL:https://www.renesas.com/ja/support/engineer-school/mcu-programming-peripherals-03-serial-communication(最終アクセス:2025/11/20)
[4] Tera Term Project,”teraterm”
URL:https://teratermproject.github.io/(最終アクセス:2025/11/20)
[5] Andy Payne,”Firefly|food4Rhino”
URL:https://www.food4rhino.com/en/app/firefly(最終アクセス:2025/11/20)
[6] Fabio D'Agnano,”SuperSerial|food4Rhino”
URL:https://www.food4rhino.com/en/app/superserial(最終アクセス:2025/11/20)
[7] Daniel Piker,”Kangaroo Physics Examples(GitHub Repository)”
URL:https://github.com/Dan-Piker/Kangaroo-examples(最終アクセス:2025/11/20)
