VS Code创建、调试ROS项目

前言:

在vs code下配置ROS项目开发的环境
包括catkin创建编译工作空间,创建ROS项目,调试ROS节点

一、创建工作空间

首先创建一个cMake工作空间,用到了catkin_make其实就是
cmake …
make
两个步骤的缩写。

$ mkdir -p ~/ros_test/src
$ cd ~/ros_test/
$ catkin_make

注意:每次打开工作空间ros_test文件要source一下

cd ~/ros_test
source devel/setup.bash

除此之外,启动ROS还需要source一下:
1)如果之前已经讲source整个语句放到了~/.bashrc中

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

可以直接运行:

source ~/.bashrc

检查通过:

gedit ~/.bashrc

2)如果没有的话就需要自己完整的source

source /opt/ros/melodic/setup.bash

至此,已经创建好了工作空间,

二、创建ROS项目

1、VSCode打开工作空间

用VSCode打开ros_test文件夹,会标示该文件为catkin_workspace,builddevelsrc都在,除此之外,会自动生成vscod文件里面有两个json文件:c_cpp_properties.jsonsetting.json.
VS Code创建、调试ROS项目_第1张图片c_cpp_properties.json

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "",
                "limitSymbolsToIncludedHeaders": true
            },
            "includePath": [
                "/opt/ros/melodic/include/**",
                "/home/xiaowei/catkin_ws/src/beginner_tutorials/include/**",
                "/usr/include/**"
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/clang",
            "cStandard": "c11",
            "cppStandard": "c++14"
        }
    ],
    "version": 4
}

“/home/xiaowei/catkin_ws/src/beginner_tutorials/include/**”,
settings.json
这一句

{
    "python.autoComplete.extraPaths": [
        "/home/xiaowei/catkin_ws/devel/lib/python2.7/dist-packages",
        "/opt/ros/melodic/lib/python2.7/dist-packages"
    ]
}

接下来需要将当前ROS工程的环境变量配置,输入:

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

之后直接source即可

source ~/.bashrc

2、创建ROS包

右键点击"src"文件夹,右键弹出选项中,点击"Create Catkin Package",输入包的名称ros_test,按Enter确认,输入包的依赖“std_msgs rospy roscpp”,空格隔开,按Enter确认。
在这里插入图片描述包创建完成,如下图。
VS Code创建、调试ROS项目_第2张图片在src文件夹下创建的程序包ros_test,包含includesrcCMakeLists.txtpackage.xml

3、cpp和CMakeLists.txt

主程序以talker和listener为例。
点击ros_test目录下的src文件夹,“右键”–>“新建文件”,输入talker.cpp,双击打开,粘贴以下代码。

#include 
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
    //ros节点初始化 "talker"节点名称,在ROS里同一时间不允许出现两个
    ros::init(argc,argv,"talker");
    //创建节点句柄
    ros::NodeHandle h;
    //创建一个publisher, topic:chatter,消息类型std_msgs::String
    ros::Publisher chatter_pub = h.advertise<std_msgs::String>("chatter",1000); // "chatter"话题名称,消息缓存
    //设置单循环的频率
    ros::Rate looprate(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();
        //按照之前设定的进行循环
        looprate.sleep();
    }
    
}

点击ros_test目录下的src文件夹,“右键”–>“新建文件”,输入listener.cpp,双击打开,粘贴以下代码。

#include 
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallBack(const std_msgs::String::ConstPtr &msg)
{
    ROS_INFO("I get: [%s}",msg->data.c_str());
}
int main(int argc, char **argv)
{
    //ros节点初始化 "listener"节点名称,在ROS里同一时间不允许出现两个
    ros::init(argc,argv,"listener");
    //创建节点句柄
    ros::NodeHandle h;
    //创建一个subscriber, topic:chatter,消息类型std_msgs::String, 接收到消息,响应chatterCallBack
    ros::Subscriber listener_sub = h.subscribe<std_msgs::String>("chatter",1000,chatterCallBack);
    
    //循环等待回调函数
    ros::spin();
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(ros_test)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)


## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

其中

add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)

意味:为可执行文件talker 和 listener添加对生成的消息文件的依赖以确保自定义消息的头文件在被使用之前已经被生成。

4、编译

点击"终端"–>“新建终端”,在终端中输入"catkin_make"
VS Code创建、调试ROS项目_第3张图片生成可执行文件后,接下来可以运行了,分别打开三个终端输入如下指令:

$ roscore
$ rosrun ros_test talker
$ rosrun ros_test listener

VS Code创建、调试ROS项目_第4张图片

三、调试ROS节点

1, 在VSCode左侧,点击Debug按钮,点击绿色小三角,在弹出的对话框中,选择环境为“C++(GDB/LLDB)"。此时VSCode会自动生成一个"launch.json"文件。

如果需要对talker.cpp进行断点调试,将:

"program": "enter program name, for example ${workspaceFolder}/a.out"

更改为:

"program": "${workspaceFolder}/devel/lib/ros_test/talker",

2、更改CMakeLists.txt
在project后面添加:

SET(CMAKE_BUILD_TYPE Debug)  

最后编译

$ roscore
$ catkin_make

3、断点调试
最后的断点调试是在终端里输入catkin_make产生的。
VS Code创建、调试ROS项目_第5张图片

四、Tips

这时,可能还有一些头文件找不到,比如ros/ros.h,我们还需要配置一些东西。
这时使用鼠标悬浮功能,点击“红色灯泡”,点击edit c_cpp_properties.json选项,vscode会自动在配置文件夹中新建.vscode/文件夹,同时在里面初始化了c_cpp_properties.json文件
在这里插入图片描述
用命令行编译我们写的c++代码,同时输出编译信息文件

catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes

这个命令会输出一个compile_commands.json文件在ROS工作空间的build文件夹下面

然后在c_cpp_properties.json文件添加下面一段话

"compileCommands": "${workspaceFolder}/build/compile_commands.json"

这样,就基本可以找到全部头文件了,然后就可以使用代码提示来码代码了。VS Code创建、调试ROS项目_第6张图片
最后如果需要编写Launch文件,参考之前的文章。

参考:
vscode开发ROS(3)-创建第一个ROS项目
ros项目调试:vscode下配置开发ROS项目

你可能感兴趣的:(ROS)