2章.ロボットを操作する

## 本章の流れ
本章では以下の様な流れで書かせて頂きます。
　1. ROS対応の操作デバイス一例
　2. ROSで動かす際のnodeとtopicの概要　
　3. 1章でROS対応されたロボットの概要
　4. デバイスで操作している時のnodeの動き
　5.  ROS topic通信によるロボット制御
![ロボットの操作.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/377b6542-a961-1c32-e329-9038cf50963a.png)

## 実施環境
OS  　　:　Ubuntu16.04LTS. , Ubuntu18.04LTS.
ROS環境 ：　kinetic    , melodic
対象PC　：LattepandaAlphaによる動作（Intel Core m3-7y30 程度の動作）を想定

## 1. ROS対応の操作デバイス一例
ROSに対応したデバイスは様々あり、ロボットを操作する上で大変助けになります。
ここでは私が使ったデバイスは以下の①〜④となります。それら①〜③の操作を行うに当たり、
ROS wikiにある**teleop_tools**が**とても役立ちました！** 
そのインストール方法と操作方法について説明します。

[ROS wiki : teleop_tools](http://wiki.ros.org/teleop_tools)


```bash:teleop_toolsインストール方法
cd ~/catkin_ws/src
git clone git https://github.com/ros-teleop/teleop_tools.git
cd ..
catkin_make
```

【デバイスの操作方法】
　①キーボード　:キータッチによる限られた方向の動作を出力するため、テスト走行を
　　　　　　　　する際に距離や移動量を確認したするには便利。開発初期（調整
　　　　　　　　作業時）に役立ちます。

```bash:キーボード操作　コマンド

rosrun teleop_tools key_teleop.py
```

　②マウス　:ウィンドウ内をマウスポインタでクリックしながら動かす。アナログ的な
　　　　　　　値でlinear.x方向直進）angle.z方向（旋回）を出力する。軽量に出来て
　　　　　　　いるためヌルヌル動かせます。使い易い。


```bash:マウス操作　コマンド

rosrun mouse_teleop mouse_teleop.py mouse_vel:=cmd_vel
```
　③ジョイスティック　:Dualshock4(PS4コントローラ）など、アナログスティックが
　　　　　　　　　　　2個以上あるジョイスティックであれば、でlinear.x方向
　　　　　　　　　　　（直進）、angle.z方向（旋回）に加え、linear.y方向（水平）も
　　　　　　　　　　　扱うことができ、メカナムホイールロボットやクアッドコプター
　　　　　　　　　　　などの操作にも使えます。ただし、キーの割り当てが必要
　　　　　　　　　　　(config.yamlを書き換えること)になります。また意外と沢山の
　　　　　　　　　　　操作内容がソースに含まれているため、topicの配信周期が少し
　　　　　　　　　　　遅くなる場合もあり、修正して簡素化するのも良さそうです。

```bash:ジョイスティック操作　コマンド
roslaunch joy_teleop example.launch
```
　

　
【その他　面白いデバイス】
  ④LeapMotion　：人の手の動きを認識できる。手の位置やジェスチャによって操作
　　　　　　　　　することが出来ますが、簡単に扱える（/cmd_velをpublishして
　　　　　　　　　くれる）nodeがROS wiki等にないため、自分でnodeを作る
　　　　　　　　　（ライブラリを参考にして書き換える）必要があります。
　
## 2. ROSで動かす際のnodeとtopicの概要
　今回作成したロボットにおいてROSの機能としてtopic通信を使っています。このtopic通信によって様々な動作を実現しています。そのtopicの受け渡し方法について、概要を自分なりに書きます。
　まずは、ROS masterと呼ばれる管理機能（メッセージやサービスを登録、検索してくれたりする機能）があり、そこに複数のnodeと呼ばれる処理プロセスが繋がっています。topic通信の場合、nodeからはメッセージ（topic)が配布(publish)され、ROS masterに登録されます。これに対し購読(subscribe)したいnodeはROS masterで検索してメッセージ(topic)に書かれている内容を取得しています。

**　　　　　　　　　　　　　ROS masterとnodeの関係**
![pub_sub1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/8389fe09-3226-13e4-882c-59a86f775594.png)
ここでメッセージを配布するnodeをpublisher,メッセージを購読するnodeをsubscriberなどと呼び、publisher、subscriberと言った役割を持った複数の処理プロセス(node)が分散処理されながら動いています。時には一つのnodeが複数のpublisherやsubscriberになったりしますが、あまり役割が多すぎると負荷が大きくなってしまうため、なるべく小分けにした方が分散処理の恩恵を受けられると考えています。



## 3. 1章でROS対応されたロボットの概要
　先程のnodeとtopicの概要に対し、1章で作成したArduinoスケッ(mecanum_wheel_control.ino)によって、rosserialと言うnodeが作られます。今回作ったrosserial nodeはsubscribeとpublish両方の役割を持っています.

[1章.ロボットのROS対応](https://qiita.com/motom0509/items/c81d85b2e7967a780eb9)


【node名】
rosserial　

【topic名】
subscribe側:
/cmd_vel　←ロボットに対し要求される速度を読みに行く

publish側:
/tf    　　←ロボットの位置座標を送る
/odometry　←ロボットの位置座標＋速度を送る

**　　　　　Arduinoスケッチから作り出されたrosserial nodeについて**
![rosserial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/2126994a-9405-88a3-48ba-39a0eb6124fa.png)


## 4. デバイスで操作している時のnodeの動き

【topicに準じたロボットの動作内容について】 
　①各デバイスのnodeから/cmd_velと言うtopicがpublishされる。ちなみに下図はキーボードで
　　操作した時を想定し、kerboard_teleopと言うnodeが/cmd_velをpublishしています。
　②rosserial nodeが操作したい速度の情報(/cmd_vel)を読み込む(subscribe)
　③/cmd_velに書かれている速度情報に沿ってArduinoで演算し、モータ回転速度に
　　変換した後モータへ出力する（Arduino内でモータ出力する）。

**　　　　　　　topic:/cmd_velとnodeのやり取り(キーボード操作時)** 
![cmd_vel1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/60233d3d-da40-6781-a521-d8fa368b8239.png)
--------------------------------------
　④今回のロボットではステッピングモータを使っているため、モータが回転した分
　　だけのステップパルスの量を記録して、ロボットの移動量、移動スピードを
　　計算します（Arduino内で演算します）。
　⑤先程の①とは変わって、今度はrosserialがpublisherとなり、ロボットの移動量より
　　/tf(座標値)を送ります。
　⑥/tfと同様にロボットの移動量＋移動スピードより/odometryと言うtopicを
　　送ります(publish)。

　⑦　⑤,⑥によってrosserialからは/tfと/odometryがpublishされ、グラフィック表示
　　(rvizを使うことが)出来るようになります。rvizについては次章で更に説明します。

　　ちなみにグラフィック表示する場合そのままrvizと打ち込めば動きます。

```bash:rvizの表示
rviz
```

**　　　　　　　　　　topic:/tf,/odometryとnodeのやり取り** 
![tf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/28473733-6f89-1d24-f040-3c4dedfdeccd.png)



## 5. ROS topic通信によるロボットの操作
　ここまでの状況からROSのtopic通信を使うことで、ロボットをかなり充実したデバイスで
　操作することが出来ます。まずこれが基本になると考えております。

**　　　　　　　　　　　　　ROS topic通信による動作実現**
![topicによる動作実現1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/fbd9c2b1-162f-6ece-7642-ea298290f44a.png)

##次は3章.LiDARを動かす
次はLiDARを動かしてみます。様々な方向の角度と距離を一瞬で測長できるデバイスは
正しく**ロマン**です！こうご期待！
[3章.LiDARを動かす](https://qiita.com/motoms/items/382bfcee80aa05f5dcd9)

## 今までの道のり
[作って分かった「ROSを使う前のロボットと、ROSを使った後のロボットの変化」](https://qiita.com/motom0509/items/1e1b6866eba52dcdf90b)

序章 ： [ROSを使った自動航行ロボットをつくるまでの道のり　ー序章　概要ー](https://qiita.com/motom0509/items/ea297fffbd6865b85bdb)
前章 ： [1章.ロボットのROS対応](https://qiita.com/motom0509/items/c81d85b2e7967a780eb9)