ROS2でラズパイマウスを動かす

こんにちは、hiramaです。
前回は、Raspberry PiにROS2をインストールしました。
今回は、ROS2を使ってRaspberry Pi Mouse(ラズパイマウス)を動かしてみたいと思います。
Raspberry PiにROS2をインストールする方法は、前回の記事を参考にしてください。

環境は以下のとおりです。

  • Raspberry Pi 3 B+
  • ROS2 Crystal Clemmys
  • Raspberry Pi Mouse

デバイスドライバ

ラズパイマウスの機能を使うために、デバイスドライバをインストールします。
まずは、デバイスドライバのソースファイルをGitHubからクローンして、ディレクトリを移動します。

git clone https://github.com/rt-net/RaspberryPiMouse.git
cd RaspberryPiMouse/src/drivers

デバイスドライバをビルドします。

make
sudo make install

デバイスドライバをインストールして、権限を付与します。

sudo insmode rtmouse.ko
sudo chmod 666 /dev/rt*

デバイスドライバがインストールできると、ピッという音が鳴り、光センサが一回光ると思います。
これでインストール成功です。

raspimouse2をビルド

ラズパイマウスのROS2対応ですが、Geoffrey Biggsさんが作っているraspimouse2というパッケージがあるので、それを利用させてもらいます。

それでは、raspimouse2を使うためにビルドをします。
まずは、ROS2のためのワークスペースを作成して、srcディレクトリに移動します。

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

GitHubからraspimouse2をクローンしてきます。

git clone https://github.com/gbiggs/raspimouse2.git

ビルドするためにcolconコマンドを使うので、/opt/ros/crystal/setup.bashを読み込み、ワークスペースに移動してビルドをします。

source /opt/ros/crystal/setup.bash
cd ~/ros2_ws
colcon build --symlink-install

エラーが起きなければビルド完了です。

raspimouse2を使う

それでは、ビルドしたパッケージを使うために、セットアップファイルを読み込みます。

source ~/ros2_ws/install/local_setup.bash

raspimouse2のノードを起動します。

ros2 run raspimouse
raspimouse &

このノードは、ROS2のlifecycleという機能を用いています。
lifecycleについては
https://ros.youtalk.jp/2017/06/02/ros2-life-cycle.html
http://hara.jpn.com/_default/ja/Topics/RasPi_ROS2.html
を参考にしてください。
まずは、ノードを起動したときのlifecycleの状態を確認してみます。

ros2 lifecycle get raspimouse

すると、 unconfigured [1] と表示されると思います。
これは、ノードを起動した直後の状態です。エラーが起きたときにも、この状態になる可能性があります。この状態では、トピックなどは構成されません。
次に、違う状態に移行したいと思います。

ros2 lifecycle set
raspimouse configure

エラーが出ずに Transitioning successful と表示されれば、 問題なく状態が変更できています。

現在の状態を確認します。

ros2 lifecycle get raspimouse

inactive [2] と表示されると思います。
この状態は、処理を実行はしていませんが、パラメータを変えたり、トピックの構成を変えたりすることができます。トピックなどが届いても、何も処理はしません。
それでは、実機を動かせる状態にしたいと思います。

ros2 lifecycle set raspimouse
activate

同じくエラーが出ずに Transitioning successful と表示されれば、 問題なく状態が変更できています。

この状態になると、センサが一定周期で光り始めると思います。


現在の状態を確認します。

ros2 lifecycle get
raspimouse

active [3] と表示されると思います。
この状態は、一番メインとなる状態で、様々な処理が行われます。
active状態になったら実機を動かすことが可能になります。

では、ROS2を使って、モータを制御したいと思います。
まずは、モータのトルクをオンにします。ラズパイマウスのモータスイッチがオンになっていることを確認してください。

ros2 service call /motor_power
std_srvs/SetBool ‘{data: true}’

問題なければ、トルクがオンになります。
次にモータを動かして、ラズパイマウスを走らせたいと思います。

ros2 topic pub -1 /cmd_vel
geometry_msgs/Twist '{linear: {x: 0.05, y: 0, z: 0}, angular: {x: 0, y: 0, z:
0.05}}'

実行すると、ラズパイマウスが走り出します。数値を変えることで、速度を変えることができます。
モータを動かして、1分間ほど新しい情報がトピックにこないと、自動的にモータが止まるようになっています。
ラズパイマウスを止めるときは、速度を0にすれば止めることができます。

ros2 topic pub -1 /cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'

では、次にトピックの情報を見てみます。

ros2 topic echo
/light_sensors

実行すると、光センサの現在値を見ることができます。

ros2 topic echo /switches

こちらは、ラズパイマウスについているボタンの状態を見ることができます。

最後にlifecycleの状態をinactiveに戻したいと思います。

ros2 lifecycle set
raspimouse deactivate

このコマンドでlifecylceがinactive状態に戻すことができます。このとき、モータのトルクがオフになります。

今回は、ROS2のコマンドを用いてラズパイマウスを動かしました。
次回は、自分でノードを作成して動かしてみたいと思います。