ps3のコントローラーでROSのロボットを動かす。
今回はRvizの機能だけを使ったシュミレーション用だけど、実際に遠隔での実物ロボットの操作も可能。
gazeboと連携すれば本格的なシュミレーション環境ができる。
目次
1. PS3コントローラの動作確認
2. ps3用の独自のMsgを作る
3. Turtlesimをps3で動かす
4. Rvizで少しリアルなロボットをシュミレーションで動かす
1.PS3コントローラの動作確認
まずPS3(プレーステーション3)のコントローラーを有線で接続。
# 必要パッケージのインストール $ sudo apt-get install ros-noetic-joy $ sudo apt-get install ros-noetic-teleop-twist-joy # 認識してるか確認 $ ls -l /dev/input/js* ## crw-rw-r--+ 1 root input 13, 0 3月 7 13:53 /dev/input/js0
# PS3の動作確認(PSボタンを押してから) $ roscore $ rosrun joy joy_node ## [ WARN] [1646630772.708410626]: Couldn't set gain on joystick force feedback: Bad file descriptor ## [ INFO] [1646630772.710396915]: Opened joystick: /dev/input/js0 (Sony PLAYSTATION(R)3 Controller). deadzone_: 0.050000 $ rostopic echo /joy
ボタンを押せば、それに応じた値が出力される。
PS3のコントロールのボタンについて
PS3のコントロールのボタンの詳細は下を参考にした。
wiki.ros.org
qiita.com
2. ps3用の独自のMsgを作る
ps3のcontrollerのコードはあちこちに落ちてるので、参考に専用の「ps3_joy_msgs」というMsgを作った。$ tree ps3_joy_msgs ps3_joy_msgs ├── CMakeLists.txt ├── action │ └── Task.action ├── cfg │ └── Sample1.cfg ├── msg │ └── Custom.msg └── package.xml
CMakeLists.txt(下の部分を追記)
cmake_minimum_required(VERSION 3.0.2) project(ps3_joy_msgs) find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation dynamic_reconfigure actionlib_msgs) ## Generate messages in the 'msg' folder add_message_files( FILES Custom.msg) ## Generate actions in the 'action' folder add_action_files( FILES Task.action) ## Generate added messages and services with any dependencies listed here generate_messages( DEPENDENCIES std_msgs actionlib_msgs) generate_dynamic_reconfigure_options( cfg/Sample1.cfg)
package.xml
<!--下をコメントアウト--> <build_export_depend>message_generation</build_export_depend> <exec_depend>message_runtime</exec_depend>
あとは参考にしたgithubとほぼ同じなので割愛。
# 全コード構成
├── ps3_joy_basic
│ ├── CMakeLists.txt
│ ├── launch
│ │ └── turtle.launch
│ ├── package.xml
│ ├── run.sh
│ └── src
│ ├── basic_twist_publisher.cpp
│ ├── jmsg_talker.cpp
│ └── joy_twist_publisher.cpp
├── ps3_joy_msgs
│ ├── CMakeLists.txt
│ ├── action
│ │ └── Task.action
│ ├── cfg
│ │ └── Sample1.cfg
│ ├── msg
│ │ └── Custom.msg
│ └── package.xml
└── ps3_rviz_move
├── CMakeLists.txt
├── launch
│ └── movement_robot.launch
├── package.xml
├── run.sh
├── rviz
│ └── movement_robot.rviz
├── src
│ └── robot_sim.cpp
├── stl
│ └── stl_part.stl
└── urdf
└── movement_robot.urdf
3. Turtlesimをps3で動かす
ps3_joy_basic
を使う。
launch/turtle.launch
<launch> <node name="joy_node" pkg="joy" type="joy_node" /> <node name="joy_twist_publisher" pkg="ps3_joy_basic" type="joy_twist_publisher"> <remap from="cmd_vel" to="turtle1/cmd_vel"/> </node> <node name="turtlesim_node" pkg="turtlesim" type="turtlesim_node" /> </launch>
# 動作
$ roslaunch ps3_joy_basic turtle.launch
動いた
4. Rvizで少しリアルなロボットをシュミレーションで動かす
ps3_rviz_move
を使う。
movement_robot.launch
<launch> <arg name="model" default="$(find ps3_rviz_move)/urdf/movement_robot.urdf"/> <arg name="rvizconfig" default="$(find ps3_rviz_move)/rviz/movement_robot.rviz"/> <arg name="joy" default="false" /> <param name="robot_description" command="$(find xacro)/xacro $(arg model)" /> <group if="$(arg joy)"> <node name="joy_node" pkg="joy" type="joy_node" /> <node name="joy_twist_publisher" pkg="ps3_joy_basic" type="joy_twist_publisher"/> </group> <node name="robot_sim" pkg="ps3_rviz_move" type="robot_sim"/> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /> <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" /> </launch>
# 動作 $ roslaunch ps3_rviz_move movement_robot.launch joy:=true
これで、ROSとgazeboを繋げば本格的なシュミレーション環境が作れるし、実際にロボットを遠隔操作できる。
参考サイト
・ROS講座10 カスタムROSメッセージ・ps3joy-ros.org
・ROS講座07 joyプログラム
・GitHub-ros_lecture