みんなの夢を叶える「走るコタツ」を作ってみた

はじめに

こんにちは!イノベーションセンター テレプレゼンスPJの渋谷です。
最近は日に日に暖かくなり,人々も花粉も舞い踊る気候になってきました。
ついこの間までの寒さが嘘のようです。

寒さといえば,そう,コタツ。
皆さんも「リモコンを取りたいのに手が届かない!だけどコタツからは出たくない!」「コタツが自分と一緒に動いてくれたら...」と,一度は考えたことがあるのではないでしょうか?
そんな怠惰な願望を叶えるために,ロボティクスノウハウと余った時間と予算をフル活用し,今春,遂に「走るコタツ」が完成しました!!
今回は既に季節外れとなってしまった走るコタツの制作記録をご紹介します。

設計

はじめに,走るコタツを実現するには3つの要素があると考えました。

  • コタツと人を載せられるパワーを持つ駆動装置付きの台車
  • 直感的な操作が可能な制御プログラム
  • コードレスなコタツ

これらを満たすソフト・ハードを細かく設計していきます。

台車

走るコタツには,人が乗るための強度とモーターで動かすための軽さの両方を備えた台車が必要です。そこで,軽くて強度の高いアルミフレームと木材を材料に選びました。
材料の特性を考慮して,効率的に人の体重を支えられる構造で設計されています。

駆動系

ロボットの駆動機構には,車輪やキャタピラ,多足など様々な方法がありますが,狭い屋内で重い荷重を運搬することを考えるとオムニホイールやメカナムホイールを用いた方式が適しています。

オムニホイールやメカナムホイールとは,空転する小さな筒がいくつも付いた特殊な構造の車輪です。各車輪の回転数を制御することで,前後に加え,斜め・真横への移動やその場で回転する動作ができます。また,自動車のようなタイヤをステアリングする方式と比べると地面の凹凸や砂・砂利に弱く,屋内などの平らな床面上に使用が限られます。

また,オムニホイールとメカナムホイールを比較すると,前者は4方向の特性が均一で回転時に車輪と路面の間にねじれが生じないという利点に対し,後者は前後方向の移動の効率・走破性に特化した性質を持ちます。
「走るコタツ」では,基本的には前後移動がメインとなることに加え,ノウハウの蓄積を兼ねて新たにメカナムホイールを利用することにしました。

また,人と台車の合計重量を駆動させるため,モーターもかなり強力なものが必要です。
今回は,100Wの大出力モーターを使用して,大きな負荷も駆動できる構成にしています。

駆動系設計の詳細

速歩き程度のスピードで走らせるため,以下のスペックのモーター・車輪を選定し最高時速5.4[km/h]で走行できるように設計しました。

  • モーター最大回転数4000[rpm],最大トルク0.319[N・m]
  • ギヤ比1:30
  • 車輪直径20.3[cm]

床面の転がり摩擦係数\mu_fを0.03,全重量Mを120[kg]とすると,静止摩擦力を上回るために必要なトルクは

 \displaystyle
\tau_\text{th}=\frac{1}{4}Mg\mu_f r\frac{1}{\alpha}=0.02984\mathrm{ [N\cdot m ]}

となり,最大出力トルクの0.319[N・m]のほうが十分大きいため駆動可能です。

配線

モーターを駆動するには,バッテリー,モータードライバ回路,そして制御を行うPCが必要となります。
モーターのドライバ回路にはシリアル通信で命令できるI/Fが用意されているため,回路が非常にシンプルです。

実際には上記の回路に加え,電源スイッチや非常停止ボタン,PC電源用の降圧コンバーターやコントローラーが取り付けられています。

制御系

さて,これまでハードウェアについて解説してきましたが,人がロボットを動かすには操縦するコントローラーとその信号を受け取ってモーターに命令を出す制御プログラムが必要になります。
そこで,ジョイスティックを使うことでロボットのように操縦できるようなUIにしました。
走るコタツはジョイスティックを倒した方向に走行するだけなので,コンピューターにはそこまで大きな処理能力は求められません。 今回はJetsonを制御用コンピューターに使用しました(それでも十分すぎますが笑)。

