Raspberry Pi 4+ROSで自作ロボットを動かす
前回DCモータを回転させることができたので、今回はいよいよロボットとして動かしてみる。ロボットとして動かすなら部品を固定するフレームが必要だが、今回はフレームも3Dプリンタで自作してみた。フレームの作成については以下に書いたのでこちらを参照。
実際にフレームに組んでみたのがこちら↓
以下で使用した部品や、動かし方についてまとめておく。
実行環境
Raspberry Pi 4 Model B / 4GB
Ubuntu Server 20.04.5 LTS(64-bit)
ROS Noetic Ninjemys
ワイヤレスコントローラーDUALSHOCK 4(Playstation4コントローラー)
構成部品
前回の日記で書いた
- DCモータ:Digilent DC Motor/Gearbox 290-008
- モータドライバ:Digilent Pmod DHB1: Dual H-bridge 410-259
- DCモータ駆動用電池ケース
に加えて、ラズパイを単独で動かすためのバッテリー、ボールキャスターフレームの後方につけるボールキャスター、DCモータにつけるタイヤの3つを使う。
ラズパイをバッテリーで動かすためには5Vで3A以上の電力供給能力があるものが必要。今回は以下の5V 3Aのモバイルバッテリーを買った。猫ちゃんの足跡マークで充電状況がわかるのがかわいい。まぁロボットのフレームに組むと見えないのだが…笑
後方にはボールキャスターをつけている。100円ショップにも売ってると思うが、今回はAmazonで探して評判が良かった以下のものを買った。今のところ滑りも良くスムーズに移動てきているので良い感じ。
タイヤについてはDigilent社の純正部品を買った…というか昔買ったものを使った。ただ、実はこれ私がもっているモータのシャフトと形状が異なったものを間違って買ってしまったため、シャフトの穴を削ったりして無理やりシャフトにはめた。そのうちちゃんとシャフトにあったものを3Dプリンタでつくるかも。
ロボットを組み立てる
あとはこれらの部品をフレームに組んでいく。ラズパイとモータの接続については前回と同じだが、一応おさらいしておく。まず、モータードライバとラズパイのピンは以下のように接続する。
モータードライバ | Raspberry Pi 4 ピン |
---|---|
Pin 1 EN1 | GPIO 13 |
Pin 2 DIR1 | GPIO 22 |
Pin 5 GND | GND |
Pin 6 VCC | 3V3 power |
Pin 7 EN2 | GPIO 12 |
Pin 8 DIR2 | GPIO 23 |
Pin 11 GND | GND |
Pin 12 VCC | 3V3 power |
モーターを駆動する電源として単3電池を4つ接続できる電池BOXを使う。実際に接続したの以下の写真。
これをフレームに組んでいく。2つのモータを付属のネジでフレームに固定し、下の写真のように、フレームの一番下にモバイルバッテリーを起き、その上にラズパイ&電池ケースを載せている。モバイルバッテリーとラズパイをUSBケーブルで接続して電源供給している。写真だとわかりにくいが、右下にモバイルバッテリーのスイッチがついているので、ケーブルの抜き差しをしなくても電源のON/OFFができる。
以下が後ろから見た写真。フレームの下にボールキャスターを貼りつけている。右上に電池ケースのON/OFFスイッチがついているので、使用しないときはここをOFFにしておく。
以下が前から見た写真。今後ラズパイ用のカメラを使って遊んでいこうと思っているので、ラズパイのカメラ用の台をフレームにつくって固定している。上の3Dプリンタの記事で書いたが、フレームの設計をミスってモバイルバッテリーとDCモータが干渉して少しタイヤが斜めになっている…。ただ、動作にはあまり影響ないので今回はこのまま動かす。
以下が上から見た写真。ケーブル類がもじゃもじゃして動くときに邪魔だったので、輪ゴムで縛って固定した。
これで準備は完了。
ロボットを動かしてみる
あとは前回と同様に以下の順番で実行するだけ。まずはds4drvを実行して、PS4コントローラーPSボタン + ShareButtonを長押しして接続する。
sudo ds4drv
次に、pigpiodを起動させておく。
sudo pigpiod
あとはROSのノードを実行していくだけ。もちろんlaunchファイルにまとめてもOK。
roscore
rosrun joy joy_node
rosrun dc2_joy pwm_2motors.py
なお、pwm_2motors.pyは前回とほぼ同じなのだが、フレームに組んで動かしてみたところモータの回転方向が、想定したロボットの進行方向と逆になっていたので、回転方向が逆になるように変更を加えた。具体的には
motor1_dir = det_dir(msg.axes[1]) motor1_duty = calc_duty(msg.axes[1], motor1_dir, motor1_dir_prev) motor2_dir = det_dir(msg.axes[5]) motor2_duty = calc_duty(msg.axes[5], motor2_dir, motor2_dir_prev)
の部分を
motor1_dir = det_dir(-msg.axes[1]) motor1_duty = calc_duty(-msg.axes[1], motor1_dir, motor1_dir_prev) motor2_dir = det_dir(-msg.axes[5]) motor2_duty = calc_duty(-msg.axes[5], motor2_dir, motor2_dir_prev)
に変えた。
以下が実行してみた動画。コントローラの左右のスティックの倒し方によって、モータの回転速度が変わっていることがわかる。
移動ができるようになり、やっとロボットらしくなってきた。
今後についてだが、ラズパイに接続したカメラは今のところ何も処理をしておらず飾り状態なので、次回以降ラズパイにつけたカメラをつかって色々と遊んでみたいと思う。
ROS勉強記まとめ
この勉強記は以下のページでまとめてます。