こんにちは、hiramaです。
前回は、Raspberry PiにROS2をインストールしました。
今回は、ROS2を使ってRaspberry Pi Mouse(ラズパイマウス)を動かしてみたいと思います。
Raspberry PiにROS2をインストールする方法は、前回の記事を参考にしてください。
環境は以下のとおりです。
- Raspberry Pi 3 B+
- ROS2 Dashing Diademata
- Raspberry Pi Mouse
デバイスドライバ
ラズパイマウスの機能を使うために、デバイスドライバをインストールします。
まずは、デバイスドライバのソースファイルをGitHubからクローンして、ディレクトリを移動します。
git clone https://github.com/rt-net/RaspberryPiMouse.git
cd RaspberryPiMouse/src/drivers
デバイスドライバをビルドします。
make
sudo make install
デバイスドライバをインストールして、権限を付与します。
sudo insmod 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/dashing/setup.bashを読み込み、ワークスペースに移動してビルドをします。
source /opt/ros/dashing/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のコマンドを用いてラズパイマウスを動かしました。
次回は、自分でノードを作成して動かしてみたいと思います。