このロボットでは,ROS on Dockerで動作環境を整備しています。
こうすることで突然PCが壊れてしまっても,簡単に同じ構成を復旧できます(ちなみに, 普段の業務でも作業効率向上のために同様なスキームを使っています)。

ROSは,ノードと呼ばれる単体のプログラムを組み合わせて大規模なシステムを構築するという構想でつくられています。
今回のロボットでは操作を受け取ってモーターを駆動するだけなので,1. 操作の入力,2. データの加工,3. ハードウェアの駆動の3つのノードで構成されています。

よく使われる機能が様々なライブラリとして公開されているのもROSのいいところで,ジョイスティックのデータを取得するプログラムが数行のコマンドでインストールできました。

また,ロボット本体の速度を各車輪の回転数に変換してモーターを駆動するノードを自作しました。
メカナムホイールで走行するロボットの順運動学,逆運動学を計算すると以下の式になったため,この式に基づいてそれぞれのモーターの回転速度を計算するプログラムを記述しました。

  • 順運動学
    v_x = \frac{r}{4}(-\omega_1 -\omega_2 + \omega_3 + \omega_4)
    v_y = \frac{r}{4}(\omega_1 - \omega_2 - \omega_3 + \omega_4)
    \omega = \frac{r}{2W+2H}(-\omega_1 -\omega_2 - \omega_3 - \omega_4)

  • 逆運動学
    \omega_1 = \frac{1}{r}(v_y - v_x - \frac{W+H}{2}\omega)
    \omega_2 = \frac{1}{r}(- v_y - v_x - \frac{W+H}{2}\omega)
    \omega_3 = \frac{1}{r}(- v_y + v_x - \frac{W+H}{2}\omega)
    \omega_4 = \frac{1}{r}(v_y + v_x - \frac{W+H}{2}\omega)

v_x, v_y, \omegaはロボットのxy及び回転速度,\omega_1~\omega_4は車輪の回転速度,rは車輪半径,W, Hはトラック幅とホイールベースを表します。 軸,回転の方向は下記画像のように定義しています。

速度制御

これでジョイスティックから取得した値をメカナムホイール制御ノードに流せばロボットが動かせる状態になりました。しかし,このままではジョイスティックの角度がそのまま速度指令値となり,動き出しや停止時に大きな衝撃が加わって乗り心地が悪くなってしまいます。
そこで,入力デバイスとモーター制御モジュールの間に速度制御モジュールを挿入して,なめらかに加減速するためのフィードフォワード制御を行いました。

乗り心地を左右するのはズバリ加速度です。例えば,車のアクセルを突然踏むのと徐々に踏むのとでは,最終的な速度が同じでも後者のほうが衝撃が小さいということが想像できると思います。 つまり,ロボットを停止状態から(速度ではなく)加速度を徐々に大きくする必要があります。

これを工学的に実現するために,2次の伝達関数を設計しました。
このブロック図を簡単に説明すると,中央のk_2と∫(インテグラル)のループで加速度aを徐々に変化するようにしており,外側のループで命令速度v_\text{ref}が入力速度v_\text{in}に追従するようになっています。 このk_1k_2を調整することで,「徐々に」の度合いを決めていきます。

まず,速度指令が入力されてから最大速度になるまでの時間の逆数がおおよそk_1になります。
また,k_2k_1の10倍程度※の値で,小さいほど動き出しがゆっくりになりますが,k_1の4倍より小さくすると共振が生じてしまいます。
最終的な値は,組み立て後に動かしながらいくつかの値で試し,k_1=0.6k_1=5.0としました。

この制御ブロックをROSのノードとして実装すればソフトの完成です。

制御系設計の詳細

