アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

PS3のコントローラーでROSのシュミレーションロボットを動かしてみた

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

f:id:trafalbad:20220307205435j:plainf:id:trafalbad:20220307205438j:plainf:id:trafalbad:20220307205442j:plain


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


f:id:trafalbad:20220307210908p:plain

動いた

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

f:id:trafalbad:20220307210957p:plain

これで、ROSとgazeboを繋げば本格的なシュミレーション環境が作れるし、実際にロボットを遠隔操作できる。

参考サイト

ROS講座10 カスタムROSメッセージ
ps3joy-ros.org
ROS講座07 joyプログラム
GitHub-ros_lecture