rosをインストールしてHello Worldする

# 導入
　ROSを始めるにあたり個人的に躓いたところなどをまとめることを目的として、インストールとROSの基本事項についてまとめたいと思います。

# windows環境でROSをインストールする方法
　ROS自体はubuntuにしか対応していません。しかし、windowsのPCしか持っていない場合でもlinuxの仮想環境を入れることでROSを使用することができます。linuxの仮想環境については以下を参考に`VirtualBox`という仮想環境でubuntu18.04をインストールしました。
https://qiita.com/HirMtsd/items/225c20b77a7cd5194834
　大まかな流れは、インストールしたいバージョンのisoファイルをubuntu公式サイトからダウンロードし、VirtualBoxにてisoファイル、メインメモリ、ディスク容量を選択するだけです。（私はメインメモリ：4GB、ディスク容量：20GBにしました。）ディスク容量は10GBだと足りないと思います。途中の選択肢で可変サイズを選んでいれば後からでもディスク容量は変更できます。ただ、自分は一度10GB→20GBに変更した際にubuntuが起動できなくなってしまったので、あらかじめ余裕をもって容量を選択することをお勧めします。

## ROSのインストール
以下を参考にしました。
https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e
```shell:install.sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt install curl 

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo apt update

sudo apt install ros-melodic-desktop-full

apt search ros-melodic

sudo apt-get install python-rosdep

sudo rosdep init

rosdep update

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

source ~/.bashrc

source /opt/ros/noetic/setup.bash

sudo apt-get -y install python-rosinstall

sudo apt-get install -y python3-catkin-tools

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws/src

catkin init

cd ~/catkin_ws

catkin build

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

source ~/.bashrc
```
上記をターミナルで順番に実行していけば完了です。（melodicの部分はnoeticなど環境に合わせて変更してください。）


```
roscore
```
　最後に上記の`roscore`をしてエラー表示が出なければインストールできているはずです。

# ROSパッケージを作る
　上記のインストールで`catkin_ws`の中に`src`というファイルができていると思います。ROSのファイル構造はROSパッケージというものを基本単位として扱うという特徴があり、そのROSパッケージを入れ子にするようにファイルを作っていきます。今回チュートリアル用のROSパッケージを、ROS.orgを参考に`beginner_tutorials`という名前で作成します。
```shell:
cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
```
このROSパッケージは後でHello Worldするときに使用します。

# よく使うROSパッケージやツールをインストール
　ROSのインストールで参考にさせていただいた記事に書いてあるものをとりあえずインストールしました。
```shell:
sudo apt-get install -y ros-melodic-joystick-drivers
sudo apt-get install -y ros-melodic-jsk-visualization
sudo apt-get install -y ros-melodic-image-proc

sudo apt-get install -y git
sudo apt-get install -y vim
```
# Pub&Sub通信でHello Worldする
## Pub&Sub通信について
　ROSのフレームワークではPub&Sub通信（パブリッシュ/サブスクライブ通信）が使われており、データ送信側をパブリッシャ、データ受信側をサブスクライバと呼びます。データはトピックという単位で扱いますが、ROSではROSトピックという名前で使用されます。また、ROSではプログラムの最小単位をROSノードと言います。つまり、各ROSノードがROSトピックを送受信することで通信を行うという仕組みになります。

## ソースコード
　最初はROS.orgのチュートリアルを見てやっていったのですが、わからないところが多かったので以下の記事を参考にさせていただきました。
https://qiita.com/srs/items/26ca826802d07a9e3d4e
　手順はこんな感じです。
① catkin_ws/src/beginner_tutorials/srcに移動する
②Publisherのc++のプログラムファイルを作る
③Subscriberのc++のプログラムファイルを作る
④catkin_ws/src/beginner_tutorialsに移動する
⑤CMakeLists.txtを書き足す
⑥ビルド
　PublisherとSubscriberのソースコードはそのままコピペでやりました。

　現在のファイルはこのようになっているはずです。


![スクリーンショット (926).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430628/70078cbe-6eb6-9450-d5a4-77e6541cec68.png)

　ROSでは基本的にソースコードはすべて各ROSパッケージの`src`の中に保存するみたいです。
### CMakeLists.txtの書き足し
　私の場合、先ほどの記事と少し違う点があったので一応載せておきます。

```
cmake_minimum_required(VERSION 3.0.2)
project(beginner_tutorials)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)
#以下の部分を書き足してください

include_directories(
  ${catkin_INCLUDE_DIRS}    
)

add_executable(basic_simple_talker   src/basic_simple_talker.cpp)　
add_executable(basic_simple_listener src/basic_simple_listener.cpp)　

target_link_libraries(basic_simple_talker
  ${catkin_LIBRARIES}
)


target_link_libraries(basic_simple_listener
  ${catkin_LIBRARIES}
)
```
CMakeLists.txtファイルは大量のコメントアウトがあり一見わかりにくいのですが、実際には少し変えるだけです。

## 実行
実行の手順
①catkin buildでビルドする
②３つのターミナルを開く
③１つ目のターミナルでroscoreを実行
④２つ目のターミナルでPublisherのコードを実行
⑤３つ目のターミナルでSubscriberのコードを実行
### ①
```
cd ~/catkin_ws
catkin build
```
ターミナルで上記を実行するとcatkin_ws内のすべてのROSパッケージをビルドが開始されます。ここでエラーが出た場合基本的にはPublisher、Subscriber、CMakeLists.txtのうちどれかのファイル名または中身のタイプミスなどが原因だと考えられます。

### ②
```
source ~/catkin_ws/devel/setup.bash
```
　開いた3つのターミナルすべてで上記を実行する。
### ③
```
roscore
```
　1つ目のターミナルで上記を実行する。
### ④
```
rosrun basic_lecture basic_simple_talker
```
　2つ目のターミナルで上記を実行する。
### ⑤
```
rosrun basic_lecture basic_simple_listener
```
　3つ目のターミナルで上記を実行する。

## 実行結果
1つ目（roscore）のターミナル

![スクリーンショット (928).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430628/ac7fe730-0b05-c7fe-618d-d97b98e26f38.png)

2つ目（basic_simple_talker）のターミナル

![スクリーンショット (929).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430628/772cbc75-fd9e-90f6-682f-673ffed3d9b4.png)


3つ目（basic_simple_listener）のターミナル

![スクリーンショット (930).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430628/f9b1f9b1-9a6a-34a9-662a-8d26cdede38b.png)

パブリッシャ、サブスクライバともに成功が確認できました。

# まとめ
　ROSに関して全くの初心者だったので、ROSのバージョンをどれがいいのか悩んだり、ROS特有のファイル構造がよくわからなかったりなどなれない部分が多く最初の理解に戸惑いました。最終的には一応成功したのでROSについて基礎の基礎は理解できたような気がします。