ROSを始めよう　その６

# 前回の内容
[その５](https://qiita.com/hagi-suke/items/4582b36b6b7548c3d53c)

# 今回の内容
今回はROSのGUIについて見ていきましょう。
参考：http://wiki.ros.org/ja/visualization/Tutorials

# 可視化ツールrviz
rvizというツールを使うと、ロボットの内部情報やセンサの可視化ができます。
## 立ち上げ方
roscoeを立ち上げた後、`$ rosrun rviz rviz`で立ち上げます。

## Turtlebotシミュレーターで使ってみる

```
シミュレーターのインストール
$ sudo apt-get install ros-kinetic-turtlebot-gazebo
$ source ~/.bashrc
立ち上げる
$ roslaunch turtlebot_gazebo turtlebot_world.launch
別のターミナルで自律移動プログラムも立ち上げる
$ roslaunch turtlebot_gazebo amcl_demo.launch
別のターミナルでrvizを立ち上げる
$ rosrun rviz rviz
```
最初は何も表示されていないのですが、画面左下のAddボタンから表示するものを追加できます。
画面左に並んでいるのは表示中のものです。
![sim_first_rviz_launching.png](https://qiita-image-store.s3.amazonaws.com/0/314195/1db23fbb-5a87-7728-98cd-3ae12c1a6482.png)
例えば、
By display typeからRobotModelを選ぶと、ロボットのモデルが表示されます。
By topicから/mapのMapを選ぶと、あらかじめ作成された地図が表示されます。
/camera/depth/pointsのPointCloud2を選ぶと、Kinectのセンサ情報が表示されます。
/odomのOdometryを選ぶと、ロボットの現在位置が表示されます。
/move_base/NavfnROS/planのPathを選ぶと、ロボットの行きたい経路が表示されます。
これらはPublishされているTopicを３次元的に表示させているのです。

また、画面上方の2D Navi Goalボタンを押して、ロボット近くの地面をドラッグすると、ロボットを自律移動させることができます。表示される緑の矢印の根元がゴール位置、向きがロボットのゴール姿勢となります。

# rqt
これまでもrqt_graphやrqt_consoleなどを使ってきましたが、その仲間を紹介します。

## rqt_plot
PublishされているTopicの値をグラフにできます。`$ rqt_plot`で立ち上がります。
![rqt_plot.png](https://qiita-image-store.s3.amazonaws.com/0/314195/6f1f402f-eb02-473f-bf56-a620878a44a3.png)
上の欄に/turtle1/cmd_vel/linear/xなどと書いて＋ボタンを押すか、`$ rqt_plot /turtle1/cmd_vel/linear/x`として立ち上げれば良い。

## rqt_ez_publisher
スライダーなどでTopicにPublishできます。

```
インストール
$ sudo apt-get install ros-kinetic-rqt-ez-publisher
$ roscore
$ rosrun turtles turtles_node
$ rosrun rqt_ez_publisher rqt_ez_publisher
```
これで立ち上がります。画面上でTopicを選択すると、/turtle1/cmd_velをPublishするGUIなどにできます。
![joint_states.png](https://qiita-image-store.s3.amazonaws.com/0/314195/c902bc4d-61f8-c65e-7851-276d081e25df.png)

## rqt
今まで出てきた複数のrqtのモジュールを同じWindowにまとめてみましょう。
`$ rqt`で立ち上げて、画面上のPluginsからVisualizationのPlotやEasy Message Publisherを選択すると、同じWindowにまとまります。
![56e26f85-56ea-49dc-930f-1bcf58f33539.png](https://qiita-image-store.s3.amazonaws.com/0/314195/9346fd0a-322c-fc78-c832-a3a87e4e425f.png)

# ジョイスティックで操縦する
ジョイスティックでロボットを操縦したい時もあると思いますので、簡単に方法を紹介します。
`ls -l /dev/input/js*`みたいにすると認識されているジョイスティックがわかります。
まず、`$ rosrun joy joy_node` (/dev/input/js0以外で認識されているジョイスティックを使うなら`$ rosrun joy joy_node _dev:=/dev/input/js1`)を実行すると、sensor_msgs/Joy型の/joyというTopicをPublishします。

それを使って、０番ボタンを押しながら移動操作ができるプログラムを実行してみましょう。

```joy_twist.py
import rospy
from sensor_msgs.msg import Joy
from geometry_msgs.msg import Twist

class JoyTwist(object):
    def __init__(self):
        self._joy_sub = rospy.Subscriber('joy', Joy, self.joy_callback, queue_size=1)
        self._twist_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)

    def joy_callback(self, joy_msg):
        if joy_msg.buttons[0] == 1:
            twist = Twist()
            twist.linear.x = joy_msg.axes[1] * 0.5
            twist.angular.z = joy_msg.axes[0] * 1.0
            self._twist_pub.publish(twist)

if __name__ == '__main__':
    rospy.init_node('joy_twist')
    joy_twist = JoyTwist()
    rospy.spin()
```
`$ roslaunch kabuki_gazebo kabuki_playground.launch`でシミュレーターを実行し、
`$ rosrun ros_beginner joy_twist.py cmd_vel:=/mobile_base/commands/velocity`で実行します。
ちなみに`$ sudo apt-get install ros-kinetic-teleop-twist-joy`で機能が色々使えるようになります。

C++だと、

```joy_twist.cpp
#include <ros/ros.h>
#include <sensor_msgs/Joy.h>
#include <geometry_msgs/Twist.h>

class JoyTwist
{
public:
  JoyTwist()
  {
    ros::NodeHandle node;
    joy_sub_ = node.subscribe("joy", 1, &JoyTwist::joyCallback, this);
    twist_pub_ = node.advertise<geometry_msgs::Twist>("cmd_vel", 1);
  }
  
  void joyCallback(const sensor_msgs::Joy &joy_msg)
  {
    if (joy_msg.buttons[0] == 1)
    {
      geometry_msgs::Twist twist;
      twist.linear.x = joy_msg.axes[1] * 0.5;
      twist.angular.z = joy_msg.axes[0] * 1.0;
      twist_pub_.publish(twist);
    }
  }
private:
  ros::Subscriber joy_sub_;
  ros::Publisher twist_pub_;
};

int main(int argc, char **argv) {
  ros::init(argc, argv, "joy_twist");
  JoyTwist joy_twist;
  ros::spin();
}
```
と書けますので、CMakeLists.txtを編集してcatkin_makeでビルドして、`rosrun ros_beginner joy_twist`で実行しましょう。

# まとめ
今回はROSのGUIについて見ていきました。
次回はROSの分散機能について見ていきましょう。

[その７](https://qiita.com/hagi-suke/items/8f94235d85af8d4dc6b8)