はじめに
こんにちは、こうへいです。今回は勉強も兼ねて、動いた時の見た目が派手な「ロボットアーム」を一から製作してみたいと思います。
要求機能
まずはどんなロボットアームを製作するか決めていきます。はじめから複雑なものを作るつもりはありませんので、3自由度ぐらいの垂直多関節ロボットを考えています。また、筐体は全て3Dプリンタで出力する予定なので、机の上に置けるぐらいのサイズが良いですかね。あとはPS4のコントローラで操作できたり、手先がモジュールとして交換可能だったり、自動でお絵描きしてくれたり、といったことができればいいなと思います。以上をまとめると、このようなイメージになります。
- 3自由度の垂直多関節ロボット
- 机の上におけるぐらいのサイズ、重量感
- 制御系は全て内蔵し、電源系のみの接続で動作する
- 手先が交換可能(ペン、ピッキングアームなど)
- PS4コントローラから遠隔操作可能
- お絵かき自動制御(+α)
システム構成
上記の項目を実現させるために、どんなシステム構成がいいか考えます。まず3自由度の垂直多関節ロボットということで、手先の位置決め用にサーボモータが3つ必要です。さらに、ピッキングモジュールで1つサーボモータが必要となります。また、制御用のマイコンはArduinoを利用し、USBシールドを使うことでPS4コントローラとの通信を可能にします。ArduinoにPCをつなげて通信させることで、お絵かきの自動制御などより高度なことまでできるようにします。DCジャックから電源を供給できるようにしておき、ACアダプタを接続できるようにします。
ロボットアーム構成
ロボットアーム(リンクとジョイント)の構成は以下のように考えました。
はじめにリンクは全て円柱と仮定して、半径と長さは
$$[r_{1}, r_{2}, r_{3}, r_{4}] = [10cm, 3cm, 3cm, 3cm]$$
$$[l_{1}, l_{2}, l_{3}, l_{4}] = [10cm, 20cm, 20cm, 10cm]$$
とします。腕ぐらいのサイズ感ですかね。これをCADで設計して重さを測ると、
$$[m_{1}, m_{2}, m_{3}, m_{4}] = [950g, 200g, 200g, 100g]$$
となります。
つぎにジョイントの重さですが、サーボモータ100[g]分と仮定します。
そして、手先の重さは、サーボモータ100[g]+手部分100[g]と仮定します。
最後に運搬物の重さですが、500[g]のものまで運べると仮定します。
以上をまとめて、まずはこのようなパラメータ設定とします。
オブジェクト | パラメータ | 値 | オブジェクト | パラメータ | 値 |
---|---|---|---|---|---|
$リンクL_{1}$ | $m_{1}$ | $0.950[kg]$ | $ジョイントJ_{1}$ | $M_{1}$ | $0.100[kg]$ |
$l_{1}$ | $0.100[m]$ | $回転軸$ | $Z軸$ | ||
$リンクL_{2}$ | $m_{2}$ | $0.200[kg]$ | $ジョイントJ_{2}$ | $M_{2}$ | $0.100[kg]$ |
$l_{2}$ | $0.200[m]$ | $回転軸$ | $Y軸$ | ||
$リンクL_{3}$ | $m_{3}$ | $0.200[kg]$ | $ジョイントJ_{3}$ | $M_{3}$ | $0.100[kg]$ |
$l_{3}$ | $0.200[m]$ | $回転軸$ | $Y軸$ | ||
$リンクL_{4}$ | $m_{4}$ | $0.100[kg]$ | $手先H$ | $M_{h}$ | $0.200[kg]$ |
$l_{4}$ | $0.100[m]$ | $運搬物O$ | $M_{o}$ | $0.500[kg]$ |
サーボモータの選定
ロボットアームの根幹部品となるサーボモータを選びます。性能として重要なものにトルクや位置決め精度があります。
トルク
トルクの計算についてですが、以下の2通りがありそうです。
- 実現したい角加速度を与えて、慣性モーメントから必要なトルクを算出する方法
- 静止状態で働くモーメントに釣り合うように最低トルクを算出する方法
今回は特に角加速度の指定はない(遅くても回ればいい)ので、最低限必要なトルクを算出して、それを十分に上回るスペックのものを選びたいと思います。
力とモーメントの関係ですが、
$$モーメントN[N・m] = 長さL[m]×力F[N]$$
で計算できます。
静止状態(最も負荷のかかる姿勢)で関節にかかるモーメントの合計がモータのトルクと等しくなることで、ロボットアームはこの静止状態を維持できます(制御はできません)。この関係から、ロボットアームの姿勢を維持するために最低限必要なトルクを求めることができます。
では、ロボットアームの各関節のトルク条件を計算していきます。
$$\tau_{3}\geq(M_{h}+M_{o})gl_{4}+\frac{1}{2}m_{4}gl_{4}$$
$$\tau_{2}\geq(M_{h}+M_{o})g(l_{3}+l_{4})+m_{4}g(l_{3}+\frac{1}{2}l_{4})+M_{3}gl_{3}+\frac{1}{2}m_{3}gl_{3}$$
$$\tau_{1}\geq0$$
これらの条件に、設計段階でのパラメータを代入して計算してみると、
$$\tau_{3} \geq 0.735[N・m] = 0.075[kgf・m] = 7.5[kgf・cm]$$
$$\tau_{2} \geq 2.695[N・m] = 0.275[kgf・m] = 27.5[kgf・cm]$$
$$\tau_{1} \geq 0[N・m] = 0[kgf・m] = 0[kgf・cm]$$
のような条件が導出されます。サーボモータは3つとも同じものにしたいので、最低でも30[kgf・cm]ぐらい出るものを購入したいですね。
位置決め精度
位置決め精度を議論するために、ロボットの順運動学を解いてみます。
まずは初期状態(関節角度全て0)を考えて、リンクをベクトル化します。
$$L_{1}=\begin{bmatrix}0\\0\\l_{1}\end{bmatrix} , L_{2}=\begin{bmatrix}0\\0\\l_{2}\end{bmatrix} , L_{3}=\begin{bmatrix}l_{3}\\0\\0\end{bmatrix} , L_{4}=\begin{bmatrix}l_{4}\\0\\0\end{bmatrix}$$
つぎに、手先から順に関節を回転させて計算していきます。
$$p_{2->h}=L_{3}+R_{y}(q_{3})L_{4}$$
$$p_{1->h}=L_{2}+R_{y}(q_{2})p_{2->h}$$
$$p_h=L_{1}+R_{z}(q_{1})p_{1->h}$$
以上をまとめると、
$$p_h=L_{1}+R_{z}(q_{1})(L_{2}+R_{y}(q_{2})(L_{3}+R_{y}(q_{3})L_{4}))$$
$$p_3=L_{1}+R_{z}(q_{1})(L_{2}+R_{y}(q_{2})L_{3})$$
$$p_2=L_{1}+R_{z}(q_{1})L_{2}$$
$$p_1=L_{1}$$
$$R_{x}(\theta)=\begin{bmatrix}\cos\theta&-\sin\theta&0\\\sin\theta&\cos\theta&0\\0&0&1\end{bmatrix}$$
$$R_{y}(\theta)=\begin{bmatrix}\cos\theta&0&\sin\theta\\0&1&0\\-\sin\theta&0&\cos\theta\end{bmatrix}$$
$$R_{z}(\theta)=\begin{bmatrix}1&0&0\\0&\cos\theta&-\sin\theta\\0&\sin\theta&\cos\theta\end{bmatrix}$$
全て代入すると、
$$p_{h}=\begin{bmatrix}\cos q_{2}(l_{3}+l_{4}\cos q_{3})-l_{4}\sin q_{2}\sin q_{3}\\-l_{2}\sin q_{1}+\sin q_{1}\sin q_{2}(l_{3}+l_{4}\cos q_{3})+l_{4}\sin q_{1}\cos q_{2}\sin q_{3}\\l_{1}+l_{2}\cos q_{1}-\cos q_{1}\sin q_{2}(l_{3}+l_{4}\cos q_{3})-l_{4}\cos q_{1}\cos q_{2}\sin q_{3}\end{bmatrix}$$
ここで、初期状態で3つのサーボモータに誤差$\Delta q$が発生したと考え、誤差分による位置ずれを確認します。正確には各関節角度によって位置ずれの程度は変わってきますが、目安としてこれを計算して、サーボモータの誤差$\Delta q$と手先位置決め誤差$\Delta p_{h}$との関係を導出します。
$$\Delta p_{h}=\begin{bmatrix}0&0&\cos \Delta q&\cos^2 \Delta q-\sin^2 \Delta q\\0&-\sin \Delta q&\sin^2 \Delta q&2\sin^2 \Delta q\cos \Delta q\\1&\cos \Delta q&-\sin \Delta q\cos \Delta q&-2\sin \Delta q\cos^2 \Delta q\end{bmatrix}\begin{bmatrix}l_{1}\\l_{2}\\l_{3}\\l_{4}\end{bmatrix}-\begin{bmatrix}l_{3}+l_{4}\\0\\l_{1}+l_{2}\end{bmatrix}$$
したがって、角度分解能0.1[deg]以下のものを選べば、位置決め誤差は1[mm]以下になりそうです。
結果
トルクや角度分解能を考慮して調べたところ、以下のRDS3235というサーボモータが良さそうだったので、性能を詳しく確認してみます。
- 価格 : 約3,000円
- 制御角度 : 180[deg]
- 重量 : 60[g]
- ストールトルク(ロック時) : 29[kg・cm] @ 5.0V
- ストールトルク(ロック時) : 32[kg・cm] @ 6.0V
- ストールトルク(ロック時) : 35[kg・cm] @ 7.4V
- ストール電流(ロック時) : 1.9[A] @ 5.0[V]
- ストール電流(ロック時) : 2.1[A] @ 6.0[V]
- ストール電流(ロック時) : 2.3[A] @ 7.4[V]
- 作業速度(無負荷) : 0.13[s] / 60[deg] @ 5.0[V]
- 作業速度(無負荷) : 0.12[s] / 60[deg] @ 6.0[V]
- 作業速度(無負荷) : 0.11[s] / 60[deg] @ 7.4[V]
- 作動電圧 : 直流5.0〜7.4V[V]
- パルス幅範囲 : 500〜2500[usec]
- ニュートラルポジション : 1500[usec]
- デッドバンド幅 : 2[usec]
トルクは29[kg・cm]〜35[kg・cm]みたいです。地球上では[kg]$\fallingdotseq$[kgf]なので、[kgf・cm]と考えます。最低トルク27.5[kgf・cm]に比べると十分な出力なので、問題なさそうです。
分解能ですが、どうやら計算しないとダメみたいです。パルス幅範囲、ニュートラルポジションから以下のようなパルス幅−角度の関係が導けます。デッドバンド幅はサーボモータの停止位置の不感帯(動作しない範囲)を表しているらしく、分解能として読み取れます。2[us]に対応する角度分解能は0.18[deg]なので、(制御系が2[us]パルスに対応できれば)位置決め誤差は2[mm]以下となりそうです。お絵描きでは少し違和感を感じるぐらいの精度かもしれませんが、良しとします。
重量は60[g]と、想定の100[g]以下なので問題なさそうです。
回転速度ですが、5[V]駆動時に0.13[sec]/60[deg](77[rpm])、6.0[V]駆動時に0.12[sec]/60[deg](83[rpm])、7.0[V]駆動時に0.11[sec]/60[deg](91[rpm])となります。そんなに速くはないですが、速度は求めていないので大丈夫です。
センサ類などはついていないみたいなので、フィードバックには使えなそうです。また、サーボホーンが付属していないため、25T(歯数が25)の規格のものを追加で購入する必要があります。サーボホーン、フリーホーンやサーボアームなど含めてCADデータが公開されていたため、設計も簡単になります。
サーボモータには軸が片側にしか存在しないものと、両側に存在するものがあります。今回は関節部分でオフセットを作りたくなかったこと、負荷を分散させたかったことから、両側に軸があるものを選びました。
マイコンの選定
制御用のマイコンにはArduino Uno、またはMegaを利用する予定です。USBシールドを使うことでPS4コントローラとの通信が可能です。
PS4コントローラ通信機能
以下のUSB Host Shield 2.0 for Arduinoと、Bluetooth機能を持ったUSBドングルを利用することで、PS4コントローラと通信できます。Arduino Unoで使用するピンはD9、D10、D11、D12、D13ピンです。Arduino Megaでは、D9、D10、D50、D51、D52、D53ピンです。
サーボモータ制御
サーボモータはPWM信号で制御しますが、Arduinoから出力されるPWM信号の周波数は約490[Hz](周期2[ms])らしいです。また、Arduino UnoのD5、D6は約980[Hz](周期1[ms])とのことです。周期1[ms]を256分割して波形を送れるため、分解能は3.9[us]でしょうか。これなら位置決め精度3[mm]程度で済みそうですが、2つのサーボモータしか制御できません。さらに、周期1[ms]なので、パルス幅500[us]〜2500[us]が実現できません。
Servoライブラリでは、1[us]単位でパルス幅を指定できるみたいなので、サーボモータのデッドバンド幅2[us]以内です。ただ、Arduino UnoではD9、D10が使用できなくなるらしく、PS4コントローラとの通信が不可能となります。Arduino Megaでは12個までのサーボモータ利用なら影響がないらしいです。
結果
サーボモータの制御はServoライブラリでできそうですが、Arduino UnoだとPS4コントローラとの併用ができないみたいなので、Arduino Megaにします。
電源系の選定
電源はマイコン駆動と、サーボモータ駆動に必要です。
マイコン駆動
ArduinoはUSB給電で5[V]500[mA]、DCジャックや外部電源ポートで7〜12[V]1[A]必要となります。Arduinoボード上のMOSFETによって、USB給電と外部電源が(電圧の高い方に)自動的に切り替えられるみたいです。今回は、ロボットアーム単体で遠隔操縦する場合と、PCをつなげて自動制御する場合があるため、PCから給電しなくても動作するようにしたいです。
サーボモータ駆動
サーボモータは1.9[A] @ 5.0[V]、2.1[A] @ 6.0[V]、2.3[A] @ 7.4[V]を選べます。今回は4つ使用するため、5.0[V]で計7.6[A](38[W])、6.0[V]で計8.4[A](50[W])、7.4[V]で計9.2[A](68[W])の電源が必要となります。
結果
サーボモータ基準でACアダプタを探しましたが、6[V]、7[V]出力で電流値の大きいものがなかなかありませんでした(電圧値をユーザが変更できる便利なものはありましたが、故障につながるためよろしくないです)。5[V]のACアダプタで探したところ、以下の8[A](40[W])のものがありました。約5,000円と高いですが、これは使いまわせるのでいいでしょう。
こちらを利用すれば、ArduinoのUSB給電5[V]500[mA]と、サーボモータ5.0[V]7.6[A]を動かすことができそうです。他にもシールド基板やUSBドングルでも少し電流を消費するため電流値が足りないですが、全部のデバイスで最大電流が流れることもなさそうなので、きっと大丈夫ですかね。ArduinoとPC間の通信にUSBが使えなくなるため、Serial2ピンなどを使おうと思います。
システム構成
以上の議論を踏まえ、このようなシステム構成としました。
- 電源:5[V]8[A](40[W])のACアダプタから給電
- マイコン:Arduino Mega
- 通信:USB Host Shield 2.0 for Arduino + Bluetoothドングル
- サーボモータ:DS3235 × 4つ
コメント