ROS + VScode の設定　まとめメモ

#ROS + VScode 設定
--------------------------------------------------
本記事は、自己の備忘録のためにVisual studio codeでROSのソースをデバッグするまでの設定方法をまとめる。かなりくどい感じでまとめているので、見ればでもわかると思われる。

##1.VS CODE インストール
Vs codeをターミナルよりダウンロードとインストールする。

https://code.visualstudio.com/download

##２.ROS インストール
ROSのチュートリアルを見ればインストールできる。

http://wiki.ros.org/melodic/Installation/Ubuntu

##３.VS CODE　エクステンションインストール

エクステンションのメニューから下記のモノをインストールする。

1)ROS　Develop Robot Operating System(ROS) with Visual studio Code 
2)CMake
3)CMakeTools

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/7c1fe27d-eabe-17c1-f132-a42a18cae3df.png)


##４.catkinのワークスペースディレクトとビルド（初期）
###ワークスペースの生成
ホームディレクトリでいいので、そこにワークスペース用のディレクトリを生成する。とくに名前は決まっていないが、
ROSのホームページや他の参考ページの殆どはcatkin_wsとなっている。オプションの-Pをつけて、ソースコードファイルを保管するデイレクトリであるsrcを一気に作成してしまう。

```bash
cd ~
mkdir -p catkin_ws/src
cd catkin_ws
```

###ビルド（初期）
catkinでビルドして、ビルド条件など自動構成されるディレクトリやファイルを生成する。

```bash
cd ~
cd catkin_ws
catkin build
```
**ビルド成功時のターミナル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/f1671a13-6d26-8a62-e8fe-15ae56a0138b.png)


##４.VS Codeのビルド条件の設定とソースコード（トピックのパブリッシュとサブスクライバ：ROSのチュートリアルにあるやつ）
##VSCode起動

ワークスペースのディレクトリでVsCodeを起動する

```bash
cd ~
cd catkin_ws
code .
```
##Catkinのパッケージをエクステンション機能で生成
コマンドパレットより、>ROS -> Create Catkin Package で生成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/f4838baf-d922-fc5b-8196-c14cf26b17fe.png)

例えば、パッケージ名：publishierとする。この時、依存関係も聞いてくるので、
基本的には、`std_msgs roscpp`を使用すればよい。***Pythonの場合は、`rospy`*を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/748fdc4f-7cdd-cf9b-2954-c257aee0f930.png)

パッケージ生成後の様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/33be79ee-c81c-315f-ab7f-8c5d05f33dbb.png)

##パッケージ内のCMakeListsを設定する（シンプルな設定とする）
関係のあるところ以外、全て省略としている。

```CMake

（省略）

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++14)

（省略）

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
## ソースファイルを分割してコンパイルしたい場合は、
#add_executable(${PROJECT_NAME}_node src/publisher_node1.cpp src/publisher_node2.cpp)となる

add_executable(${PROJECT_NAME}_node src/publisher_node.cpp)


（省略）

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
 )

```

##srcディレクトリのソースファイルを生成

***ディレクトリは、よく間違いやすいので、注意！！***

  src/
   |-source1.cpp
   |-source2.cpp
  CMakeLists.txt
  package.xml


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/92b60cb2-661e-108e-144a-34fce7b9ab29.png)

ソースコードは、自分で組んでもいいし、動作確認やROSのPUB/SUBを体感する（めんどくさい）場合は、
下記のソースをコピーして使うと良い。

###Publisher_node.cpp
```cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argv,char** argc){

   ros::init(argv,argc,"publisher_node");
   ros::NodeHandle nh;
   ros::Rate loop_rate(10);
   ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 10);
   
   while (ros::ok())
   {
     std_msgs::String msg;
     std::stringstream ss;
     ss << "hello world ";
     msg.data = ss.str();
    ROS_INFO("%s", msg.data.c_str());
    
    chatter_pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();

   }
 
}
```

##c_cpp_properties.json の設定

` "/src/publisher/include/**" `を追記する。
パッケージを追加する時も同様に、そのパッケージのインクルードディレクトリのパスを設定する。

###c_cpp_properties.json
```json
{
  "configurations": [
    {
      "browse": {
        "databaseFilename": "",
        "limitSymbolsToIncludedHeaders": true
      },
      "includePath": [
        "/opt/ros/melodic/include/**",
        "/src/publisher/include/**",
        "/usr/include/**"
      ],
      "name": "ROS"
    }
  ],
  "version": 4
}
```

##launchファイルの作成と設定
srcフォルダ直下にlaunchファイルを作成する。名前は何でもより、拡張子を``.launch``とする
例：``nodes.launch``

###launchファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/c9fdebbd-1658-c9a8-dc9d-762e42beb615.png)

