C++
ROS
ロボット

ROS講座07 joyプログラム

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

ROSプログラムの一例を示します。今回はturtle_simをジョイスティックで操作すROSノードを作成します。今回は画面上の「亀」を動かすだけですが、「亀」を実際のロボットに置き換えればラジコンを行うことができます。

joyスティックについて

今回はPS3をコントローラーとして使います。PS3のコントローラーはスティックの感度が高く、ほかのPC用のジョイスティックよりも使いやすいです。以下のaptリポジトリをインストールすればほかにドライバは必要なく、PS3コントローラーをUSBケーブルで接続するだけで使用できます。実はPS4のコントローラーも使用できますが、キーの割り当ての順番が違うので注意が必要です。

joy用のパッケージのインストール

sudo apt-get install ros-kinetic-joy
sudo apt-get install ros-kinetic-joystick-drivers

割り当て

ps3割り当て.png

ボタン割り当て

ボタン名 番号
Select 0
L3(左軸押し込み) 1
R3(右軸押し込み) 2
Start 3
十字キー上 4
十字キー右 5
十字キー下 6
十字キー左 7
L2 8
R2 9
L1 10
R1 11
12
13
× 14
15
PS 16

軸割り当て

軸名 割り当て 正方向
左軸左右 0
左軸上下 1
右軸左右 2
右軸上下 3

joyスティックの入力の確認

joyスティックをPCに刺して以下の3つをターミナルで実行します。

1つめのターミナル
roscore
2つめのターミナル
rosrun joy joy_node
3つめのターミナル
rostopic echo /joy

3つ目のターミナルから以下のような出力を見ることができます。もしなにも出ていない場合はPSボタンを押してください。

header: 
  seq: 7364
  stamp: 
    secs: 1533999507
    nsecs: 676157619
  frame_id: ''
axes: [-0.0, -0.0, -0.0, -0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, -0.0, -0.0, 0.07589953392744064, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---

turtle_simのインストール

turtlesimはROSの入門用のROSパッケージです。その中でもturtle_simは実行すると以下のような「亀」のいる画面が表示されます。

turtle_simのインストール
sudo apt-get install ros-kinetic-turtlesim 
turtle_simの実行(roscoreを別途実行すること)
rosrun turtlesim turtlesim_node 

turtle_sim.png

これをrosトピックを送ることで動かすことができます。この「亀」は/turtle1/cmd_velというトピックにgeometry_msgs::Twist型でROSトピックを投げると動きます。以下のコマンドはcmd_velまで書いたら後はTabを押すと補完されます。「亀」を止めるためにはCtrl+Cを押します。

「亀」を動かす
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" 

Twist送信ROSノードのソースコード

上のようにコマンドを送るのは手間なのでジョイスティックから動かせるようにします。joy nodeを使えばjoyスティックの入力を/joyというROSトピックをパブリッシュします。これのデータを変換してTwistを送信します。

basic_twist_publisher

basic_lecture/src/basic_twist_publisher.cpp
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
#include "sensor_msgs/Joy.h"

geometry_msgs::Twist cmd_vel;
void joy_callback(const sensor_msgs::Joy& joy_msg){
    cmd_vel.linear.x =joy_msg.axes[1];
    cmd_vel.linear.y =joy_msg.axes[0];
    cmd_vel.angular.z=joy_msg.axes[2];
}

int main(int argc, char **argv){
    ros::init(argc, argv, "basic_twist_publisher");
    ros::NodeHandle n;

    //publish
    ros::Publisher cmd_pub = n.advertise<geometry_msgs::Twist>("cmd_vel", 1000);

    //subscriibe
    ros::Subscriber joy_sub   = n.subscribe("joy", 10, joy_callback);

    ros::Rate loop_rate(10);
    while (ros::ok()){
        cmd_pub.publish(cmd_vel);
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

CmakeList

以下を追加します。

basic_lecture/CMakeLists.txtに追加
add_executable(basic_twist_publisher src/basic_twist_publisher.cpp)

target_link_libraries(basic_twist_publisher
  ${catkin_LIBRARIES}
)

launch

いろいろなROSノードを使うのでlaunchファイルにまとめます。

basic_lecture/launch/turtle.launch
<launch>
  <node name="joy_node" pkg="joy" type="joy_node" />
  <node name="basic_twist_publisher" pkg="basic_lecture" type="basic_twist_publisher">
    <remap from="cmd_vel" to="turtle1/cmd_vel"/>
  </node>
  <node name="turtlesim_node" pkg="turtlesim" type="turtlesim_node" />
</launch>

<remap>タグはまだ説明していませんが、簡単に説明すると本来cmd_velという名前のROSトピックでpublishするのをturtle1/cmd_velに名前を変えるという設定です。

ビルド

cd ~/catkin_ws
catkin_make

実行

launch
roslaunch basic_lecture turtle.launch

ジョイスティックを動かすと画面上の「亀」が動きます。もしPS3を使っていて、「亀」が動かないときはPSボタンを押してください。

basic_turtle.gif

目次ページへのリンク

ROS講座の目次へのリンク