linux下使用VSCode调试运行ROS项目,具体步骤如下。
1.创建工作空间
#创建空间
mkdir -p ~/test_ws/src
cd ~/test_ws/
catkin_make
echo "source ~/test_ws/devel/setup.zsh" >> ~/.zshrc#我用的zsh,bash的话就换成bash
source ~/.zshrc
2.VSCode打开工作空间
3.创建包
右键“src”文件夹,选择“Create Catkin Package”,输入包的名称“testPkg”,按Enter确认,输入包的依赖“std_msgs rospy roscpp”,空格隔开,按Enter确认。
4.配置
主程序以talker和listener为例。 右键testPkg下的“src”–>“新建文件”,输入talker.cpp,双击打开,粘贴以下代码。
#include <iostream>
#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();
}
}
右键testPkg下的“src”->“新建文件”,输入listener.cpp,双击打开,粘贴以下代码。
#include <iostream>
#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;
}
打开testPkg下的“CMakeLists.txt”,文末添加如下内容。
#(可选)这几个修改如下,后俩是为了能找到自定义的头文件
add_compile_options(-std=c++11)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
catkin_package(
INCLUDE_DIRS include
# LIBRARIES vehSceNaviComm
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
#文末添加
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)
5.编译
打开终端,在工作空间目录下输入“catkin_make”。
编译完成后,在不同终端下分别输入如下命令即可完成运行。
roscore
rosrun testPkg talker
rosrun testPkg listener
6.调试ROS节点
菜单栏选择 终端-任务配置(或者按下 ctr+shift+p 进入搜索框,找到任务配置)-C/C++: g++ build active file
会自动创建tasks.json文件,修改如下。
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "builtCpp", //自己命名
"command": "catkin_make -DCMAKE_BUILD_TYPE=Debug",
"args": [],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
菜单栏选择 运行-添加配置(或者按F5)-C++ (GDB/LLDB)-g++ build and debug active file
会自动创建launch.json文件,修改如下。
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/devel/lib/vehSceNaviComm/talker",//要调试的可执行文件
"args": [],
"stopAtEntry": false,//设为true则调试运行时会先停在程序开始
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "builtCpp",//要与tasks.json中label的值保持一致
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
启动roscore之后即可F5调试运行talker节点。
PS:如果编译出错说找不到什么_generate_messages_cpp的问题,重启一下vscode试试,我就是这样就没问题了(或者在终端的工作空间下输入source devel/setup.zsh)。
参考
https://zhuanlan.zhihu.com/p/150331361?from_voters_page=true
https://blog.youkuaiyun.com/weixin_35695879/article/details/85254422