Edited at

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


割り当て

ボタン割り当て

ボタン名
番号

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 


これを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ボタンを押してください。


参考

joyプログラム

PS3割り当て


目次ページへのリンク

ROS講座の目次へのリンク