#ROS + VScode 設定
本記事は、自己の備忘録のためにVisual studio codeでROSのソースをデバッグするまでの設定方法をまとめる。かなりくどい感じでまとめているので、見ればでもわかると思われる。
##1.VS CODE インストール
Vs codeをターミナルよりダウンロードとインストールする。
##2.ROS インストール
ROSのチュートリアルを見ればインストールできる。
##3.VS CODE エクステンションインストール
エクステンションのメニューから下記のモノをインストールする。
1)ROS Develop Robot Operating System(ROS) with Visual studio Code
2)CMake
3)CMakeTools
##4.catkinのワークスペースディレクトとビルド(初期)
###ワークスペースの生成
ホームディレクトリでいいので、そこにワークスペース用のディレクトリを生成する。とくに名前は決まっていないが、
ROSのホームページや他の参考ページの殆どはcatkin_wsとなっている。オプションの-Pをつけて、ソースコードファイルを保管するデイレクトリであるsrcを一気に作成してしまう。
cd ~
mkdir -p catkin_ws/src
cd catkin_ws
###ビルド(初期)
catkinでビルドして、ビルド条件など自動構成されるディレクトリやファイルを生成する。
cd ~
cd catkin_ws
catkin build
##4.VS Codeのビルド条件の設定とソースコード(トピックのパブリッシュとサブスクライバ:ROSのチュートリアルにあるやつ)
##VSCode起動
ワークスペースのディレクトリでVsCodeを起動する
cd ~
cd catkin_ws
code .
##Catkinのパッケージをエクステンション機能で生成
コマンドパレットより、>ROS -> Create Catkin Package で生成する。
例えば、パッケージ名:publishierとする。この時、依存関係も聞いてくるので、
基本的には、std_msgs roscpp
を使用すればよい。***Pythonの場合は、rospy
*を追加する。
##パッケージ内のCMakeListsを設定する(シンプルな設定とする)
関係のあるところ以外、全て省略としている。
(省略)
## 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
ソースコードは、自分で組んでもいいし、動作確認やROSのPUB/SUBを体感する(めんどくさい)場合は、
下記のソースをコピーして使うと良い。
###Publisher_node.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
{
"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ファイルの内容は下記である。
- pkg
- パッケージ名
- name
- ノードのエリアシス:ユニークな名前にすること。同じ名前は起動できない。アノニマスにすれば同じパッケージを起動できる。
- type
- Nodeのプログラム実行ファイル Pythonの場合がスクリプトファイル名(.py)
###launchファイル
<launch>
<node pkg="publisher" name="publisher" type="publisher_node"/>
</launch>
##VScodeのビルドタスクファイルの作成と設定
下記の要領で、タスクファイル(テンプレート)を生成する。
###タスクファイルの作成
タスクファイルの内容は下記のように書き換える。
なお、コマンド引数の--cmake-args" "-DCMAKE_BUILD_TYPE=Debug"
は、
デバッカを動かく(デバッグ)際に必要で、このオプションがないとブレークポイントが効かないので注意する。
###タスクファイル
{
"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
でビルドができるようになっている。
また、下記のようにメニュからビルドタスクを実行しても良い。
###メニュー>ビルドタスク
##VScodeのlaunch.Jsonの設定
launch.jsonファイルを作成し、Debug RUN
の実行条件に、ROSの.launch
ファイルを実行するように紐付けを行う。
launch.jsonファイルを下記のように書き換える。
なお、target
は、、ROSの.launch
ファイルの絶対パスを指定する。
絶対パスは、下記のようなコマンド調べられる。
###絶対パス
cd ~
cd catkin_win
pwd
###launch.json
{
"configurations": [
{
"name": "ROS: Launch",
"type": "ros",
"request": "launch",
"target": "/home/rosdevloper/catkin_ws/src/nodes.launch"
}
]
}
##5.VSCode 再度立ち上げ
lauch.jsonの作成または変更後、デバックRUN実行しても、上手く起動しないため、一度、VScodeを再度立ち上げしたほうがよい(2021/03/27時点)※良い方法がわかれば記事内容更新します。
##6.デバックRUN実行
設定などの誤りがなければF5
で実行できる。
###デバックRUN実行 失敗時のターミナルの様子
例:ノードが見つからない場合:ROSのLAUNCHファイルの絶対パスが違う
"target": "/home/rosdevloper/catkin_temp_ws/src/nodes.launch"
##7.Subscriber.cppの追加
同様にSubscriberのパッケージをエクステンション機能より生成し、Subscriberのソースコードをsrc/
追加する。
下記のソースをコピーして使うと良い。
#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;
}
##8. #4−5で該当箇所をもう一度行う。
###.launchの変更
<launch>
<node pkg="publisher" name="publisher" type=publisher_node"/>
<node pkg="subscriber" name="subscriber" type=subscriber_node"/>
</launch>
###c_cpp_properties.json
"includePath": [
"/opt/ros/melodic/include/**",
"/src/publisher/include/**",
"/src/subscriber/include/**",
"/usr/include/**"
}
###CMakeLists.txt
(省略:内容は同じ)
##8.デバック ブレークポイント
任意の場所でブレークポイントを行い、デバックRUN実行で、ブレークポイントが有効になっている!!
以上