launchファイルの内容は下記である。
<dl>
  <dt>pkg</dt>
  <dd>パッケージ名</dd>
  <dt>name</dt>
  <dd>ノードのエリアシス：ユニークな名前にすること。同じ名前は起動できない。アノニマスにすれば同じパッケージを起動できる。</dd>
  <dt>type</dt>
  <dd>Nodeのプログラム実行ファイル　Pythonの場合がスクリプトファイル名(.py)</dd>
</dl>

###launchファイル
```xml
<launch>
    <node pkg="publisher" name="publisher" type="publisher_node"/>
</launch>
```

##VScodeのビルドタスクファイルの作成と設定
下記の要領で、タスクファイル（テンプレート）を生成する。
###タスクファイルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/5154a2f6-9bc5-9505-cf33-ffd22c0c1873.png)

タスクファイルの内容は下記のように書き換える。
なお、コマンド引数の``--cmake-args"　"-DCMAKE_BUILD_TYPE=Debug"``　は、
デバッカを動かく（デバッグ）際に必要で、**このオプションがないとブレークポイントが効かないので注意する。**

###タスクファイル
```json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "ROS: catkin_build",
            "type": "shell",
            "command": "catkin",
            "args": [
				"build",
				"--cmake-args",
                "-DCMAKE_BUILD_TYPE=Debug",
            ],
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true 
            }
        }
    ]
}
```

###ビルド
``Ctrl+Shift+B``でビルドができるようになっている。

また、下記のようにメニュからビルドタスクを実行しても良い。
###メニュー＞ビルドタスク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/1dd3ce49-8df9-9013-8af0-266dbbb3d12b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/b986b7ba-0b4e-9e25-ac17-866d0aafc728.png)

###ビルド成功時の様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/0a496048-2e5a-0245-cf45-956051711d55.png)


##VScodeのlaunch.Jsonの設定

launch.jsonファイルを作成し、``Debug　RUN``の実行条件に、ＲＯＳの``.launch``ファイルを実行するように紐付けを行う。


###launch.jsonファイル作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/51aee9d7-4ebf-eb4f-b4fe-839b39281170.png)


launch.jsonファイルを下記のように書き換える。
なお、``target``は、、ＲＯＳの``.launch``ファイルの絶対パスを指定する。
絶対パスは、下記のようなコマンド調べられる。

###絶対パス
```bash
cd ~
cd catkin_win
pwd
```

###launch.json
```json
{
    "configurations": [
    {
        "name": "ROS: Launch",
        "type": "ros",
        "request": "launch",
        "target": "/home/rosdevloper/catkin_ws/src/nodes.launch"
    }
    ]
}
```

##5.VSCode　再度立ち上げ
lauch.jsonの作成または変更後、デバックRUN実行しても、上手く起動しないため、一度、VScodeを再度立ち上げしたほうがよい（２０２１/０３／２７時点）※良い方法がわかれば記事内容更新します。



##６.デバックRUN実行
設定などの誤りがなければ``F5``で実行できる。


###デバックRUN実行成功時のターミナルの様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/da8f6882-a662-b0f7-0d6a-2ae019bb92e0.png)

###デバックRUN実行　失敗時のターミナルの様子
例：ノードが見つからない場合：ROSのLAUNCHファイルの絶対パスが違う
"target": "/home/rosdevloper/catkin_temp＿ws/src/nodes.launch"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/e17c3798-17c3-e7fc-8246-ffb99e0cb474.png)


##７.Subscriber.cppの追加

同様にSubscriberのパッケージをエクステンション機能より生成し、Subscriberのソースコードを``src/``追加する。
下記のソースをコピーして使うと良い。

```cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
 ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "listener");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    ros::spin();

    return 0;

}
```
##８.　＃４−５で該当箇所をもう一度行う。

###.launchの変更
```xml
<launch>
    <node pkg="publisher" name="publisher" type=publisher_node"/>
    <node pkg="subscriber" name="subscriber" type=subscriber_node"/>
</launch>
```

###c_cpp_properties.json
```json
      "includePath": [
        "/opt/ros/melodic/include/**",
        "/src/publisher/include/**",
        "/src/subscriber/include/**",
        "/usr/include/**"
}
```


###CMakeLists.txt

```CMake
（省略：内容は同じ）
```


##８.デバック　ブレークポイント
任意の場所でブレークポイントを行い、デバックRUN実行で、ブレークポイントが有効になっている！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/e4236884-26d7-72ca-682b-81cd475daa4d.png)

###値も参照できる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/7313559d-5d10-ddfa-aecb-cec5c2d4bb11.png)

###パッケージも切り替えることがきる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397413/f9dafb8d-713c-0aea-cf29-23c18d8c9943.png)


　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上