前置条件:
- 安装 CMake 插件
- 安装 clangd 插件,并禁用或卸载 c++ intellisense插件
- 将 source /opt/ros/humble/setup.sh 添加到 ~/.bashrc,并source ~/.bashrc
下面愉快的开始配置吧😎
一、创建工作空间
mkdir -p ~/RosProject/ros_ws/src
二、创建包
cd ~/RosProject/ros_ws/src
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node robot_ctrl
三、vscode 打开 robot_ctrl 文件作为项目目录,并配置CmakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(robot_ctrl)
# 1. 指定C++版本
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 2. 自动在build目录下生成compile_commands.json文件
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
# 3. 引入所需要的包,否者找不到头文件!!!!
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(my_node src/my_node.cpp)
# 4. 添加依赖
ament_target_dependencies(my_node rclcpp std_msgs)
install(TARGETS my_node
DESTINATION lib/${PROJECT_NAME})
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
四、点击 CMake Build
五、下面添加头文件测试配置是否成功:
可以看到,成功引入包(rclcpp 和 std_msgs)对应的头文件
六、修改 package.xml文件,因为 colcon build 需要该文件,具体配置如下:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>robot_ctrl</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="ccy@todo.todo">ccy</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<!-- 添加依赖 -->
<build_depend>rclcpp</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>rclcpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
七、一切准确就绪,开始构建包
cd /home/ccy/RosProject/ros_ws
colcon build --packages-select robot_ctrl # 构建robot_ctrl包
八、运行包节点
cd /home/ccy/RosProject/ros_ws
# 设置工作空间环境变量,但只在当前终端有效。
# 若对每个终端有效,将source ~/RosProject/ros_ws/src/install 添加到 ~/.bashrc并souce ~/.bashrc
. install/setup.bash
ros2 run robot_ctrl my_node # robot_ctrl为包名、my_node为节点名
剩余有其它问题,都可以在网上找到,在此不多赘述。
需要重点说明一点:c_cpp_properties.json 是针对 c++ intellisense 插件的,它其中的一系列配置(比如 includePath)对 Clangd 插件无效。Clangd 添加头文件搜索路径的正确方式是在CMake中添加 include_directories,进而重新生成compile_commands.json,这样才能找到头文件。