ROS2 Humble 上で Joystick F310 を使いルンバを操作

# 初めに
　ROS2 Humble 上で、ラズパイにつないだルンバをJoystickで操作できるようにします。
# 準備
### ラズパイ自動ログイン、リモートログイン
　Ubuntu や ROS2 はラズパイとリモート操作用PCにインストール済みの前提で説明します。ラズパイは電源投入でログインさせるため、設定(settings)>users>の中で自動ログインに設定します。また、リモートログインするために、ラズパイに sshサーバー をインストールします。
``` : sshサーバーのインストール
sudo apt install openssh-server
sudo apt install avahi-daemon
```
リモートPCの端末からラズパイにログインする場合は以下の通り xx@yy.local （例：pi@pi.local） を入力すると、Are you sure you want to continue...? と表示されるので yes を入力します。通信がつながるとラズパイのpasswordを聞かれるので、入力します。ログイン出来たら、プロンプトが2行目のように変わります。
``` : リモートPCの端末からラズパイにログイン
ssh xx@yy.local
xx@yy:~:$
```
ラズパイ終了する場合は、リモートPCからshutdownして下さい（本当に終了？とか聞かれないので注意）。
``` : リモートPCの端末からラズパイを終了
shutdown -h now
```
次に、ルンバのROS2ドライバで定番の <a href=https://github.com/AutonomyLab/create_robot>AutonomyLab/create_robot</a> から ROS2 の version に合わせたブランチ（foxy や humble）を選んで、github の指定通りラズパイにインストールします。

ラズパイのUSBとルンバの通信端子をつなぐTTL変換ボードの接続は色々な所で出ていますので、それを参考に接続します。以上で、準備完了です。

# 実行
###　指令待ち状態になるかの確認
ノートPCから ssh でラズパイに入り、ラズパイ上で以下を実行すれば指令待ち状態になります。
``` : ラズパイ上で指令待ち状態にする
ros2 launch create_bringup create_2.launch
```
このとき、端末上で以下のメッセージを確認できれば接続はOKです。メッセージが大量に速く流れるので、途中でCtrl-Cで止めて確認してもいいでしょう。

``` : 接続後に確認すべきメッセージ
... 大量のメッセージ
... Connection established.
... Battery level ##.# %
... Ready.
... 大量のメッセージ
```
　接続されていない場合は、ルンバの電源ボタンを押すと、あっさり動いたりします。また、USBシリアル変換ボードがだめで接続されない場合があります（私は安物のボードを買って、時間を無駄にしました。ちょっと値段が高めのボードを買って使ったら、一発でつながりました）。この場合、「ルンバが power-off か確認しろ」、みたいなメッセージがでて、Retryを繰り返します。
### 接続確認後、指令を出して動かす
　接続できたら、以下のコマンドで動くはずです（ラズパイでもノートPCでも、どちらでコマンドを発行しても動きます）。

``` : 直進速度と回転速度を指示する
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear: {x :0.1}, angular: {z: 0.3}}'
```
ここで、：（コロン）の後に必ず、半角スペースを入れる必要があります。入れないと、エラーが出ます。私はこれで、時間を無駄にしました。

###　キーボードで操作する
コマンドラインではなく、キーボードで操作したければ turtlebot3 の teleop_keyboard が使えます。

``` : tutlebot3 インストール
sudo apt install ros-humble-turtlebot3-msgs
sudo apt install ros-humble-turtlebot3
```
``` : キーボードでルンバを動かす
export TURTLEBOT3_MODEL=burger
ros2 run turtlebot3_teleop teleop_keyboard
```
### ジョイスティックで操作する
　ジョイスティック用のプログラムをインストールします。
``` : ジョイスティック用プログラム インストール
sudo apt install ros-humble-joy-linux
sudo apt install ros-humble-joy-linux-dbgsym
```
Joystick F310 をUSBで有線で接続します。認識されたかどうかは以下で確認します。ついでに、権限も付与します。jstest 実行中にスティックをいじって、値が変わればOKです。
```: Joystick の確認と権限付与
lsusb           # F310 が表示される
ls /dev/input/  # js0 が表示される
sudo chmod a+rw /dev/input/js0  # 権限付与
#  以下を実行し、Joystickを操作すると表示が変化
jstest /dev/input/js0
```
なお、F310のスティック操作とAxes番号との対応は以下の通りでした。ボタン操作とButtons番号の対応も調査したが、説明は省略します。
```
# Joystick と Axes 番号の対応（F310限定）
# 左スティック　左右　0  上下　1
# 右スティック　左右　3　上下　4
# 向こう側の側面　左　2　右　5
# 十字キー　　　左右　6　上下　7
```
端末で以下を入力すると、ジョイスティック操作は /joy として発行されます。
```
ros2 run joy_linux joy_linux_node 
```
別端末で以下を入力すると、発行内容が確認できます。
```
ros2 topic echo /joy
```
このままでは、ルンバは操作内容を受け取れないので、/joy の情報を /cmd_vel へ変換する必要があります。プログラムは、@moriitkys(CHE MOT) さんの <a href=https://qiita.com/moriitkys/items/c90e9d292b897725458c> ROS2 Joy Stick Controller を使って Turtlesim を動かす</a> の記事が参考になります。ノートPC上で以下の操作をすればジョイスティックでルンバが動きます。

```
cd ~
mkdir ~/rmba_ws/src
cd ~/rmba_ws/
ros2 pkg create --build-type ament_python --node-name joy_translate_node joy_translate
...
... cd で該当フォルダに移動し、
... joy_translate_node.py に
... 適当なプログラムを書き込み、保存
...
cd  ~/rmba_ws/
colcon build
source install/setup.bash
ros2 run joy_translate joy_translate_node
```