伝達関数,ステップ応答を計算した結果がこちらになります。

  • 伝達関数 G(s) = \frac{k_1k_2}{D}(\frac{1}{s+\alpha_1}-\frac{1}{s+\alpha_2})
  • ステップ応答 Y(s) = \frac{1}{s} - \frac{k_1k_2}{\alpha_1D}\cdot\frac{1}{s+\alpha_1}+\frac{k_1k_2}{\alpha_2D}\cdot\frac{1}{s+\alpha_2}, with  D = \sqrt{k^{2}_{2} - 4 k_{1} k_{2}},  \alpha_1=\frac{1}{2}k_2-\frac{1}{2}D,  \alpha_2=\frac{1}{2}k_2+\frac{1}{2}D
  • ステップ応答の時間関数 v_\text{ref}=u(t)-\frac{k_1k_2}{\alpha_1D}e^{-\alpha_1t}+\frac{k_1k_2}{\alpha_2D}e^{-\alpha_2t}

今回の設計値を代入し,時間応答をプロットするとこんなグラフになります。

比較:1次の伝達関数で同じように設計した場合,速度を上げた瞬間に加速度が急激に変化してしまいます。

あれこれ難しいことやってるけど実際に効果あるの?と気になると思いますが,実際の乗り心地は全然違います!
コーヒーを乗せて比較した映像がこちら(左:2次の伝達関数を使用(工夫した方),右:1次の伝達関数を使用)。
どちらも同じ入力を与えているのですが,制御を工夫した方は液面の揺れがだいぶ抑えられています。

コタツ

最後に,この走るコタツのアイデンティティとなるコタツを用意します。
会社にコタツがあるわけ...と思いますよね?実はあるんです!私もチームに入ったときびっくりしました。 どうしてコタツがあるかは定かではありませんが,休憩時間にほっこりできるのはいいものです。
このコタツを台車に載せれば走るコタツが完全体になります!!
もちろん電源も乗せているので,温かいコタツに入りながら移動できます笑

組み立て

設計ができたので,あとはアルミフレームなどのパーツや回路部品を発注して組み立てていきます。
そのときの作業風景がこちらになります。普段から本チームのメンバーはこんなスペースで仕事をしています。

余談ですが,この作業風景は実はキャタピラ駆動の「走るコタツVer.1」を作成したときの映像です。キャタピラでは人を乗せてターンできなかったため,今回「Ver.2」としてメカナムホイールで作り直しています。

回路はこの画像のようにロボットの内部に配線されています。
数百ワットの出力が出せるバッテリーを搭載しており,万が一ショートしたら大変なことになるため丁寧に配線しました。
各部品は3Dプリンタで印刷したジグでアルミフレームの柱に固定されていて,後の整備のために真ん中の天板を外して回路にアクセスできるようになっています。
部品を取り付けるスペースが若干足りなかったので,一番軽いJetsonが裏面送りになりました笑

最後に,ジョイスティックと非常停止スイッチ,そしてみかんを設置すれば完成です!!

実際に乗ってみた

一言でいうとめっちゃ楽しいです!
メカナムホイールならではの真横移動はとてもシュールです笑
その場で回転もできるため,思ったより狭い通路も通ることができます。
これで来年の冬は,1日中コタツから出ることなく過ごせそうです!!
春夏秋でも,動画の後半部分のようにコタツを外して「走るスノコベッド」としても利用できます笑

転職・就職をお考えの皆様へ

本記事では,我々の夢を詰め込んだ「走るコタツ」プロジェクトについて,設計から組み立て,試乗までをご紹介しました。NTT Comでロボティクスの研究開発をしているチームがあることを知らなかった人も多いのでは無いでしょうか? ものづくりやロボティクスの楽しさが少しでも伝わっていたら嬉しいです。
私が所属するテレプレゼンスPJでは,ソフトウェアだけでは届かない物理空間をスマート化することを目的に,ロボットと通信をかけ合わせた領域の技術開発とビジネス展開に取り組んでいます。
中途採用を通年募集中で,2024年度から新卒採用を再開する予定です(※インターンの受け入れも計画しています)。興味のある方,通信×ロボティクスをやってみたい方はぜひご応募ください!

免責事項

本プロジェクトではしっかり安全対策した上でスタッフ個人の責任の元で制作・試乗しています。
この記事を見て作成したロボット等で発生したいかなる損害の保証もできませんので,このような乗り物を作成する際はパーツの注意事項等をきちんと把握した上で十分に事故等にお気をつけください。

© NTT Communications Corporation All Rights Reserved.