Visual Studio Code上でのROSノードの開発方法

VSCodeを用いた開発は初心者にもとっつきやすいため,この環境構築について以下に示す.
なお,Ubuntu20.04において検証をしている.
また,すでにROSのインストールと初期設定などは終わっていると仮定する.
加えて,”~/catkin_ws”がROS用のワークスペースと仮定する.
(作成日:2021年12月25日)

VSCodeのインストール

VSCodeは下記からdeb版をダウンロードする.このとき,~/Downloadsにダウンロードされているものとする.
ダウンロードをしたら,以下のようにしてインストールを行う.
(下記のバージョンはダウンロードするタイミングで変わると思われるので,参考として示す.)

$cd ~/Downloads
$sudo apt install ./code_1.63.2-1639562499_amd64.deb

初期設定

ここでは,VSCodeの初期設定を行う.
特にROSを利用することを前提に手順を示す.

まず,以下のようにVSCodeを起動する.

$cd ~/catkin_ws/src
$code .

起動後,左側にアイコンが並んでいるところの一番下にある”Extensions”を選択する.
”Search Extensions in Marketplace”というところで,”Japanese”と検索し,”Japanese Language Pack for VS Code”を選択・インストールし,指示に従いVSCodeを再起動する.

つづけて,再起動後,再度Extensionsから”ROS”と検索し,Microsoftの提供している”Visual Studio Code Extension for ROS”をインストールする.
加えて,Extensionsから”C++ Extension Pack”もインストールする.

VSCodeを用いたROSノードの作成

ここでは,実際にROSノードを作成しながら,VSCodeを用いた開発方法について学ぶ.
例として作成するノードは,beginner_tutorialsとし,ノードとして,talkerとlistenerを実装する.
また,C++で開発するものとする.

ノードの作成

ROSノードの作成のためには,”表示”ー>”コマンドパレット”かCtrl + Shift + Pのいずれかでコマンドパレットを起動する.
コマンドパレットにおいて,ROSと選択するとROSに関連するコマンドが表示されるので,”ROS:Create Catkin Package”を選択.
ここでは,”beginner_tutorials”というノードを作成することとする.
最初にパッケージ名が求められるので,以下のように入力する.

beginner_tutorials

つづいて,依存関係について聞かれるので,下記のように入力する.

roscpp rospy std_msgs

ここまで入力すると,package.xmlが開かれ,ノードを開発するための準備が行われる.
なお,生成される構造は以下のようになる.
beginner_tutorials
|——–include
|——–src
|——–CMakeLists.txt
|——–Package.xml

ここまでできたら,srcディレクトリの下に,”talker.cpp”というファイルを生成し,以下のコードをコピーする.

#include 
#include 
 
#include 
 
int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise("chatter", 1000);
 
  ros::Rate loop_rate(10);
 
  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg;
 
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();
 
    ROS_INFO("%s", msg.data.c_str());
 
    chatter_pub.publish(msg);
 
    ros::spinOnce();
 
    loop_rate.sleep();
    ++count;
  }
 
  return 0;
}

続いて,Listener.cppをtalker.cppと同じように,srcの下に作成する.

#include 
#include 
 
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;
}

続いて,CMakeLists.txtの一番下に以下のコードを追加する.

include_directories(include ${catkin_INCLUDE_DIRS})
 
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
 
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

続いて,”タスクの構成”のところで,タスクの設定を行う.
デフォルトだとビルドできないので,以下のように書き換える.

{
    "version": "2.0.0",
    "tasks": [
        {
	    "type": "catkin",
	    "args": [
		"build",
		"-DCMAKE_BUILD_TYPE=Release",
		"--cmake-args",
		"/home/parallels/catkin_ws"
	    ],
	    "problemMatcher": [
	        "$catkin-gcc"
	    ],
	    "group": "build",
	    "label": "catkin: build"
        }
    ]
}

ここまで来たら,作成したパッケージのビルドを行う.
メニューの”ターミナル”→”ビルドタスクの実行”からか,Ctrl + Shift + Bを実行し,”catkin:build”を選択すると,ビルドが実行される.

エラーがなければ次に進む.

roscoreの起動

VSCodeからroscoreの起動もできる.
初期状態では,VSCodeの左下に”×ROS1.noetic”となっているのを確認し,Ctrl+Shift+Pからコマンドパレットを起動して,”ROS:Start”を選択する.
このようにすることで,roscoreを起動することができる.
起動後,先ほどと同じVSCodeの左下の部分が”レROS1.noetic”となるので,これで起動していることがわかる.
なお,もし停止する場合は,同じくコマンドパレットから”ROS:Stop”を選択すると,停止することができる.

ノードの実行

ノードを実行するための方法として,コマンドパレットから実行する方法もあるのだが,面倒な気もするため,VSCode上でターミナルを起動してノードを実行する方法について示す.

メニューバーの”ターミナル”からターミナルを起動すると,VSCode下部に”ターミナル”が現れる.
ターミナルを分割するためには,同じく”ターミナル”から”ターミナルの分割”を選択する.
なお,表示されたターミナルの右側にもターミナルの分割が可能である.(詳細割愛)

各ターミナルを”ターミナル1”,”ターミナル2″としたときに以下のようにする.
また,roscoreは起動済みをする.
VSCodeは”catkin_ws/src”内で実行しているものとする.

ターミナル1

$source ../devel/setup.bash
$rosrun beginner_tutorials talker

ターミナル2

$source ../devel/setup.bash
$rosrun beginner_tutorials listener

以上のようにすることで,ノードのテストができる.

roslaunchの作成

続けて,VSCode内での開発を円滑に行うために,ノードを同時起動するためのスクリプト(lanuch)ファイルを作成する.
まず,beginner_tutorialsディレクトリの下にlaunchというディレクトリを作成する.
に,”beginner_tutorials.launch”というファイルを作成する.

作成後,以下のコードをコピーする.

 

launchファイルでは,XMLというメタ言語を用いている.これは,HTML等と同じように,機能毎に「タグ」でくくることで,呼び出し側に記述内容を判定させることができる.

「nodeタグ」は個別のノードに関する起動時の設定を表すことを宣言した要素タグである.

基本的にはこの中に起動するノードの情報などを記述していくことになる.

「node」タグの中には,以下のような属性を記述していく.

  • pkg:起動したいノードが含まれるパッケージ名
  • name:起動したノードの管理名.極論,わかれば何でも良い
  • type:起動したいノード
  • output:”screen”としたらROS_INFOの出力をターミナル上に表示,”log”としたらlogファイルに出力が保存される.

次に,launchファイルを用いてノードを起動する.
ターミナル1において,launchファイルを実行する.

ターミナル1

$source ../devel/setup.bash
$roslaunch beginner_tutorials beginner_tutorials.launch

このようにVSCodeのターミナルからでもlaunchファイルの起動ができる.

まとめ

以上のように,VSCodeにおいて,ROSのノードの開発から,システムの検証までが可能となる.
実際はROS用のExtensionからrosrunやroslaunchが可能であるが,なれるとターミナルの方からが楽なため,今回はこちらの方法で示した.
興味がある人はコマンドパレットからの実行方法を調べてみてほしい.