- はじめに — サーボ6個で作った腕が自重で崩れます
- リンク、ジョイント、エンドエフェクタ — 3つの単語の正確な意味
- 自由度が実際に意味するものと6が基準である理由
- 回転ジョイントと直動ジョイント
- 関節を実際に動かすもの — サーボ、ステッパー、BLDC
- 減速機 — ギア比がトルクとバックラッシュにすること
- 静的トルクを数字で求める — 肩が手首より大きい理由
- 締めくくり — 腕の形はトルク計算の結果です
はじめに — サーボ6個で作った腕が自重で崩れます
ロボットアームを作ろうと決めて部品を買います。検索するともっともよく出てくる組み合わせがあります。MG996Rサーボ6個、アクリルか3Dプリントのブラケット、5V電源。
組み立てます。電源を入れます。サーボたちが自分の位置を見つけて動きます。
腕を水平に伸ばすよう命令します。肩がぶるぶる震えながら少しずつ下がります。サーボは音を出し続けているのに腕は上がりません。何かをつかめと命令すると、まるごと崩れ落ちます。
コードの問題ではありません。電源の問題でもありません。肩関節に必要なトルクがそのサーボが出せる値の1.66倍だからです。
この数字は後で自分で計算します。今重要なのは、この計算が部品を買う前に紙の上で終えられたという点です。腕の長さと持ち上げたい物の重ささえ決めれば、各関節が要求するトルクが出て、その値をデータシートと比較すればよいのです。
この記事はその計算に必要なものを扱います。ロボットアームが何でできているか、自由度が実際に何を数えているか、関節を回す3つの方法がそれぞれ何を得意とし何を苦手とするか、減速機が何を与え何を奪うか。そして最後にそのトルク計算を最初から最後まで行います。
リンク、ジョイント、エンドエフェクタ — 3つの単語の正確な意味
まず用語を正確にしておきます。この3つの単語の定義が、後に出てくるすべての計算の基礎になります。
リンクは変形しない剛体部材です。ロボットアームでは関節と関節をつなぐ構造物です。人の腕でいえば上腕骨と前腕骨です。運動学でリンクを剛体と仮定するのは計算のためであり、実物がたわむ分だけ誤差になります。
ジョイントは2つのリンクをつなぎながら、その間に相対運動を許す要素です。どんな運動を許すかがジョイントの種類を決めます。
エンドエフェクタは腕の一番先に付いて実際に作業を行う装置です。グリッパー、吸着パッド、溶接トーチ、カメラ。運動学の計算で「手先の位置」というとき、その手先はエンドエフェクタに定めた基準点で、これを工具中心点と呼びます。
ここにベースを加えると構造が完成します。ベースから始まり、リンクとジョイントが交互に続き、エンドエフェクタで終わる鎖です。枝分かれせず一列につながるこの構造を開いた運動連鎖と呼び、産業用ロボットアームの大多数がこの形です。
閉じた連鎖もあります。デルタロボットのように複数の枝が先端で再び合流する構造で、剛性と速度で有利な代わりに作業空間が狭く運動学がずっと複雑になります。この記事は開いた連鎖だけを扱います。
ひとつ慣例があります。リンクとジョイントに番号を振るとき、ベースから始めて外側へ数えます。 ベースがリンク0、最初の関節がジョイント1、その次がリンク1です。こうすると関節iがリンクi-1とリンクiをつなぎます。順運動学編の変換行列の添字はこの規則にそのまま従います。
自由度が実際に意味するものと6が基準である理由
自由度は独立して指定できる運動変数の個数です。ロボットアームではたいてい関節の個数と同じです。
なぜ6が基準なのかは目標側から数えると明確になります。3次元空間で剛体ひとつの状態を完全に指定するには、いくつの数が必要でしょうか。
位置に3つ必要です。x、y、z。
姿勢にも3つ必要です。物体をその場に固定したままでも、3つの軸のまわりに独立に回せるからです。
合わせて6つです。だからエンドエフェクタを任意の位置に、任意の向きで置くには関節が最低6つ必要です。
この数字を基準にロボットアームは3つの部類に分かれます。
| 自由度 | 名称 | できること | 例 |
|---|---|---|---|
| 6未満 | 劣駆動 | 位置か姿勢の一部しか指定できない | SCARA(4)、デルタ(3)、趣味用5軸腕 |
| 6 | 完全駆動 | 作業空間内で任意の位置と姿勢 | ほとんどの産業用ロボット |
| 7以上 | 冗長駆動 | 同じ手先の姿勢を複数の腕の形で実現できる | 多くの協働ロボット、人の腕 |
劣駆動が悪いという意味ではありません。SCARAは4自由度ですが、基板に部品を挿す作業では部品が垂直に降りさえすればよいので、残りの自由度は必要ありません。自由度を減らした代わりにずっと速く、強く、安いです。必要な分だけ持つことが設計であり、6は上限ではなく基準点です。
冗長駆動が与えるのは手先を固定したまま腕の形を変える能力です。手を机の上の一点に付けたまま肘を上下に動かしてみると、すぐに感じられます。この余裕を障害物回避や関節限界の回避に使うことができ、その数学が逆運動学編の零空間です。
趣味用の腕でよく見る5自由度は中途半端な位置です。手首の回転軸がひとつ欠けているので、物体を特定の向きでつかまなければならない作業で急に届かない姿勢が生じます。位置は合わせられるのに姿勢が合わない状況で、プログラムを組んでいると必ず出会います。
回転ジョイントと直動ジョイント
実際のロボットアームで使われるジョイントは事実上2種類です。
回転ジョイントはひとつの軸のまわりに回ります。関節変数は角度です。人の肘と肩がこれで、産業用ロボットアームの関節はほとんど全部回転ジョイントです。
直動ジョイントはひとつの軸に沿って滑ります。関節変数は長さです。3Dプリンターの各軸、ガントリーロボット、SCARAのz軸がこれです。
2つの違いは性能曲線の形に表れます。
| 基準 | 回転ジョイント | 直動ジョイント |
|---|---|---|
| 関節変数 | 角度 | 距離 |
| 作業空間対設置面積 | 広い | 狭い |
| 剛性 | リンクが長いほど急減 | おおむね均一 |
| 精度 | リンクの先端に行くほど誤差増幅 | 位置に関係なく均一 |
| 負荷によるトルク変化 | 姿勢によって大きく変わる | おおむね一定 |
| 運動学 | 三角関数、解が複数 | おおむね線形、解がひとつ |
| 密閉と清潔さ | 容易 | レールが露出していて難しい |
4行目がロボットアームで回転ジョイントが生む固有の問題です。関節の角度誤差はリンクの長さに比例して手先位置の誤差に増幅されます。肩関節が0.1度ずれると、0.35メートル離れた手先では、
0.1度 = 0.001745 rad
0.001745 × 0.35 m = 0.000611 m = 0.61 mm
0.61ミリメートルです。そしてこの誤差は肩に近い関節ほど大きく増幅されます。ベース側の関節の精度が手先の精度を支配します。 後で出てくる減速機の話で肩側に高価な減速機を使う理由もここにあります。
国際標準URDFでは運動学がジョイントタイプの文字列で表現され、使える値は正確に6つです。revolute(範囲制限のある回転)、continuous(無限回転)、prismatic(直動)、fixed(固定)、floating(6自由度)、planar(平面3自由度)。最初の3つが実際の駆動関節で、fixedは計算上フレームをもうひとつ置きたいときに使います。
関節を実際に動かすもの — サーボ、ステッパー、BLDC
いよいよ本題です。関節が回転することは分かりましたが、何がそれを回すのでしょうか。
RCサーボ — 角度を指令すれば勝手に行きます
趣味用ロボットアームで圧倒的によく使われます。中にDCモーター、減速ギア、位置センサー、そして制御回路が全部入っています。外部からは目標角度だけを与えればよく、その角度へ行くことはサーボ内部の閉ループが勝手にやってくれます。
指令はPWMパルスの幅で伝えます。標準的な慣例はおよそ20ミリ秒ごとにパルスをひとつ送るもので、幅が1ミリ秒なら片方の端、1.5ミリ秒なら中立、2ミリ秒なら反対側の端です。更新周期は寛容で、40Hzから200Hzの間ならだいたい動作します。
ここで2つ注意すべき点があります。
第一に、パルス幅の範囲はメーカーとモデルごとに違います。 広く使われるSG90の場合、流通会社の資料には500から2400マイクロ秒と書かれていますが、メーカーであるTowerPro自身はパルス幅の規格を公表していません。1000から2000マイクロ秒だけを使うと可動範囲の半分程度しか使わないことになります。実際の範囲はサーボを少しずつ動かしながら探す必要があります。
第二に、一般的なPWM出力では解像度がまったく足りません。 ArduinoのanalogWrite()は8ビットで20ミリ秒周期を256等分しますが、
20000 μs / 256 = 78.125 μs
1段階が78マイクロ秒です。1000から2000マイクロ秒が180度に対応するなら1度が5.56マイクロ秒なので、
78.125 μs / 5.56 μs = 14.06度
1段階が14度です。角度を14度単位でしか指定できないという意味です。だからサーボはanalogWrite()ではなく専用ライブラリで駆動します。ArduinoのServoライブラリはタイマーを直接つかんでマイクロ秒単位の幅を作ります。
#include <Servo.h>
// サーボの電源は必ず別に供給し、GNDだけボードと束ねます。
// 理由は下の「電源」節で計算して確認します。
Servo shoulder;
const int SERVO_PIN = 9;
const int PULSE_MIN = 600; // この2つの値はモデルごとに違います。
const int PULSE_MAX = 2400; // 少しずつ狭めながら実際の限界を探してください。
void setup() {
// attachに最小・最大パルス幅を一緒に与えると、write(角度)がその範囲に写像されます。
shoulder.attach(SERVO_PIN, PULSE_MIN, PULSE_MAX);
shoulder.writeMicroseconds(1500); // 中立から始めます
delay(500);
}
void loop() {
// write(度)よりwriteMicroseconds(マイクロ秒)のほうが解像度が高いです。
// 1ステップを20usにすると角度ではおよそ2度で、それだけなめらかです。
for (int us = 1000; us <= 2000; us += 20) {
shoulder.writeMicroseconds(us);
delay(20); // 更新周期に合わせます
}
for (int us = 2000; us >= 1000; us -= 20) {
shoulder.writeMicroseconds(us);
delay(20);
}
}
RCサーボの限界は明確です。現在の角度を読めず、トルクを指令できず、どれだけ力を出しているか分かりません。命令を送って到着したはずだと信じることがすべてです。負荷がかかって行けなかったとしても知る方法がありません。
この限界を解決したのがスマートサーボです。ROBOTISのダイナミクセル系列が代表的で、シリアルバスで複数個をデイジーチェーンでつなぎ、各サーボの現在位置、速度、負荷、温度を読めます。メーカー資料によるとAX-12Aは12Vでストールトルク1.5 N·m、位置分解能0.29度(300度の範囲を1024分割)です。上位のX系列は分解能が1回転あたり4096まで上がり、XM430-W350-Rは11.1Vで3.8 N·mを出します。このモデルには電流ベースの位置制御モードがあり、「この力以上は押すな」という指令が可能です。
ステッパーモーター — 数えて行くが、着いたかどうかは分かりません
ステッパーはコイルを順番に励磁して回転子を1ステップずつ引っ張っていきます。位置センサーがなくてもステップ数を数えれば角度が分かる仕組みです。
もっとも一般的なNEMA 17規格のステップ角は1.8度で、1回転は200ステップです。この値をそのまま使うと関節ひとつの分解能が1.8度になり、腕の長さ0.35メートルでの手先誤差に換算すると、
1.8度 = 0.031416 rad
0.031416 × 0.35 = 0.011 m = 11.0 mm
11ミリメートルです。ロボットアームとして使うにはとても足りません。だからマイクロステッピングを使います。コイル電流を階段状ではなくサイン波近似で流し、ステップの間を分割する技法です。
| ドライバ | 最大マイクロステップ | 1回転のステップ数 | ステップあたりの角度 | 0.35mでの手先移動 |
|---|---|---|---|---|
| なし(フルステップ) | 1/1 | 200 | 1.8度 | 11.00 mm |
| A4988 | 1/16 | 3200 | 0.1125度 | 0.687 mm |
| DRV8825 | 1/32 | 6400 | 0.0563度 | 0.344 mm |
| TMC2209 | 1/256 | 51200 | 0.0070度 | 0.043 mm |
TMC2209の1/256はMicroPlyerという補間機能で作られ、ピンで直接選べる値は8、16、32、64です。
ここで必ず知っておくべきことがあります。マイクロステッピングは分解能を上げるのであって、精度を上げるのではありません。 ステップを細かく分けるほど各微小ステップで出る保持トルクが小さくなり、静止摩擦や負荷トルクがそれより大きければ回転子は実際には動きません。指令上は1/256ステップずつ進んでいますが、物理的には数ステップごとに一度カクッと飛ぶ状況が生まれます。
そしてステッパーには根本的な危険である脱調があります。
ステッパーは開ループです。回転子が固定子の磁場に追従していると仮定するだけで、確認しません。この同期が崩れる条件は3つあります。
ひとつ、負荷トルクがその速度で出せるトルクを超えるときです。ステッパーのトルクは速度によって急激に落ちるので、静止状態の保持トルクだけを見て選んではいけません。メーカー資料ではトルク・速度曲線に30パーセントの余裕を持たせるよう勧めています。
ふたつ、加速が急すぎるときです。回転子と負荷の慣性が要求するトルクが瞬間的に超過します。
みっつ、低周波共振です。おおよそ毎分50から150回転の区間、毎秒167から500フルステップに相当する領域で、回転子が回転振り子のように鳴って有効トルクが抜けます。他の速度では問題ないのに特定の速度帯だけステップを失うなら、これです。
脱調が怖いのは静かだからです。 10ステップ失ってもドライバは何も言わず、制御器は依然として自分が知っている角度を信じ続けます。その誤差は原点復帰をするまで永久に残ります。ロボットアームでこれは関節角度が実際と違うという意味で、順運動学が計算する手先位置がすべて間違っているという意味です。
参考までに、よく使われる17HS4401Sのメーカー規格は保持トルク43 N·cm、相電流1.7Aです。0.43 N·mで、後で計算する肩関節が要求するトルクの4分の1にも届きません。減速なしで直結してはいけないということです。
BLDCとエンコーダ — 本物の閉ループ
性能の上限が欲しければブラシレスモーターにエンコーダを付けて直接制御します。協働ロボットと最近の高性能な趣味用腕がこの方向です。
BLDCはブラシがないので摩耗がなく、同じサイズならブラシモーターよりトルク密度が高く、冷却も有利です。代わりに回転子の位置が分からないとコイルをいつ励磁するか決められないので、位置センサーが必須です。
位置センサーには磁気式ロータリーエンコーダが広く使われます。軸の先端に小さな磁石を付け、チップが磁場の方向を読みます。
| 部品 | 分解能 | 1回転の分割数 | 角度 | 0.35m手先換算 |
|---|---|---|---|---|
| AS5600 | 12ビット | 4096 | 0.0879度 | 0.537 mm |
| AS5047P | 14ビット | 16384 | 0.0220度 | 0.134 mm |
| ダイナミクセルAX-12A | 1024分割/300度 | 1024 | 0.2930度 | 1.790 mm |
| ダイナミクセルX系列 | 4096パルス/回転 | 4096 | 0.0879度 | 0.537 mm |
AS5047Pは毎分28000回転まで対応し、ABI増分出力でバイナリモード基準1回転4096ステップを出します。
BLDCをきちんと回す方法がベクトル制御です。3相電流をそのまま扱う代わりに2回の座標変換を経ます。クラーク変換が3相を固定2軸に移し、パーク変換がそれを回転子と一緒に回る座標系に移します。この座標系では電流が直流量になり、普通のPI制御器で扱えるようになり、2つの成分の役割が分離します。d軸電流が磁束を、q軸電流がトルクを作ります。 だからトルクを直接指令できます。
趣味の領域ではSimpleFOCライブラリがこの仕事をしてくれます。2026年2月に出たv2.4.0基準でAVR、STM32、ESP32、Teensy、RP2040など幅広いボードに対応し、ドキュメントでは電流センシングまで考えるとSTM32系を勧めています。
3方式をまとめるとこうです。
| 基準 | RCサーボ | ステッパー | BLDC+エンコーダ |
|---|---|---|---|
| 制御ループ | 内蔵閉ループ | 開ループ | 自前で組んだ閉ループ |
| 指令するもの | 角度 | ステップ数 | 電流、速度、位置のうち選択 |
| 現在角度の読み取り | 不可(スマートサーボは可能) | 不可 | 可能 |
| トルク制御 | 不可 | 不可 | 可能 |
| 静かな失敗 | 着いたか分からない | 脱調が分からない | 誤差が即座に現れる |
| 配線の難易度 | 3線 | 4線+ドライバ | 3相+エンコーダ+ドライバ |
| 入門の難易度 | もっとも易しい | 中間 | もっとも難しい |
| 減速機 | 大抵内蔵 | 別途 | 別途 |
減速機 — ギア比がトルクとバックラッシュにすること
モーターを選んだだけでは終わりません。ロボットアームの関節はほとんど減速機を通して駆動されます。理由は3つあり、3つ目がもっとも重要なのにあまり語られません。
ギア比をNとします。
第一に、トルクがN倍大きくなります。 正確には機械効率ηを掛けた値です。
出力トルク = モータートルク × N × η
第二に、速度がN分の1に減ります。 これが代償です。モーターが毎分3000回転していても100:1の減速機を通すと毎分30回転になります。
第三に、負荷慣性がNの2乗分の1に見えます。 これが反射慣性で、減速機が制御を楽にする本当の理由です。20:1ならモーターが感じる腕の慣性は400分の1になります。慣性が小さく見えると同じトルクでより速く加速でき、何より負荷の変化がモーターに伝わりにくくなり制御器が安定して動作します。
数字で見てみます。0.09 N·mを出す小さなモーターにいくつかの減速比を付けると、
| ギア比 | 効率の仮定 | 出力トルク | 速度 | 反射慣性 |
|---|---|---|---|---|
| 5:1 | 0.97 | 0.437 N·m | 1/5 | 1/25 |
| 20:1 | 0.94 | 1.692 N·m | 1/20 | 1/400 |
| 50:1 | 0.90 | 4.050 N·m | 1/50 | 1/2500 |
| 100:1 | 0.90 | 8.100 N·m | 1/100 | 1/10000 |
効率の値は仮定で、実際の値は減速機の種類とグレードによって大きく異なります。精密遊星減速機のメーカーが公表する値は1段97パーセント以上、2段94パーセント以上の水準ですが、趣味用の安い減速ボックスはこれよりずっと低いです。
バックラッシュ — 減速機が奪っていくもの
減速機はトルクをただでは与えません。もっとも大きな代償がバックラッシュです。
ギアの歯がかみ合うには間に隙間が必要です。隙間がないと熱膨張や加工誤差で歯が食い込んでしまいます。ところがこの隙間のせいで、入力が回転方向を変えると隙間を渡る間出力が付いてきません。その角度がバックラッシュです。
ロボットではアーク分単位で管理します。1アーク分は60分の1度です。0.35メートルの腕で換算すると、
| バックラッシュ | ラジアン | 手先での遊び |
|---|---|---|
| 10アーク分 | 2909 μrad | 1.018 mm |
| 5アーク分 | 1454 μrad | 0.509 mm |
| 3アーク分 | 873 μrad | 0.305 mm |
| 1アーク分 | 291 μrad | 0.102 mm |
| 36アーク秒 | 175 μrad | 0.061 mm |
| 2アーク秒 | 9.7 μrad | 0.003 mm |
精密遊星減速機のメーカーが公表する値はグレードによって1段で1、3、5アーク分、2段で3、5、7アーク分の水準です。良いグレードでも手先で0.1ミリメートル前後の遊びが残ることになります。
バックラッシュがなぜそこまで問題なのかは制御ループ編で改めて扱います。要約すると、遊びの区間ではモーターが回っても関節は動かないので制御器が見る利得が0になり、歯がかみ合う瞬間に急に正常へ戻ります。区間ごとに利得が違うシステムはひとつのゲインで安定させるのが難しく、目標付近でずっと行ったり来たりするリミットサイクルが生まれます。
ハーモニックドライブがロボットに使われる理由
産業用ロボットアームの関節、特に手首側を開けてみると波動歯車装置が入っています。ハーモニックドライブという商標名でより広く知られています。
構造が独特です。3つの部品からなります。
ウェーブジェネレータ 楕円形ハブ+薄いベアリング。入力軸。
フレックススプライン 薄いカップ形。半径方向にはたわみ、ねじりには強い。
外面に歯がある。出力軸。
サーキュラースプライン 厚いリング。内側に歯があり、フレックススプラインより歯が2枚多い。
ウェーブジェネレータがフレックススプラインを楕円に押し出すと
楕円の長軸部分だけで歯がかみ合います。
入力が1回転すると、フレックススプラインは歯2枚分だけ後ろにずれます。
ここから2つのことが出てきます。
1段で大きな減速比が出ます。 歯の数の差が2だけなので減速比が非常に大きくなります。メーカー資料によるとコンポーネントセットは30、50、80、100、120、160:1を提供し、技術文書では単段の減速比が50:1から320:1に達すると述べられています。遊星減速機で100:1を得るには2段や3段が必要で、段が増えるたびにバックラッシュが積み重なります。
歯が常に複数かみ合っています。 楕円の長軸の両側で広い領域が同時にかみ合うので、メーカーはこのかみ合いにバックラッシュがないと表現します。
ここで正確に押さえておくべきことがあります。「ゼロバックラッシュ」はこのかみ合いについての話であり、軸と軸の間全体の遊びが0という意味ではありません。 メーカー自身も、カップ形ギアはかみ合いではバックラッシュが0だが入力カップリングから来る軸間バックラッシュが2から36アーク秒あると明らかにしています。上の表で36アーク秒は0.35メートルの腕の手先で0.061ミリメートルです。そしてこれとは別にねじり剛性による弾性変形が存在し、こちらのほうが実際には大きな誤差原因になることが多いです。
効率はメーカーが最大90パーセントまで得られると述べています。精密遊星減速機の1段97パーセントより低いです。ハーモニックドライブは効率を代償に精度と減速比を買う選択です。
3つ目の選択肢がサイクロイド減速機です。大型ロボットの肩や腰のように大きなトルクが必要な場所に使います。この部品の資料が特に有用なのは誤差を3つに分けて公表しているからです。機械的バックラッシュ0.1から0.3アーク分、ロストモーション0.3から0.6アーク分、ヒステリシス損失0.2から最大1アーク分。バックラッシュとロストモーションとヒステリシスが互いに違う量であることがここで分かります。「ゼロバックラッシュ」という表現が正直でありうる理由であり、それだけを見て部品を選んではいけない理由でもあります。
静的トルクを数字で求める — 肩が手首より大きい理由
いよいよ冒頭のあの数字を計算します。
腕をこう定めます。
| 部位 | 長さ | 質量 |
|---|---|---|
| 上腕(肩から肘) | 0.20 m | 0.15 kg |
| 前腕(肘から手首) | 0.15 m | 0.10 kg |
| グリッパー(手首の先) | 手首軸から0.05 m | 0.15 kg |
| ペイロード(つかんだ物) | グリッパーと同じ位置 | 0.25 kg |
計算する姿勢は腕を水平に完全に伸ばした姿勢です。重力が作るトルクが最大になる最悪の場合であり、部品選定は最悪の場合で行うべきです。
トルクは力にレバーアームの長さを掛けたものです。一様な棒の重さはその真ん中にかかるとみなします。
まず肘です。肘より外側にあるものだけを数えます。
前腕: 0.10 kg × 9.81 × 0.075 m = 0.073575 N·m
グリッパー: 0.15 kg × 9.81 × 0.15 m = 0.220725 N·m
ペイロード: 0.25 kg × 9.81 × 0.15 m = 0.367875 N·m
------------------------------------------------
合計 0.662175 N·m
次は肩です。距離を全部肩から測り直します。
上腕: 0.15 kg × 9.81 × 0.10 m = 0.147150 N·m
前腕: 0.10 kg × 9.81 × 0.275 m = 0.269775 N·m
グリッパー: 0.15 kg × 9.81 × 0.35 m = 0.515025 N·m
ペイロード: 0.25 kg × 9.81 × 0.35 m = 0.858375 N·m
------------------------------------------------
合計 1.790325 N·m
手首はグリッパーと物の重心までの距離だけを見ます。
(0.15 + 0.25) kg × 9.81 × 0.05 m = 0.196200 N·m
3つの値を並べると、
肩 1.790325 N·m
肘 0.662175 N·m (肩の1/2.704)
手首 0.196200 N·m (肩の1/9.125)
肩が手首より9.1倍大きいトルクを要求します。
理由は2つが重なっているからです。ひとつ、肩は自分より外側にあるすべてのものの重さを負います。ふたつ、その重さは肩からより遠くにあります。距離と質量が両方大きくなるので積が急激に大きくなります。
だからロボットアームは下に行くほど太くなります。産業用ロボットのシルエットが根元が太く先端が細いのは、デザインではなくこの計算の結果です。
import numpy as np
G = 9.81
KGCM_PER_NM = 1.0 / 0.0980665 # 1 kg·cm = 0.0980665 N·m (定義値なので正確です)
# 肩から手首側へ: (リンク長さ m, リンク質量 kg)
LINKS = [(0.20, 0.15), # 上腕
(0.15, 0.10)] # 前腕
GRIPPER_MASS = 0.15 # 手首の先に付いたグリッパー
PAYLOAD_MASS = 0.25 # つかんだ物
WRIST_OFFSET = 0.05 # 手首軸からグリッパー+物の重心まで
def static_torque(joint_index):
"""腕を水平に完全に伸ばした最悪の姿勢で、関節ひとつにかかる重力トルク。
この関節より外側にある質量だけを数えます。"""
outer = LINKS[joint_index:]
reach, total = 0.0, 0.0
for length, mass in outer:
total += mass * G * (reach + length / 2) # 一様な棒の重心は真ん中
reach += length
total += (GRIPPER_MASS + PAYLOAD_MASS) * G * reach
return total
rows = [("肩", static_torque(0)),
("肘", static_torque(1)),
("手首", (GRIPPER_MASS + PAYLOAD_MASS) * G * WRIST_OFFSET)]
print("腕を水平に完全に伸ばした最悪の姿勢での静的トルク")
print(f"{'関節':<6}{'N·m':>10}{'kg·cm':>10}{'安全係数2倍(kg·cm)':>22}")
for name, t in rows:
print(f"{name:<6}{t:10.4f}{t * KGCM_PER_NM:10.3f}{t * 2 * KGCM_PER_NM:22.3f}")
print(f"\n肩 / 肘 = {rows[0][1] / rows[1][1]:.3f}倍")
print(f"肩 / 手首 = {rows[0][1] / rows[2][1]:.3f}倍")
MG996R_6V = 11.0 * 0.0980665 # メーカー公表ストールトルク11 kg·cm @ 6.0V
print(f"\nMG996Rの6Vストールトルク11 kg·cm = {MG996R_6V:.4f} N·m")
print(f"肩が要求するトルクはその{rows[0][1] / MG996R_6V:.3f}倍です(安全係数を入れる前の値)")
実行結果です。
腕を水平に完全に伸ばした最悪の姿勢での静的トルク
関節 N·m kg·cm 安全係数2倍(kg·cm)
肩 1.7903 18.256 36.512
肘 0.6622 6.752 13.505
手首 0.1962 2.001 4.001
肩 / 肘 = 2.704倍
肩 / 手首 = 9.125倍
MG996Rの6Vストールトルク11 kg·cm = 1.0787 N·m
肩が要求するトルクはその1.660倍です(安全係数を入れる前の値)
この数字で部品を選ぶ
計算が終わったのでデータシートと比較します。
| 部品 | メーカー公表トルク | 肩(1.790 N·m)に使えるか |
|---|---|---|
| SG90 | 1.8 kg·cm @ 4.8V = 0.177 N·m | 不可。10分の1 |
| MG996R | 11 kg·cm @ 6.0V = 1.079 N·m | 不可。要求値の60パーセント |
| ダイナミクセルAX-12A | 1.5 N·m @ 12V | ぎりぎり届かない。安全係数なし |
| ダイナミクセルXL430-W250-T | 1.4 N·m @ 11.1V | 不可 |
| ダイナミクセルXM430-W350-R | 3.8 N·m @ 11.1V | 可能。安全係数2.1倍 |
| NEMA 17(17HS4401S)直結 | 0.43 N·m保持トルク | 不可。4分の1 |
冒頭のあの腕がなぜ崩れたのかがここにあります。MG996Rのストールトルクは肩が要求する値の60パーセントです。
そしてこの表にはもうひとつ落とし穴があります。ストールトルクは軸が完全に止まった状態で一瞬出せる最大値です。 その状態では逆起電力がないので電流が最大まで流れ、モーターがずっとそのままだとコイルが焼けます。連続使用できるトルクはストールトルクの20から30パーセントと見積もるのが慣例で、だから安全係数2倍は最低限です。安全係数3倍のほうがより一般的な推奨です。
安全係数2倍を適用すると肩は36.5 kg·cm、つまり3.58 N·mを要求します。上の表でこれを満たすのはXM430-W350-Rだけで、それでも余裕は1.06倍です。
代替策は減速機です。0.09 N·mの小さなBLDCに減速機を付けるなら、必要なギア比は、
N = 3.58 N·m / (0.09 N·m × 0.94) = 42.3
50:1の減速機で済みます。そうすると出力トルクが4.05 N·mになり、反射慣性が2500分の1になって制御も楽になります。代償は速度で、モーターの毎分3000回転が関節では毎分60回転になります。ロボットアームでは関節が毎分60回転なら十分速いです。
もうひとつの代替策は腕を軽くすることです。上の計算でペイロード0.25kgが肩トルクの48パーセントを占めています。ペイロードを0.1kgに下げると肩トルクは1.28 N·mまで落ち、AX-12Aでも安全係数1.2倍が出ます。部品が足りないとき、モーターを大きくするだけが答えではありません。
電源は別に計算する必要があります
トルクが合っていても電源が足りなければ腕は依然として動きません。
サーボ6個を同時に動かすと電流が足し合わされます。MG996Rひとつのストール電流はアンペア単位で、6個が同時に負荷にぶつかると数アンペアになります。この電流をマイコンボードの5Vレールから取ると必ずブラウンアウトが起きます。
この問題の物理と対策はモーターと誘導性負荷を扱う編で詳しく扱いました。要約すると3つです。サーボ電源は別の供給装置から取り、GNDは必ずボードと一点で束ね、電源入力に十分な容量のコンデンサを付けます。
ロジック電圧が異なる場合もよくあります。ラズベリーパイの3.3V信号で5Vサーボを駆動したり、12Vステッパードライバの信号線を3.3Vボードにつないだりする場合です。どちらが安全でどちらがチップを焼くかはロジックレベルとレベルシフティング編に整理してあります。そしてリミットスイッチや原点センサーを付けるときに必要なプルアップ抵抗とデバウンスはGPIOプルアップとデバウンス編にあります。
締めくくり — 腕の形はトルク計算の結果です
この記事で扱ったことは結局ひとつの計算に収束します。この関節に何ニュートンメートルがかかるか。
その値が腕の形を決めます。肩が手首より9倍大きいトルクを要求するので肩側のモーターが大きく、モーターが大きいとその重さがまたトルクを増やすので、リンクを短く軽くする理由が生まれます。産業用ロボットのシルエットがどれも似ているのは、同じ計算をしたからです。
その値は減速機の選択も決めます。必要なトルクをモーターだけで出せないならギア比を買う必要があり、ギア比を買うとバックラッシュも一緒に買うことになり、バックラッシュを減らすにはハーモニックドライブの効率損失を受け入れる必要があります。どれもただではありません。
そしてその値は駆動方式も決めます。サーボは簡単ですが現在の状態が分からず、ステッパーは安く精密ですが脱調を静かに起こし、BLDCは何でもできますが制御ループを自分で組む必要があります。
部品を買う前に紙の上で終えられる計算がこの記事のすべてです。 リンクの長さを決め、持ち上げたい重さを決め、掛けて足せば各関節が要求するトルクが出ます。ここに2倍や3倍を掛けた値が、データシートで探すべき数字です。これをせずにサーボを買うと、冒頭のあの腕になります。
次の段階はこれらの関節が作る姿勢で、手先がどこにあるかを計算することです。順運動学編に続きます。
현재 단락 (1/263)
ロボットアームを作ろうと決めて部品を買います。検索するともっともよく出てくる組み合わせがあります。MG996Rサーボ6個、アクリルか3Dプリントのブラケット、5V電源。