久々に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