ROS勉強記その5:Raspberry Pi 4+ROS(Noetic) を使ってPS4コントローラーで自作2輪ロボットを動かす

投稿日:2023年3月25日
最終更新日:2023年3月25日

Raspberry Pi 4+ROSで自作ロボットを動かす

前回DCモータを回転させることができたので、今回はいよいよロボットとして動かしてみる。ロボットとして動かすなら部品を固定するフレームが必要だが、今回はフレームも3Dプリンタで自作してみた。フレームの作成については以下に書いたのでこちらを参照。

【3Dプリンター】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プリンタでつくるかも。

https://digilent.com/shop/wheel-kit-splined-pair-abs-injection-molded-wheels-compatible-with-digilent-motor-mounts/

 

ロボットを組み立てる

あとはこれらの部品をフレームに組んでいく。ラズパイとモータの接続については前回と同じだが、一応おさらいしておく。まず、モータードライバとラズパイのピンは以下のように接続する。

モータードライバ 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勉強記まとめ

この勉強記は以下のページでまとめてます。

ROS(Robot Operating System)勉強記 まとめ


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください