世界で著しく膨脹・発展を続ける自動運転業界。市場を牽引する大手メーカーからIT・技術分野で革新の一翼を担うスタートアップまで、モビリティ業界の最前線を発信します。
取材依頼・情報提供:問い合わせフォーム から
世界で著しく膨脹・発展を続ける自動運転業界。市場を牽引する大手メーカーからIT・技術分野で革新の一翼を担うスタートアップまで、モビリティ業界の最前線を発信します。
取材依頼・情報提供:問い合わせフォーム から
はじめまして、工学院大学修士1年の鈴木将(すずき・しょう)と申します。以前、自動運転ラボの記事にて紹介していただきました自動走行ミニカーの製作者です。現在は同大学院の自動運転制御研究室(電気電子工学科・向井正和准教授)に所属し、自動運転に関する研究をしています。今回は自動走行ミニカーの製作過程を紹介したいと思います。
【参考】鈴木さんのコンテストでの受賞に関するニュースは「工学院大学の学生が自動運転ミニカー開発 コンテストで技術賞」も参照。
記事の目次
■自律走行ミニカー製作のきっかけ
研究室に配属され、何か面白いものは無いかと研究室の中を探していると、新品の小さなラジコンカーが出てきました。先輩曰く、「このラジコンカーを使いたかったが、あまりの小ささに改造できず使えなかった」とのこと。
先輩が卒業研究で使っていたラジコンカーは、全長が約40センチの「1/10スケール」と呼ばれるものでした。それに比べ、発掘したラジコンカーは全長10センチほどしかありません。手のひらに乗ってしまうサイズです。
この小ささで自動運転できたら面白いのではないかと思い、向井先生と相談の上、手のひらサイズの自動運転車を作ることが卒業研究のテーマとなりました(ちなみに、dNaNoは残念ながら生産終了となってしまい、在庫限りとなってしまいました…)
■早速分解、時計より小さい歯車に驚き
ラジコンカーは「プロポ」と呼ばれる送信機を使って操作します。
ラジコンカーを外部のコンピュータなどから制御しようとする場合は「送信機を改造する」「ラジコンカーのモーターそのものを制御する」という方法が考えられます。送信機の改造は、ラジコンカー本体を改造しなくてよいというメリットがありますが、送信機から怪しげな配線が生えているのはスマートではありません。
その上、電波を発する機器を勝手に改造すると、電波法に抵触する恐れがあります。そのため、ラジコンカーを改造して使うしか方法はありません。一度分解し、中の構造を確認することにしました。
大抵の場合、小さなラジコンカーは構造上、ステアリングが左右固定の位置にしか動きません。つまり、「ハンドルを10度切る」というような細かな動きはできず、「右(左)にハンドルを切る」という大雑把な動作しかできないのです。
比較的大きなラジコンカーでは「サーボモーター」と呼ばれるモーターを使い、ステアリングを任意の角度へ動かしています。サーボモーターは回り続けるモーターと違い、角度の信号を入力すると、その角度に回転するモーターです。
サーボモーターは僕が知っている一番小さなものでも、500円玉程度の大きさがあるので、手のひらに乗ってしまうような、小さなラジコンには入っていません。dNaNoも同じように、左右固定のステアリングなんだろうな、と思いつつ分解を始めたのですが、モーターらしきものが見えてきました。
なんと、極小の筐体の中にモーターとポテンショメータ(可変抵抗器、角度検出用)、歯車でサーボモーターを構成していました!まさか1センチちょっとの隙間にサーボモーターが入っているとは、想像もしていませんでした。歯車もかなり小さく、一番大きい歯車でさえ5ミリほどの大きさです。壁掛け時計でも歯車は10ミリ程度あるので、もはや精密機器の領域です。
基板も「3センチ×2センチ」とかなりコンパクトです。この一つの基板で送信機からの信号受信、駆動輪およびステアリングの制御を行っているようです。
モーターとポテンショメータから配線を引き出し、制御できるか試しました。仮止め状態なので、若干ノイズが入りましたが、なんとか制御できそうです!
■プリント基板で小型化、小型カメラも
本物の自動運転自動車に近づけたかったので、カメラを搭載し、車線の映像からラジコンカーを制御することにしました。小型のカメラは選択肢が限られますが、「RaspberryPi」(小型のコンピュータ)の周辺機器として小型のカメラが入手可能でした。(※編集部注:「RaspberryPi」は「ラズベリーパイ」と読み、英ARMのプロセッサを搭載したシングルボードコンピューター。略称で「ラズパイ」とも呼ばれ、IoT教育などの分野でも広く使われている)
RaspberryPiはUSBやHDMIなどの一般的な端子だけではなく、GPIOと呼ばれる入出力端子も備えています。この端子からモーターを制御できるので、RaspberryPiをラジコンカーの制御の中心とすることにしました。
ここで問題になるのは、RaspberryPiの電源です。RaspberryPiは5Vの電源を必要とします。(スマートフォンの充電に必要な電圧です)。しかしながらバッテリーの出力は3.7Vのため、5Vに昇圧する必要があります。
さらに、RaspberryPiはコンピュータなので、電源を切るにはシャットダウン操作が必要です。バッテリー切れによる突然の電源切断はなるべく避けたいところです。「Raspberry Pi Zero W」と小型カメラ市販の昇圧キットを使うと、やはりラジコンカーのサイズには収まらないため、回路とプリント基板を設計して小型化することにしました。
プリント基板製作は、一昔前は高性能な設計ソフトが高価であったり、プリント基板の製造にも数万円かかるなど、気軽に作れるような環境ではありませんでした。しかし、近年は高性能なプリント基板設計ソフトがオープンソースで提供されています。
また、中国の深センにはプリント基板を格安で製造してもらえる企業がいくつかあります。ネットで注文し、1週間ほどで製造してもらえます。価格も安く、送料込みでも数千円程度ですので、失敗をあまり気にせずに基板を試作することができます。クオリティはそれなりですが、趣味や簡単な回路を作る用途には問題ありません。私自身が趣味で活用しているので、今回もこのサービスを利用することにしました。
市販の昇圧キットを参考に、基板を製作しました。小型化のため、ほとんどが表面実装と呼ばれるタイプの部品です。米粒より小さい部品のはんだ付けもあるので、1枚作るのに2〜3時間ほどかかります。
この基板には「3.7V〜5V昇圧」「バッテリー電圧低下監視」「電流監視」「RaspberryPiシャットダウンボタン」「ソフトウェア起動/終了ボタン」のような機能があります。昇圧回路以外にも、マイコンを搭載することで利便性を高めました。
バッテリー切れに対しては、電圧を監視し、残量が少なくなったことを検出したらRaspberryPiをシャットダウンさせることで対処しました。RaspberryPiは本来、液晶モニタとキーボード、マウスを接続して使うのですが、実験のたびに取り付け、取り外しをするのは操作性に欠けます。そこで「ソフトウェア起動/終了ボタン」を設け、モニタやキーボードなど、余計なものを接続しなくても操作できるようにしました。
RaspberryPi側では、基板からの信号を監視するプログラムを作り、シャットダウンやソフトの起動を実現しています。RaspberryPiから直接モーターを動かすことはできないので、モータードライバが必要なのですが、上の基板には入りきらなかったので、別に作ることにしました。前の基板と同様に、CADで設計し製造会社へ発注しました。
モータードライバ基板は、元から搭載されていた基板のスペースに入れることにしました。この基板は、RaspberryPiからの信号をもとに、駆動輪とステアリングのサーボモーターを制御しています。基板下部の白いコネクタをRaspberryPiのGPIOへつなぎ、通信します。
■切削加工機でパーツ製作、ハードウェアが完成
カメラは車両の下のコースを撮影するため、下向きに固定する必要があります。そこで、アルミ板を切削加工機で加工し、カメラの取り付け金具を製作することにしました。
切削加工機は、エンドミルと呼ばれる刃を回転させ、材料を削ることで目的の形をつくる加工機です。3Dプリンタでは難しい金属製や木製のパーツを作ることができます。平面のパーツを作り、曲げ加工をしてパーツを作りました。
また、RaspberryPiと電源管理基板をラジコンカーに固定するアクリル製のパーツも製作しました。RaspberryPiと基板はラジコンの筐体内に収まらないため、ラジコンの外側に設置しました。
アクリル製パーツを取り付けた電源管理基板、RaspberryPi、カメラを載せてハードウェアは完成です!
■ソフトウェアの製作、白線認識のしくみを構築
ハードウェアが完成したので、ソフトウェアの製作に入ります。画像から障害物認識は難しいため、白線に沿って走行することにしました。白線を追従するには「カメラで撮影した画像から白線の曲がり具合を認識する」「白線の曲がりに応じてステアリングの角度を操作する」の2つのプログラムが必要になります。
まずは画像から白線を検出する必要があります。画像認識のライブラリには、線を検出する関数があるため、「線を線として検出」すること自体は難しいことではありません。しかし、検出したラインをどのように利用すればよいか想像できませんでした。
向井先生に相談したところ、線を認識するのではなく、画像の横一列に注目して道路と白線の境目を検出すればよいことを教えてもらいました。あとは道路の中央を求め、常に中央を維持するように走行すれば、簡易的に自動運転ができます。
以下に今回製作したアルゴリズムを画像つきで紹介します。
1. 画像の二値化
あとの処理で認識しやすいように、撮影した画像を諧調の無い白黒画像変換します。
2. 道路中央の検出
二値化画像から車線を認識します。まず、画像の横一列に着目します(下の画像の赤枠内)。赤枠内では、白と黒の境目が4点存在します。この境目の点を画像左側から、A、B、C、Dとします。道路の中央点であるE点は、B点とC点の中央の座標になります。これで道路の中央が求まりました。
3. 車両の中央
今回は車両の中央にカメラを搭載しているため、画像の中央の位置(横幅の1/2)を車両の中央としまし た。車両の中央をE点とします。 画像情報から車両中央を求めると、より安定して走行できるのですが、卒業研究で時間も限られている都合上、簡易的な方法にしました。
白線の中央(E点)と車両の中央(F点)が常に一致するようにステアリングを操作すれば、道路の中央を走行することができます。また、より安定して走行させるため、E点とF点を何か所か求めて使用します。今回は3か所求めました。
■処理能力不足に悩み、処理速度改善の方法を模索
画像処理は比較的重い負荷なので、リアルタイムに処理するには、ある程度の処理能力が求められます。パソコンでは問題ありませんが、やはりRaspberryPiには負担が大きいようで、画像処理は1FPS程度でしか行えませんでした。さすがに1FPSでは走行しながらステアリングを制御することは困難なので、処理速度を改善する方法を考えました。
RaspberryPiにはWi-FiとBluetoothが内蔵されているので、これを活用することにしました。白線検出からステアリング指示値の生成まで外部のパソコンで処理することにしました。RaspberryPiはカメラの映像をパソコンに送信し、操舵の指令値を受信する構成にしました。これでRaspberryPiの負荷を減らし、制御部分のプログラムはパソコンから編集できるので、操作性も向上しました。
結果として、処理速度は10FPSまで改善することができました。(10FPSでも適切とは言えませんが、画像処理ライブラリと使用した言語の都合上仕方ないようです)
■走行に向けてコース製作、実際の道路と同様「クロソイド曲線」使用
早速走行させたいのですが、コースを製作しなければいけません。ラジコンカー用のコースも市販されていますが、サーキット場を模したものが多く、白線も無かったため、コースも製作することにしました。車体が小さいので、A0用紙に印刷するだけでコースが用意できます。
カーブはただの円弧だと思っていたのですが、実際の道路には円弧の導入部分にクロソイド曲線を使用しているそうです。クロソイド曲線により、カーブへ差しかかった際に急ハンドルを防いでいるそうです。急ハンドルを切るということは、このラジコンカーでは映像上の道路が突然曲がることに相当します。
当初は単純な円弧のコースを製作したため、カーブで車線を逸脱してしまいました。道路用の書籍を参考に、コースにクロソイド曲線を導入し、うまく走行できるようになりました。
■【おわりに】条件を単純にすれば、自動運転はラジコンカーでも再現可能
この研究を通して、道路認識などのアルゴリズムは本物とは程遠いものですが、「道路を認識し、その軌道に追従する」という自動運転の基本的な原理を知ることができました。自動運転と聞くと難しそうなイメージを持ちますが、どんな処理が必要かを一つずつ考え、条件を単純にするとラジコンカーでも再現できることがわかりました。
また、基板などオリジナルのパーツづくりを通して、完成のイメージや必要な機能の模索など、ものづくりのプロセスを学ぶことができました。
神童現るっ! 大学生が自動運転ミニカー開発で技術賞 絶妙プログラミング光る https://t.co/1yx3IPdqTT @jidountenlabさんから
— 自動運転ラボ (@jidountenlab) July 18, 2018