ROS_11:基本　ROSのサンプルを使ってみる。(turtleSim)

#参考
http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingNodes
Tutrialsを別の角度から実行してみます。

#コマンド
##インストールしているパッケージを調べる
```
$ rospack list
```
grep とかと併用すると目的のパッケージが探しやすい
オプションは、 `rospack help`で表示される。

##インストールしているserviceを調べる
```
$ rossrv list
```

##ノードの実行
```
$ rosrun パッケージ名 ノード名
```
ノード名は、プログラム名であって実行時の名前(実行名）でない。。デフォルトの実行名のデフォルトは、作成時に指定？されている。 実行名を変えるにはリマップという技があるらしい。
例：`$ rosrun turtlesim turtlesim_node __name:=my_turtle`

同じ実行名では、ノードを起動させることができないので、同時２つ動かすには、異なる実行名にする必要がある。

##実行しているノードの確認
```
$ rosnode list
```
他にも`rosnode machine マシン名`でマシンで動いているノード一覧を表示させることも可能。`rosnode macheine`でマシン名が確認できる。`hostname`と一緒？

###ノードの情報
```
$ rosnode info ノード名
```
例：`$ rosnode info /rosout`とすると、
Publication（出力）が`/rosout_agg`
Subscriptions(入力)が`/rosout`
Serviceが`/rosout/set_logger_level`と`/rosout/get_loggers`
となっていることが判る。

###ノードの死活の確認
```
$rosnode ping ノード名
```
でノードからの応答を見て、きちんと動いているか確認できる。
例：`$rosnode ping /rosout`

##実行しているTopicの確認
```
$ rostopic list
```

Topicは非同期の1方向通信
Publiserは、Topic名をマスターに登録する。
subscriberはTopic名をマスターに登録すると、Publisher情報を得ることができ通信の環境が整う。あくまでもNode間通信らしい。

##実行しているサービスの確認
```
$rosservice list
```
でサービス一覧が表示される。

##実行中のNodeのGUI表示
rqt_graphパッケージのrqt_graphノードを実行するとGUIで表示される。

```
$ rosrun rqt_graph rqt_graph
````


#実行
##マスターの起動
端末を開いて

```
$ roscore
```
roscoreは、ROSマスター+rosoutノード+パラメータサーバを起動するコマンドらしい。まずこれを動かす。

##turtlesimの起動
新しい端末を開いてturtlesim パッケージ内の turtlesim_node を起動。(カメの絵は毎回違うの？）

```
$ rosrun turtlesim turtlesim_node
```

新しい端末を開いて、`$ rosnode list`でノード名確認すると、`/turtlesim`というノード名が増えている
turtlesim_nodeはあくまでノード名で実行時の名前でない。

turtlesimのnode情報を`$ rosnode info /turtlesim`で見ると
publiserは、`/turtle1/color_sensor`,`/rosout`,`/turtle1/pose`
Subscriptionは、`/turtle1/cmd_vel`
Serviceは、`/turtle1/teleport_absolute`,`/turtlesim/get_loggers`,`/turtlesim/set_logger_level`,`/reset`,`/spawn`,`/clear`,`/turtle1/set_pen`,`/turtle1/teleport_relative`,`/kill`
がある事がわかる。

##turtle_teleop_keyの起動
新しい端末を開いてturtlesimパッケージ内のturtle_teleop_keyノードを起動する。

```
$ rosrun turtlesim turtle_teleop_key
```
これは、/teleop_turtleという実行名で動く
矢印キーでカメが動くのが判る。(端末が違うと動かない）

#調べる(topic)

##rqt_graphの起動
rqt_graphパッケージのrqt_graphノードを実行する。

```
$ rosrun rqt_graph rqt_graph
````

`/turtle1/cmd_vel`というTOPIC名がある。
##/turtle1/cmd_velを調べる。

`/turtle1/cmd_vel`Topicにどんなデータが流れているかをみるため、新しい端末で　`$ rostopic echo /turtle1/cmd_vel`を実行。
キーを押すごとにLinerとAngularの成分が流れていることが判る。

どんなデータ形式か調べるのに
`$ rostopic type /turtle1/cmd_vel`を実行すると　
>geometry_msgs/Twist

との応答あり
それじゃまだわからないので、`$ rosmsg show geometry_msgs/Twist` を実行

>geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

これを同時にするには、`$ rostopic type /turtle1/cmd_vel | rosmsg show`とするとよいらしい。

`/turtle1/cmd_vel`にデータを送ってみる
`$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'`
0.0 という表現を0にしても問題ないみたいです。
オプション`-1`は 1回送ったのちに終了という意味みたいです。
オプション`--`　は　負の値の-がそのままでは使用できないので、それ以後オプションががないので　-は負を表していることに明言する意味みたいです。

##/turtle1/poseを調べる。
Poseって姿勢の意味らしい。。。
`$ rostopic type /turtle1/pose`を実行
>turtlesim/Pose

の応答、前回と同様 `$ rosmsg show turtlesim/Pose`を実行
>float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

と応答
Topicの更新頻度は`$ rostoic hz`で見れる。

#調べる(Service)
`$ rosservice list`で実行中のノードにどんなサービスがあるか調べる
##/clearを調べる
どんなものか調べるために`$ roservice type clear`を実行すると

>std_srvs/Empty

との応答、これは引数が要らないことらしい。
`rosservice call /clear`を実行するとturtleSimの画面がクリアされる。
##/spawnを調べる。
spawnの意味は産む？。
`$ rosservice type spawn| rossrv show`を実行
>float32 x
float32 y
float32 theta
string name
`- - -`
string name

って感じで応答
`$ rosservice call spawn 2 2 0.2 ""`を実行すると新しいカメが生成される。
turtle2という応答があるからturtle2という名前が付いた。。
`$ rostopic list`を実行すると
>/turtle2/cmd_vel
/turtle2/color_sensor
/turtle2/pose

が増えた。もちろんturtle_teleop_keyはそのままだと、新しいカメを動かすことができない。そこで、リマップをして立ち上げると動かすことが可能になる。`$ rosrun turtlesim turtle_teleop_key /turtle1/cmd_vel:=/turtle2/cmd_vel`を実行