tohutokonsome.hatenablog.com
とりあえず簡単なコントローラーができたので、日記がてら書きます!
ここでは、初歩的にPCのコンソール画面からキーボードで操作することを目標にやってみます。
全体図は以下になります。
コントローラ部分
キーボードから入力した値を、socket通信でRaspBerryPiZeroに連携します。
具体的には、以下の制御で動かそうと思います。
- W:前進
- S:後退
- A:タイヤの向きを左に
- D:タイヤの向きを右に
キーボード入力の値は、input関数なんかは
①キー入力
②Enter
という操作をしないといけなくて、煩わしいので以下の記事を参考(というかそのまま)にさせていただきました。
「termios」というpythonモジュールを使用することで、Enterを押さずして、1文字ずつ値を取得できます。
取得した文字は、取得するたびにsocket通信でRaspBerryPiに送信します。
※参考にさせていただいた記事
Pythonでキー入力を検出する(Enter無しで) - Qiita
Pythonによる通信処理 - Qiita
実際のコントローラーの制御は、以下の通りです。
legocarの制御(コントローラー)
そもそも、PC側にコントローラーを用意しなくても、RaspBerryPiにSSHでログインして、直接操作することも、もちろんできるんだけれども、せっかくなのでsocketで通信することにした。
ちなみに接続方式は、アドホックで接続しています。
ラズパイをアドホック接続で使用する - 豆腐とコンソメ
余談というか後で改善するところ
「termios」によるキーボード入力を検知する方法もよいのだけでども、キーボードイベントをもっと手軽に取得したかった。
(特定のキーをおしっぱにしている状態を検知するとか)
参考にさせていただいたサイトにもあるんだけれども、「msvcrt」モジュールが、どうやらそれっぽい。
ただ、Windowsでしか動かないみたいなので実装は見送った。
これ以外にも、pythonのゲームライブラリである「PyGame」やその後継?の「PySDL2」なんかも試したが、とりあえず「termios」で落ちるついた。
これ以外にも、ホットキーを割り当てるいい感じのモジュールがありそうだったので、検証しだい別途まとめます。
受信部分
今度はRaspBerryPi側に置くコードです。
以下の機能ごとにモジュールを作成しました。
- クライアントのsocketのデータを取得してレゴカーを制御する機能に値を渡す。
- 受け取ったデータをもとにレゴカーを制御する。
実際のコードは以下の通りです。
クライアントからの命令を受信して、レゴカーに渡す
レゴカーの制御
受信部分に関しての課題
- アクセルとハンドルが並列で処理できるようにする
- socket通信をもう少ししっかり学ぶ
blog.amedama.jp