ROSの勉強　第18弾：rviz

# #プログラミング ROS< rviz >

## はじめに
1つの参考書に沿って，ROS(Robot Operating System)を難なく扱えるようになることが目的である．その第18弾として，rvizを扱う．


## 環境
##### 仮想環境
|||
|:-:|:--|
|ソフト|VMware Workstation 15|
|実装RAM|2 GB|
|OS|Ubuntu 64 ビット|
|isoファイル|ubuntu-mate-20.04.1-desktop-amd64.iso|

##### コンピュータ
|||
|:-:|:--|
|デバイス|MSI|
|プロセッサ|Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz|
|実装RAM|8.00 GB (7.89 GB 使用可能)|
|OS|Windows (Windows 10 Home, バージョン：1909)|

##### ROS
|||
|:-:|:--|
|Distribution|noetic|
|プログラミング言語|Python 3.8.5|
|シミュレーション|gazebo|

## rviz (ROS visualization)
ロボットやセンサ，アルゴリズム向けの汎用の3次元可視化環境のこと．どのロボットにも使うことができ，特定のアプリケーションに対してすぐに設定できる．

## 設定の流れ
ここでは，rviz上でロボットモデルの表示・カメラ・深度カメラをできることを目標に，設定の流れを学ぶ．まず，ここで必要なものをコマンドラインから呼び出す．以下に必要なものを示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/317a4ba6-0f4d-c39a-34ab-af60c24389d0.png)


なお，後でやりやすいように，gazebo上でロボットの位置を次の図のようにした．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/2a3ef908-5452-f9f6-b592-8f32febeaca9.png)

ここから，rviz上での作業に取り掛かる．
まず，起動したときの状態を次に示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/3400b1f0-13d1-42eb-3654-37d73747d757.png)

このままでは，基準となるのがよくわからないmapとなる．そこで，ロボットの部分を指すodomを基準にする．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/38774099-5ec3-7d29-5c8a-98b470a85907.png)
変更後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/c7a15c6d-7912-bcc7-1420-d284c871f49c.png)
先ほど，赤で示されていたエラー部分が消えている．

次に，ロボットをrviz上で表示させる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/9681818e-3f80-7bb2-03ef-023419b693d6.png)
RobotModel追加後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/12e9d667-1dfa-19eb-223a-ce5dceda0281.png)
gazebo上にあったロボットが表示された．

次に，ロボットのカメラ画像を表示させる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/d445e6e8-1057-4373-9ebc-564f3bf69c6b.png)
Image追加後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/96316688-7b6f-e295-bba5-e18200423807.png)
画像を表示させるウィンドウが表示されたが，画像はまだ反映されていない．カメラの画像データを配信しているトピックを指定していないからである．続いて，RGB画像データを配信しているトピックを指定して，画像データを反映させる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/0bbbb7b6-3083-da7b-7ae3-92375bbab47b.png)
トピックを指定後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/77c60381-024a-25b1-0a39-6fbc41c4a3c1.png)
この画像表示ウィンドウは移動可能で，次のように調整可能である．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/8e757149-02dc-deea-aeb4-4fed8d1db18a.png)
画像だけでは，操作が難しい．そこで，深度カメラによる点群データもrvizに反映させる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/b7c8e0ee-5b91-a238-0802-230fc33a71ca.png)
PointCloud2追加後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/cc650633-ad86-953e-77be-22231494b0e6.png)
点群データはまだ反映されていない．画像表示のときと同様，カメラの画像データを配信しているトピックを指定していないからである．続いて，点群データを配信しているトピックを指定して，点群データを反映させる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/1c236a7c-d9e9-521d-3021-7f1f5871bb8a.png)
トピックを指定後は次のとおりである．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/9ff82e0d-2d4c-d3a4-c2a4-98c5a1cda75b.png)

また，rviz上で見る方向を変えることで，次に示すように俯瞰視しながら，カメラを利用するということもできる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/e3b19278-7973-4752-17d5-ce1d0456015a.png)

設定の流れとしては，以上である．
これで，俯瞰視しながら，カメラを利用するオペレータインタフェースの設定ができた．

## 失敗したこと
1日2日分からず，作業が止まってしまっていた．その原因が分かり，解決したため，ここに示しておく．

##### 問題
まず，問題を示す．
![error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/9575eba4-c8d7-8a97-6bbf-697a35b51a89.png)
RobotModelを追加し，ロボットを表示させようとすると，ロボットは白く表示され，左の部分でも赤でエラーが示されている．ここで共通するエラーは``No transform from [~] to [odom]``というものである．

##### 原因
エラー部分を見る限り，座標変換ができていなかったというのが原因だったようだ．gazebo上でのロボットがrviz上での座標へ適切に変換されず，よくわからない状態で表示されてしまっているということだ．このとき，実行したのは，``roscore``・``roslaunch turtlebot3_gazebo turtlebot3_house.launch``・``rviz rviz``であった．これでは，座標変換するものが含まれていないようだ．

##### 解決
座標変換されていないのが原因であったため，座標変換するものを用意すればよい．
(https://answers.ros.org/question/263140/no-transform-from-base_link-to-odom/ )を参考にしたところ，``robot_state_publisher``というノードが必要だということをヒントにコマンドラインで調べてみたところ，``rosrun robot_state_publisher robot_state_publisher``というものがあった．そこで，これを実行してみたところ，うまくいった．どうやら，``robot_state_publisher``を通して，各要素の座標変換が行われるようだ．

## 感想
今回は，rvizについて基本的なことを学んだ．エラーが出て，作業が止まったときには少し焦ったが解決できてよかった．これで，次回からの地図作成に関する学習も無事継続してできそうだ．


## 参考文献
プログラミングROS Pythonによるロボットアプリケーション開発
　　　　　　　　Morgan Quigley, Brian Gerkey, William D.Smart 著
　　　　　　　　　　　　　　　　　　　　　　　河田　卓志　監訳
　　　　　　　　　　  　松田　晃一，福地　正樹，由谷　哲夫　訳
　　　　　　　　　　　　　　　　　　オイラリー・ジャパン　発行