feat(level1): ROS2 完全体 12 包 / 80 测试 / 23 文档 / 工程化 / Docker 分组

This commit is contained in:
xs
2026-08-04 10:19:47 +08:00
parent 5ef38ab508
commit 549d6b337e
141 changed files with 8949 additions and 1594 deletions
+37 -44
View File
@@ -1,5 +1,12 @@
# CMakeLists.txt - cpp_robot_tf2 包构建配置
#
# 设计思想:
# - JointStatePublisher + Tf2Listener 都是独立可执行(节点即进程)
# - 库 + 可执行分离(便于测试只链接库)
# - 显式声明每个 ament 依赖(不靠 ros2_defaults)
cmake_minimum_required(VERSION 3.16)
project(cpp_robot_tf2 VERSION 0.1.0)
project(cpp_robot_tf2 LANGUAGES CXX)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
@@ -9,56 +16,42 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)
# --- 节点 1:joint_state_publisher ---
# 发布 sensor_msgs/JointState,周期 ~100ms,内容为每个关节的当前角度。
# robot_state_publisher 节点(系统包)会消费 /joint_states + robot_description,
# 自动算出 base_link -> link1 -> link2 -> gripper 的 TF 链。
add_executable(joint_state_publisher src/joint_state_publisher.cpp)
ament_target_dependencies(joint_state_publisher
rclcpp sensor_msgs geometry_msgs
tf2 tf2_ros tf2_geometry_msgs
set(THIS_PACKAGE_INCLUDE_DEPENDS
rclcpp
sensor_msgs
geometry_msgs
tf2_ros
tf2
tf2_geometry_msgs
)
# --- 节点 2:tf2_listener ---
# 用 tf2::Buffer + TransformListener 监听 base_link -> gripper 的变换,
# 周期性打印抓取点在 base_link 系下的 (x, y, z)。
add_executable(tf2_listener src/tf2_listener.cpp)
ament_target_dependencies(tf2_listener
rclcpp sensor_msgs geometry_msgs
tf2 tf2_ros tf2_geometry_msgs
#
add_library(${PROJECT_NAME}_core SHARED
src/joint_state_publisher.cpp
src/tf2_listener.cpp
)
target_include_directories(${PROJECT_NAME}_core PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/${PROJECT_NAME}>
)
ament_target_dependencies(${PROJECT_NAME}_core ${THIS_PACKAGE_INCLUDE_DEPENDS})
# 可执行
add_executable(joint_state_publisher_cpp src/joint_state_publisher.cpp)
target_link_libraries(joint_state_publisher_cpp ${PROJECT_NAME}_core)
add_executable(tf2_listener_cpp src/tf2_listener.cpp)
target_link_libraries(tf2_listener_cpp ${PROJECT_NAME}_core)
# 安装
install(TARGETS
joint_state_publisher
tf2_listener
joint_state_publisher_cpp
tf2_listener_cpp
${PROJECT_NAME}_core
DESTINATION lib/${PROJECT_NAME}
)
# 把 urdf/ 整个目录安装到 share/<pkg>/urdf/,让 launch 可以读到 URDF。
install(DIRECTORY urdf
DESTINATION share/${PROJECT_NAME}/
install(DIRECTORY launch urdf
DESTINATION share/${PROJECT_NAME}
)
install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME}/
)
# --- 测试 ---
if(BUILD_TESTING)
find_package(ament_cmake_gtest REQUIRED)
ament_add_gtest(test_tf2_lookup test/test_tf2_lookup.cpp)
ament_target_dependencies(test_tf2_lookup
rclcpp sensor_msgs geometry_msgs
tf2 tf2_ros tf2_geometry_msgs
)
endif()
ament_package()