目的
この記事の目的は、初心者がロボット開発に必要な技術の全体像を把握し、学び始められることです。
結論
- ハードウェア
- 機械設計
- 電気設計
- 電源管理
- ソフトウェア
- 制御アルゴリズム
- プログラミング言語
- センサー
- 通信
- シミュレーションとテスト
これらの項目について学習することでロボットを開発できるようになります。
具体例
現在スタートアップでロボット開発をしている私の経験ベースではありますが、それぞれの項目の目標とどのような順序で取り組んだか解説していこうと思います。
あくまで全体感を掴むのが目標なのでざっくり何を学べば良いか分かることを目的とし、原理や手法・手順などの詳細は別記事で解説していこうと思います。
1-1 機械設計
目標は3Dモデルを作成できるようになることです。
#TODO CADモデルのイメージ図
私は「SOLIDWORKS」を使っていますが、他にも「Fusion360」や「IRONCAD」といった3D CADソフトがあり、これらを使ってロボット本体の設計を行います。
- まずはツールに慣れるために、小さいものを設計してみる
- 次にどのように動作するのか考えながら設計するために、改良設計やパーツを設計する
- 最後にゼロイチで仕様から設計する
といった順序で機械設計に慣れていきました。
余裕が出てくると、「このパーツは強度がいらないから3Dプリンタで作れる形にしよう」「ここは強度がいるけどコストを抑えるために板金で作れる形にしよう」などといったことが考えられるようになります。
1-2 電気設計
目標はシステム構成図と配線図を作成できることです。
システム構成図は、各モジュール(センサー、電源、モーターなど)をブロックで表現し、それぞれをどのように接続するかといった全体の構成を図にしたものです。
どのような構成要素があるかを一枚の絵にまとめることで制御システムを設計するときにも役立ちます。
自分で配線したものを後からシステム構成図として残すと次からイメージでき、図示できるようになりました。
配線図はさらに具体的に、どのワイヤをどのピンに配線するかといったことを図示します。
センサーから出ているワイヤをマイコンのどのピンに指すかなどを図示します。
システム構成図のモジュールとワイヤ間を詳細化します。センサーやマイコンなどのデータシートを確認して、どのワイヤをどのピンに繋げるか考えます。
詳細は別途説明しようと思います。
1-3 電源管理
目標は電源の選定ができるようになることです。
使用するモーターやセンサー、マイコンなどのデータシートを確認し必要な電源を選定します。
データシートの確認方法は別の記事で解説しようと思いますが、定格電圧が最大のモジュールに合わせて電圧を決定し、全モジュールの消費電力を賄える電源を用意します。最小の電圧に合わせて昇圧し、モジュールに合わせてさらに昇圧するより、最大の電圧に合わせて昇圧しモジュールに合わせて降圧するのが一般的です。
これはDC/DCで昇圧するより、AC/DCで昇圧した方が効率的なためです。
2-1 制御アルゴリズム
目標は仕様に応じた制御手法を判断できるようになることです。
最も有名な制御手法はPID制御かと思います。他にも以下のような制御手法があります。
- フィードフォワード制御
- 最適制御
- モデル予測制御(MPC)
- 適応制御
- ロバスト制御
- スライディングモード制御
- バックステッピング制御
- リミットサイクル制御
- ファジィ制御
- 強化学習制御
- ニューラルネットワーク制御
私も初めての実装ではPID制御を採用しました。正直、知っていたからというのが大きかったです。その後「このように改善したい」という要求から動作原理を調べて制御手法を選定するようになりました。
各制御手法の特徴や動作原理を理解することで適切な手法を選択できるようになると思いますのでこれに関しても別の記事で解説しようと思います。
2-3 プログラミング言語
目標は制御システムを構築することができるようになることです。
プログラミング言語としてはpython、C++、Cがよく使われており以下のような使い分けがされています。
- python: ロジックやアルゴリズムの実装、プロトタイピング
- C++: 高速処理やリアルタイム処理
- C: 組み込みやハードウェア制御
私の場合、ロボット開発以前では機械学習の勉強でpython、SIerとして基幹システムの開発でJavaを触ったことがある状態でした。初めてプログラミングを勉強したときはatcoderやPaizaなどの競技プログラミングでコーディングに慣れた記憶があります。
とりあえず動くものが作れたあとは、綺麗なコードが書けるようになりたくて「プリンシプル オブ プログラミング〜3年目までに身につけたい一生役立つ101の原理原則〜」を読んで設計の原則を理解した上で、先輩のコードを見ながらなぜこの設計にしたかの予測を立てて答え合わせをしていました。
そのあとは、原理原則をもとに設計して、コーディングして、動かして、改善するを繰り返しました。
競技プログラミングもいいですが、作りたいものがあって試行錯誤しながらとりあえず動くものを作るのが一番伸びると思うので、まずは動くものを作れるようになることを目標にすると良い気がします。
3 センサー
目標は動作環境と仕様に基づいてセンサーを選定し、センサーからの出力を取得できるようになることです。
よく使われるセンサーには以下のようなものがあります。
- カメラセンサー
- 力センサー
- 加速度センサー
- ジャイロセンサー
- 光センサー
- LiDAR
- エンコーダー
他にも様々な種類のセンサーがありますが、何をコントロールするためにどのような情報が必要かということを考えてセンサーを選定します。
私は仕組みを知ることで「この環境ではこのように工夫すれば使える」「この仕様ならこれらを組み合わせたら良い」ということが判断できるようになったので、別の記事でそれぞれのセンサーがどのような仕組みで何をインプットして何をアウトプットしているのかということを説明しようと思います。
4 通信
目標は動作環境と仕様に基づいて通信プロトコルを選定し、通信システムを構築できるようになることです。
ロボット開発の分野でよく使われる通信プロトコルには以下のようなものがあります。
通信についてもどのような形のデータを送っているのか、複数線があるけどそれぞれどんな役割があるかといった仕組みと、それぞれの強み弱みを解説した別記事を作成しようと思います。
5 シミュレーション
目標は作成した3Dモデルと制御システムを使って3D空間で動作シミュレーションができるようになることです。
ロボット開発において、実機での試験を行う前にシミュレーションを行うことは非常に重要です。シミュレーションを活用することで、容易に試験できるためパラメータやシナリオを変更しながら多くのケースを試すことができます。
また地上では模擬するのが難しい無重力や1/6Gといった環境でもシミュレーションすることができるため、コンセプト通りに動作するか確かめることができます。
私はROS(Robot Operating System)を使ったシミュレーションを実施しています。具体的には以下のようなツールを活用しています。
- Gazebo: 物理シミュレーションが可能で、ロボットの動作や周囲環境との相互作用を再現できます。
- RViz: センサーのデータやロボットの状態を可視化するために使用します。
シミュレーションは非常に便利ですが、あくまで現実の一部を仮想的に再現したものです。物理特性や環境要因のモデル化には限界があり、実機が組み上がるまでの検証や、パラメータスタディ等補助的なものとして活用しています。