【ROS2】Logicoolの無線コントローラーF710でTurtlesimを動かしてみた

スポンサーリンク

久々にROS2を動かしてみたくなったので、まずはコントローラーで turtlesim を動かしてみました。
使用したコントローラーはペアリングとかも不要で簡単にワイヤレス接続できる Logicool Wireless Gamepad F710。
過去にROSで扱ったことがあるはずだけど、色々忘れてる。。。



環境

PC: TRIGKEY: Green G5
OS: Ubuntu 22.04.3
ROS2 : Humble
コントローラー : Logicool Wireless Gamepad F710

必要なパッケージのインストール

$ sudo apt-get install joystick ros-humble-joy* ros-humble-teleop-tools ros-humble-teleop-twist-joy -y
$ source /opt/ros/humble/setup.bash


Linuxレベルでの動作確認

Linuxレベルでの動作確認は過去記事の通りで大丈夫だった。
www.sato-susumu.com

$ lsusb
省略
Bus 001 Device 006: ID 046d:c219 Logitech, Inc. F710 Gamepad [DirectInput Mode]
省略

X-D切り替えスイッチはD(DirectInput Mode)
ModeスイッチはOFF

joy_nodeの起動

$ ros2 run joy joy_node

起動するものの、何も表示されない。
どうもソースを適当に見ると、デフォルトで /dev/input/event0 にもアクセスしているっぽい。

アクセス権の確認

$ ls -l /dev/input/event0
crw-rw---- 1 root input 13, 64  2月 17 16:04 /dev/input/event0
$ groups $USER
taro : taro adm dialout cdrom sudo dip video plugdev lpadmin lxd sambashare docker

アクセス権なかった。

inputグループへのユーザー追加

$ sudo usermod -aG input  $USER
$ groups  $USER
taro : taro adm dialout cdrom sudo dip video plugdev input lpadmin lxd sambashare docker
$ newgrp input


再度、joy_node起動

$ ros2 run joy joy_node
[INFO] [1708156757.411275870] [joy_node]: Opened joystick: Logicool Cordless RumblePad 2.  deadzone: 0.050000


別ターミナルで確認

$ ros2 node list
/joy_node
$ ros2 topic list
/joy
/joy/set_feedback
省略
$ ros2 topic echo /joy

すごい勢いで出力されるけど、コントローラーに反応して動いているのでOK

/joy トピックを /cmd_vel トピックに変換

/joyトピックでは turtlesim は動かせないので、teleop_twist_joy パッケージを使って /cmd_vel トピックに変換。 下記launchファイルの中で先程の joy_node も起動している。なので、joy_node は予め停止させておく。

$ ros2 launch teleop_twist_joy teleop-launch.py joy_config:='xbox'
[INFO] [launch]: All log files can be found below /home/taro/.ros/log/2024-02-17-17-06-50-134808-g-tune-3655
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [joy_node-1]: process started with pid [3656]
[INFO] [teleop_node-2]: process started with pid [3658]
[teleop_node-2] [INFO] [1708157210.279447794] [TeleopTwistJoy]: Teleop enable button 2.
[teleop_node-2] [INFO] [1708157210.279518279] [TeleopTwistJoy]: Turbo on button 5.
[teleop_node-2] [INFO] [1708157210.279525282] [TeleopTwistJoy]: Linear axis x on 1 at scale 0.700000.
[teleop_node-2] [INFO] [1708157210.279534045] [TeleopTwistJoy]: Turbo for linear axis x is scale 1.500000.
[teleop_node-2] [INFO] [1708157210.279539618] [TeleopTwistJoy]: Angular axis yaw on 0 at scale 0.400000.
[teleop_node-2] [INFO] [1708157210.279544218] [TeleopTwistJoy]: Turbo for angular axis yaw is scale 1.000000.
[joy_node-1] [INFO] [1708157211.031634594] [joy_node]: Opened joystick: Logicool Cordless RumblePad 2.  deadzone: 0.300000

Bボタンで Teleop enable
RBボタンで Turbo

このパッケージは安全のために Teleop enableボタン (上記起動方法の場合だとBボタン)を押さないと動かない仕様。
面倒なので、Teleop enable ボタンを押さなくても動かせるようにパラメータを変更。

$ ros2 param get /teleop_twist_joy_node require_enable_button 
Boolean value is: True
$ ros2 param set /teleop_twist_joy_node require_enable_button false
Set parameter successful
$ ros2 param get /teleop_twist_joy_node require_enable_button 
Boolean value is: False


/cmd_velトピックを確認

$ ros2 topic echo /cmd_vel

設定すると、ボタンを押さなくてもアナログスティックを操作するだけで /cmd_vel トピックが発行される。

コントローラーでturtlesimを操作

$ ros2 run turtlesim turtlesim_node --ros-args --remap turtle1/cmd_vel:=/cmd_vel

亀を /turtle1/cmd_vel トピックではなく、/cmd_vel トピックで操作したかったため、ros2 runのオプション指定を使って変更。

ここまで設定して、無事コントローラーで亀が移動しました。

メモ:joy_nodeの変わりにjoy_linuxノードを起動

こちらだと、/dev/input/event0に権限がなくても起動できた。
あと、ノード名変更のメモ。

$ ros2 run joy_linux joy_linux_node  --ros-args --remap __node:=joy_linux_node
[WARN] [1708129841.861910522] [joy_node]: Couldn't open joystick force feedback: Bad file descriptor
[INFO] [1708129841.862362360] [joy_node]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.


リンク

https://github.com/ros2/teleop_twist_joy
https://github.com/ros-teleop/teleop_tools
https://github.com/ros-drivers/joystick_drivers
https://github.com/ros-drivers/joystick_drivers/blob/main/joy/src/joy_node.cpp