前回の記事までで、HAC用に近藤科学社製KXR-L2の改造を行ってきました。今回から、実際にこのロボットのためにコードを書いて動かしていき…たいところですが、まずはロボットに搭載されたRaspberry Piとお使いのメインPCに開発のための環境構築を行う必要があります。
Raspberry Piをヘッドレスで起動しWiFi接続を確立する
多くの場合、Raspberry Piを用いた開発はモニタ、キーボード、マウスを本体に接続しデスクトップPCの様に行われます。しかしながら、毎回ロボットに上記の機器を接続しながら開発することは手間ですし、何よりメインPCとしてノートPCを使っている場合(筆者がそうです)はモニタやキーボードをRaspberry Piのために準備するのは困難です。そこで、Raspberry Pi、お使いのメインPCとWiFi環境だけで開発を開始するヘッドレスな環境構築方法をご紹介します。メインPCはWindowsを想定しています。Macの場合は適宜読み替えてください。
まずは、Raspberry PiへのOS書き込みから行います。現在Raspberry Pi財団から配布されているOS書き込みソフト、「Raspberry Pi Imager」には、OS書き込み時にWiFiの接続設定、ログイン時のユーザネーム、パスワードの設定などを行えるオプションが用意されているのでこれを用います。
メインPCにマイクロSDカードを挿入しRaspberry Pi Imagerを起動したら、左の「OS」から「Raspberry Pi OS(32-BIT)」を選択します。新品ではないSDカードを使用している場合は一度フォーマットしてから作業を開始してください。
OSの選択が完了したら右下に歯車のマークが現れるので、これをクリックし書き込み時のオプションを開きます。ホスト名、SSH有効化を画像の様に設定してください。ホスト名は別のものでも問題ありません。
次にユーザ名です。今回のブログでは、ユーザー名にはpiと設定します。これもほかのものでも問題ありませんが、その場合記事中のユーザ名を適宜読み替えてください。
WiFi設定を正しく行うことが、ヘッドレスでの運用を開始するために最も重要です。SSID(使用するWiFiの名前)と、パスワードを間違いの無いように入力してください。ここで間違えると、メインPCからRaspberry PiへのWiFi経由の接続確立に失敗しOS書き込みからやり直すことになります。私は数回やり直したことがあります…
全ての設定ができたら、設定を保存し、書き込み先にSDカードを選択してOSを書き込みます。かなり時間がかかるので、その後の手順を書き込み中に見ておくとスムーズです。
OSを書き込めたら、SDカードをRaspberry Piに挿して早速起動してみましょう。といっても今回はディスプレイが無いヘッドレス運用なので、本体の緑色LEDが少し点滅するくらいでしか起動したことを確認できません。電源投入から3分もたてば、正常に初回起動が完了し、設定したWiFiへの接続も為されるはずです。
メインPCからRaspberry PiにSSH接続する
モニタ、キーボードを接続しないヘッドレス運用で開発を行うために、Raspberry Pi側をSSHホストとしてメインPCからそこに接続することで、CLIを用いた開発を行うことができます。SSH(Secure Shell)は、ネットワークを介してほかのコンピュータを遠隔操作する際の通信方式です。
まず、Raspberry Piと同じWiFiに接続されたメインPCのWindowsで「Windows Power Shell」アプリケーションを開き、コマンド
arp -a
を入力します。すると、画像の様に同一ネットワーク内に存在するデバイスのIPアドレスとMACアドレスが表示されます。SSH接続に必要なのは左側のIPアドレスなのでここに注目してください。
Raspberry Piが問題なく起動しWiFiに接続されている状態であれば、表示されているIPアドレスの内どれかがお使いのRaspberry Piに該当します。Raspberry Piの電源を切った状態でのarp -aの結果と見比べて、どのIPアドレスがそうか特定してください。今回の私の場合では、スマホのテザリングでWiFiを飛ばしているため172.20. から始まるIPアドレスのうち一つがRaspberry Piに該当します。通常の家庭用WiFiであれば、192.168.から始まるIPアドレスのはずです。
IPアドレスを特定後、コマンド
ssh pi@192.168.○○.○○○(IPアドレス)
と入力、パスワードを要求されるので、OS書き込み時に設定したパスワードを打ち込みます。SSH接続コマンドの際のpiは、OS書き込み時に設定したユーザ名です。
SSH接続に成功すれば、ターミナル左の表示が
pi@192.168.○○.○○○:
に変わっているはずです。接続できなければ、Raspberry PiのIPアドレスから再確認し間違いがないことを確かめてください。大抵の場合は、異なるIPアドレスを指定している(IPアドレスは固定していない状態であれば再起動時に変わりうる)と思います。
VNCを用いてメインPCからRaspberry Piを操作する
メインPCのターミナルからSSH接続をしている状態では、Raspberry Pi OSのGUIを使うことはできません。今回のHAC用ソフトウェア開発では画像処理を制御の軸に据えているので、動作中にリアルタイムで物体検出などの様子を視認できれば開発がしやすくなります。簡易な方法として、リモートデスクトップツールであるVNCを用いて、メインPCからRaspberry PiのGUIをリモート操作できるようにします。
まず、メインPCにはVNCクライアントである「VNC Viewer」をダウンロードします。REALVNCの公式サイトから、お使いのOSを選択しダウンロードが可能です。
Raspberry Piには、VNCサーバが標準でインストールされていますが、初期状態では機能が無効化されているのでまずは設定を変更します。メインPCのターミナルからRaspberry PiにSSH接続したら、
sudo raspi-config
と入力しRaspberry Piの設定を立ちあげます。上から3つ目の項目であるInterface Optionsを選択すると、VNCの項目があるのでこれを選択し、VNC Serverを有効化(Enable)します。
また、モニタに接続されていない状態だとデスクトップは出力されていません。ヘッドレスの状態でもデスクトップを表示するようにヘッドレス解像度を指定します。同じくRaspberry Piの設定から、Display Optionsを選択し、Resolutionから解像度を選択します。あまり高いと動作が遅くなるので1280×720くらいで十分です。
これでメインPC、Raspberry Pi双方の準備が整いました。
メインPCのVNC Viewerアプリを起動したら、左上の「File」から「New Connection」を選択し、ポップアップしたウインドウ内のVNC Serverの項目にRaspberry PiのIPアドレス、Nameの項目にお好みの名前(私は接続先のデバイス名に統一しているので、今回ならRaspberry Pi Zero 2Wです)を入力すればRaspberry Piとのリモート接続が確立されGUIでの操作が可能になります。
近藤科学のUSBアダプタを認識できるようにする
システム構成図にもある通り、このロボットの肝となる部分として、全身のサーボモータの制御をKXR-L2側のRCB-4 miniが担うことが挙げられます。「前進」「旋回」などの個々のモーションデータ(動作時の各サーボモータの角度をフレームごとに指定したもの)はRCB-4 miniに記録されていて、Raspberry Piからは個々のモーションデータの再生、停止に相当する指令をDual USB アダプタ経由で送ります。
そのままUSBポートに挿すだけではRaspberry Pi側でアダプタを認識できないので、近藤科学のアダプタについての記述を本体起動時の設定ファイルに新規に記述します。
近藤科学のホームページに記載されている方法を参照します。
まず、Raspberry Piでターミナルを開き、コマンド
cd /etc
と入力しetcディレクトリに移動します。その後
sudo vi rc.local
と入力し、root権限でvi上でrc.localを編集します。ここに記述した内容は、OS起動時にroot権限で実行されます。
rc.localの末尾に
##KO Driver modprobe ftdi-sio #Dual USB adapter echo 165C 0008>/sys/bus/usb-serial/drivers/ftdi_sio/new_id
と書き加えると、次回起動時からDual USBアダプタが認識されるようになります。
今回はDual USBアダプタを用いましたが、近藤科学のほかのUSBアダプタについてもこの方法で認識させることが可能です。プロダクトIDのみ異なるので、詳しくは先述のリンク先を参照してください。
再起動後再びターミナルを開き、dmesgコマンドを入力します。一気に大量のメッセージが出力されますが、末尾の方にUSBデバイスの接続状態についての記述があるはずです。
usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
と表示されていれば接続成功です。ttyUSB0ポートに接続されたデバイスとしてDual USBアダプタが認識されました。うまく認識されない場合は、rc.localに記述した内容に間違いがないかに加え、記述後に再起動を行ったか確認してください。
VSCodeのRemote-SSHを利用する
現在、市場には様々なコードエディタがあります。標準で「Geany」と「vi」の2つのエディタが搭載されているRaspberry Piでも、使い慣れたエディタを用いた方が効率的です。そこで、今回の開発では世界でシェア1位を誇り、またGitHubとの連携もし易い「Visual Studio Code」を用います。Raspberry Piに直接VSCodeを導入することもできるのですが、多機能なエディタのためスペックが足りずあまり快適な動作は期待できません。メインPC上のVSCodeから、Remote-SSH機能を使ってRaspberry Pi上のファイルを編集することにします。
まずは、VSCodeにRemote Development拡張機能を導入します。この拡張機能にRemote-SSHも含まれています。左のメニューバーにRemote Explorerメニューが追加されるので、ここから新規にSSH接続先を追加します。
SSHの横の+マークをクリックするとコマンド入力箇所がポップダウンするので、ここに
ssh pi@192.168.○○.○○○
と入力します。すると保存先のSSH設定ファイルがいくつかリストアップされるので、今回は一つ目のユーザ別の設定ファイルを選択します。
ここまで行うと、Remote-SSHの接続先にRaspberry Piが登録できました。
左にリストアップされた接続先から目当てのものを選んで、新しいウインドウで開きます。
パスワードを求められるのでこれを入力すれば接続完了です。新しいウインドウで左下にSSH接続先が表示されているはずです。
ここからは通常のVSCodeと同様で、開発を行うディレクトリに移動してVSCodeの機能でファイルの追加や編集を行うことができます。
一点注意事項として、メインPC側に導入しているPythonの拡張機能をRaspberry Pi側にも導入することを推奨されますが、そのまま進めるとRaspberry Piの動作が非常に重くなります。拡張機能が裏で走ってリソースを消費していると推測していますが原因は未特定です。コードの色分け等はメインPC側に拡張機能がインストールされていれば問題ないため、Raspberry Pi側にはなるべく拡張機能を増やさないことをお勧めします。
まとめと次回
Raspberry Piを用いたロボット開発環境構築について流れを解説しました。
筆者個人的にここは特に解説をこだわりたかった部分です。理由としては、GitHubなどに上がっている様々なものを見て学習することができる実際のコードとは違い、環境構築については通しで解説した詳しい情報にアクセスすることが難しく、またノウハウによる部分も大きいため個人がいざ0からロボットの開発を始めるときに障壁となっていると感じていたためです。今回の記事はかなり簡易的に開発環境を構築していますが、参考になれば幸いです。
次回は、GitHubと連携させてコードを書き始めます。