memo.log

技術情報の雑なメモ

Boidsアルゴリズムでラズパイカーを動かす

はじめに

ラズパイコンテスト2020(リンクは本記事執筆時)に応募するためのネタとして、Raspberry Piで作成したラジコンカーをBoidsアルゴリズムにしたがって動物の群れの動きを再現する、という個人プロジェクトを進めていました。

project.nikkeibp.co.jp

正直、出来上がりはまだまだだったのですが、締切のため出来たところまでで先日応募しておきました。今後の改善で設計を一部考え直さないといけませんので、現在の設計のものは一旦区切りとし、設計情報、作り方、成果物等をまとめておこうと思います。

ちなみにBoidsアルゴリズムとは、動物の群れの動きを再現するためのアルゴリズムです。原典の論文は以下です。 https://team.inria.fr/imagine/files/2014/10/flocks-hers-and-schools.pdf

BoidsアルゴリズムについてWikipediaの記述を以下に引用します。以下の通り3つのルールにしたがって各オブジェクトを動かすことで群れのような動きを再現できます。

コンピュータ上の鳥オブジェクトに以下の三つの動作規則を与え、多数を同時に動かして群れの振る舞いをシミュレーションする。
分離(Separation) 鳥オブジェクトが他の鳥オブジェクトとぶつからないように距離をとる。 
整列(Alignment) 鳥オブジェクトが他の鳥オブジェクトと概ね同じ方向に飛ぶように速度と方向を合わせる。
結合(Cohesion) 鳥オブジェクトが他の鳥オブジェクトが集まっている群れの中心方向へ向かうように方向を変える。

ボイド (人工生命) - Wikipedia

作ったもの

最終成果物

最終的には以下の動画のような動きをするものが出来上がりました。4台のラズパイカーが群れのように動いているように見えると思います。これはそれぞれのラズパイカー用の動きをあらかじめプログラムしているのではなく、それぞれの向きと位置を都度アルゴリズムにしたがって計算し、全体の動作を制御しています。

少しずつ止めながら動いているのは、手元で確認しながら少しずつ動かしているためです。 残念ながら、しばらく動かすと、本来動くべき群れの動きとは違う方向に動いてしまっているのが、今回の限界でした。

www.youtube.com

本来は以下のように動くのが正しい動きです(以下のシミュレーションプログラムはブラウザで動作しており、このプログラムも今回の取り組みの中で作成したものの一つです)。

f:id:kuredev:20201012193125g:plain

システム全体構成

システムの全体構成は以下の通りです。端末とラズパイカーをWi-fiで接続し、端末側でアルゴリズムを計算した結果を都度ラズパイカーに送信し、群れの動きを再現するよう命令します。

f:id:kuredev:20201010000940p:plain

Boidsアルゴリズム

Boidsアルゴリズムの理解とラズパイカーに動く方向を命令するための基盤となるBoidsアルゴリズムをTypeScriptで実装しました。プログラムの内容は以下のQiitaの記事にまとめているので割愛します。

github.com

qiita.com

ラズパイカ

以下のものを複数台作成しました。

f:id:kuredev:20201009202129j:plain

f:id:kuredev:20201009202558j:plain

基本的には以下の本の設計をそのままに今回不要なパーツを外したものとなっています。以下本では床のラインを画像認識して方向を調整するといった機能も持っています。 前輪は無く、ボールキャスターで方向を転換します。後輪は左右別々に電源を印加する形となります。 スピード調整や角度の調整機能が付いていないため、曲がるときはどちらかのタイヤを一定時間駆動して、曲がることとなります。

C言語ではじめるRaspberry Pi徹底入門

C言語ではじめるRaspberry Pi徹底入門

  • 作者:菊池 達也
  • 発売日: 2020/04/13
  • メディア: 単行本(ソフトカバー)

回路図

回路図は以下の通りです。ICはDRV8835です。

f:id:kuredev:20201009225904p:plain

制御&通信部分

端末側でBoidsアルゴリズムに基づいて各ラズパイカーが進むべき方向を計算し、それぞれのラズパイカーに命令します。これにはHTTPを用いました。ラズパイ側でWebサーバを起動し、進むべき方向をHTTPリクエストとして受け取ります。ラズパイ側でそのリクエストの内容にしたがって、方向を調整します。

サーバ部のプログラムは以下の通りです。Rubyで記述しています。一定角度を曲がったら、少し直進、を繰り返します。角度の調整を片方のタイヤを駆動する時間でしか調整できないため、次はステアリングやサーボモータ等を使ってきちんと方向を制御したいところです。

gist4a06fd6bd71a9891c5379b3314d12776

今回作成したラズパイカーに必要な部品一覧

DRV8835使用ステッピング&DCモータドライバモジュール: 組立キット 秋月電子通商-電子部品・ネット通販

Ecool 電池ケース 電池ホルダー 電池ボックス ワイヤ 単3形*3本 スイッチ・カバー付 2個入り

micro usb ケーブル 3本 15cm SUNGUY マイクロusbケーブル 急速充電 高速データ転送 高耐久 ナイロン編み

サンハヤト Raspberry Pi用スペーサー 黄銅製 MPS-M2611

ELEGOO 400タイポイント ブレッドボード3PCS 、Arduino用ジャンパーワイヤ 4電源レール

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

タミヤ 楽しい工作シリーズ No.111 スポーツタイヤ 56mm径 (70111)

サンハヤト ジャンプワイヤ SMP-200 ミノムシ付

タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)

タミヤ 楽しい工作シリーズ ボールキャスター (2セット入) | タミヤ

Raspberry Pi Zero WH - スイッチサイエンス

Samsung EVO Plus 32GB microSDHC UHS-I U1 95MB/s Full HD Nintendo Switch動作確認済 MB-MC32GA/ECO 国内正規保証品

感想

ラジコンの作成やそもそも電子工作の知識がほとんど無かったため、最初のプロトタイプを作るまでが苦労しましたが、その分色々と勉強できたと思います。Boidsアルゴリズムもネットの記事等を読んでいるだけでは理解し切れなかったので、TypeScriptでプログラムだけで動作するものを最初に作りましたが、それで理解が深まりました。もっとブラッシュアップしてひと目みて「おお!」と思ってもらえるようなものにしていけたらと思います。

参考にしたサイト、書籍等

C言語ではじめるRaspberry Pi徹底入門

C言語ではじめるRaspberry Pi徹底入門

  • 作者:菊池 達也
  • 発売日: 2020/04/13
  • メディア: 単行本(ソフトカバー)

t-kojima.github.io

qiita.com

tips.hecomi.com

aquarius-train.hatenablog.com