MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案

发布时间:2026/7/16 18:47:04
MPL_ROS与ROS 2迁移指南:从ROS Kinetic到ROS 2 Foxy的完整迁移方案 MPL_ROS与ROS 2迁移指南从ROS Kinetic到ROS 2 Foxy的完整迁移方案【免费下载链接】mpl_rosA ROS wrapper for trajectory planning based on motion primitives项目地址: https://gitcode.com/gh_mirrors/mp/mpl_ros欢迎来到MPL_ROSMotion Primitive Library ROS的ROS 2迁移完整指南 本文将详细介绍如何将基于运动基元的轨迹规划库从传统的ROS Kinetic平滑迁移到现代化的ROS 2 Foxy环境。无论您是机器人开发者还是ROS迁移新手这篇指南都将为您提供清晰的步骤和实用的技巧。MPL_ROS是一个强大的ROS包装器专门用于基于运动基元Motion Primitives的轨迹规划。该项目在ROS 1生态系统中已经相当成熟但随着ROS 2的普及迁移到新平台成为了必然趋势。本文将带您了解从ROS Kinetic到ROS 2 Foxy的完整迁移方案。 ROS 1与ROS 2架构对比在开始迁移之前让我们先了解两个版本的核心差异特性ROS 1 (Kinetic)ROS 2 (Foxy)通信机制TCPROS/UDPROSDDS (Data Distribution Service)节点生命周期简单启动/关闭完善的状态机管理参数系统基于XML动态参数服务构建系统catkincolcon amentPython版本Python 2.7Python 3.8MPL_ROS在2D占用网格地图中的轨迹规划效果 迁移准备与工具链1. 环境配置检查在开始迁移前请确保您的系统满足以下要求Ubuntu 20.04 (ROS 2 Foxy官方支持)ROS 2 Foxy Fitzroy已安装Python 3.8或更高版本CMake 3.5必要的依赖包libsdl1.2-dev,libsdl-image1.2-dev2. 项目结构分析MPL_ROS项目包含以下关键包每个都需要单独迁移motion_primitive_library- 核心轨迹规划算法planning_ros_msgs- ROS消息定义planning_ros_utils- ROS工具和插件mpl_external_planner- 外部规划器mpl_test_node- 测试节点和示例MPL_ROS在3D体素地图中的轨迹规划效果 消息定义迁移ROS 1消息文件分析在planning_ros_msgs/msg/目录中MPL_ROS定义了多个自定义消息类型VoxelMap.msg- 体素地图数据PrimitiveArray.msg- 运动基元数组PathArray.msg- 路径数组Trajectory.msg- 轨迹数据ROS 2消息迁移步骤步骤1创建新的package.xmlROS 2使用不同的package.xml格式?xml version1.0? ?xml-model hrefhttp://download.ros.org/schema/package_format3.xsd schematypenshttp://www.w3.org/2001/XMLSchema? package format3 nameplanning_ros_msgs/name version0.0.0/version descriptionROS 2 messages for MPL planning library/description maintainer emailsikangseas.upenn.edusikang/maintainer licenseApache-2.0/license buildtool_dependament_cmake/buildtool_depend dependstd_msgs/depend dependgeometry_msgs/depend dependnav_msgs/depend dependsensor_msgs/depend member_of_grouprosidl_interface_packages/member_of_group test_dependament_lint_auto/test_depend test_dependament_lint_common/test_depend /package步骤2更新CMakeLists.txtcmake_minimum_required(VERSION 3.5) project(planning_ros_msgs) # Default to C14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() 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(rosidl_default_generators REQUIRED) find_package(std_msgs REQUIRED) find_package(geometry_msgs REQUIRED) find_package(nav_msgs REQUIRED) find_package(sensor_msgs REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} msg/VoxelMap.msg msg/PrimitiveArray.msg msg/PathArray.msg msg/Trajectory.msg DEPENDENCIES std_msgs geometry_msgs nav_msgs sensor_msgs ) ament_export_dependencies(rosidl_default_runtime) ament_export_include_directories(include) ament_package()VoxelMap消息的类结构图 节点代码迁移ROS 1节点示例分析以mpl_test_node/src/map_planner_node.cpp为例ROS 1代码结构#include ros/ros.h int main(int argc, char **argv) { ros::init(argc, argv, test); ros::NodeHandle nh(~); ros::Publisher map_pub nh.advertiseplanning_ros_msgs::VoxelMap(voxel_map, 1, true); // ROS 1参数获取 double goal_x; nh.param(goal_x, goal_x, 2.4); ros::spin(); return 0; }ROS 2节点迁移版本#include rclcpp/rclcpp.hpp #include planning_ros_msgs/msg/voxel_map.hpp class MapPlannerNode : public rclcpp::Node { public: MapPlannerNode() : Node(map_planner_node) { // ROS 2参数声明 this-declare_parameter(goal_x, 2.4); this-declare_parameter(goal_y, 16.6); this-declare_parameter(goal_z, 0.05); // 获取参数值 double goal_x this-get_parameter(goal_x).as_double(); // 创建发布者ROS 2风格 map_pub_ this-create_publisherplanning_ros_msgs::msg::VoxelMap( voxel_map, rclcpp::QoS(10).reliable().transient_local() ); // 定时器回调 timer_ this-create_wall_timer( std::chrono::milliseconds(100), std::bind(MapPlannerNode::timer_callback, this) ); } private: void timer_callback() { auto message planning_ros_msgs::msg::VoxelMap(); // 填充消息... map_pub_-publish(message); } rclcpp::Publisherplanning_ros_msgs::msg::VoxelMap::SharedPtr map_pub_; rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char **argv) { rclcpp::init(argc, argv); auto node std::make_sharedMapPlannerNode(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }PrimitiveArray消息的类结构图 Launch文件迁移ROS 1 Launch文件示例mpl_test_node/launch/map_planner_node/test.launchlaunch node pkgmpl_test_node typemap_planner_node nametest_primitive outputscreen param namegoal_x value2.4/ param namegoal_y value16.6/ /node /launchROS 2 Launch文件迁移创建对应的Python launch文件from launch import LaunchDescription from launch_ros.actions import Node from launch.substitutions import LaunchConfiguration from launch.actions import DeclareLaunchArgument def generate_launch_description(): return LaunchDescription([ DeclareLaunchArgument( goal_x, default_value2.4, descriptionGoal X coordinate ), DeclareLaunchArgument( goal_y, default_value16.6, descriptionGoal Y coordinate ), Node( packagempl_test_node, executablemap_planner_node, nametest_primitive, outputscreen, parameters[{ goal_x: LaunchConfiguration(goal_x), goal_y: LaunchConfiguration(goal_y), goal_z: 0.05, v_max: 2.0, a_max: 1.0 }] ) ])️ 构建系统迁移ROS 1构建配置ROS 1使用catkin构建系统CMakeLists.txt示例cmake_minimum_required(VERSION 2.8.3) project(mpl_test_node) find_package(catkin_simple REQUIRED) find_package(motion_primitive_library REQUIRED) catkin_simple() cs_add_executable(map_planner_node src/map_planner_node.cpp) target_link_libraries(map_planner_node ${catkin_LIBRARIES})ROS 2构建配置ROS 2使用ament_cmakeCMakeLists.txt需要更新cmake_minimum_required(VERSION 3.5) project(mpl_test_node) # 默认使用C14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) find_package(planning_ros_msgs REQUIRED) find_package(motion_primitive_library REQUIRED) # 添加可执行文件 add_executable(map_planner_node src/map_planner_node.cpp) ament_target_dependencies(map_planner_node rclcpp std_msgs planning_ros_msgs ) # 链接库 target_link_libraries(map_planner_node ${motion_primitive_library_LIBRARIES} ) # 安装目标 install(TARGETS map_planner_node DESTINATION lib/${PROJECT_NAME} ) # 导出依赖 ament_export_dependencies(rclcpp std_msgs planning_ros_msgs) ament_package() 迁移检查清单代码层面检查头文件更新✅#include ros/ros.h→#include rclcpp/rclcpp.hpp消息头文件路径更新命名空间迁移✅ros::→rclcpp::消息类型planning_ros_msgs::VoxelMap→planning_ros_msgs::msg::VoxelMap参数系统更新✅nh.param()→declare_parameter()get_parameter()发布者/订阅者✅advertise()→create_publisher()QoS配置需要显式设置构建系统检查package.xml格式✅format2 → format3依赖声明更新CMakeLists.txt✅find_package(catkin)→find_package(ament_cmake)构建目标配置更新依赖管理✅确保所有ROS 1依赖都有对应的ROS 2版本运行时检查启动系统✅.launch文件 → Python launch文件参数传递方式更新工具链✅roscore→ 不再需要rosrun→ros2 runrostopic→ros2 topicMPL_ROS在SE(3)空间中的椭圆体模型轨迹规划 常见问题与解决方案问题1DDS配置问题症状节点无法发现彼此解决方案设置正确的DDS配置环境变量export RMW_IMPLEMENTATIONrmw_fastrtps_cpp export FASTRTPS_DEFAULT_PROFILES_FILEfastdds_config.xml问题2QoS配置不匹配症状消息丢失或延迟解决方案确保发布者和订阅者使用相同的QoS配置auto qos rclcpp::QoS(10) .reliable() .transient_local() .keep_last(10);问题3参数类型转换症状参数获取失败解决方案使用正确的类型转换方法// ROS 1 double value; nh.param(param_name, value, 0.0); // ROS 2 this-declare_parameterdouble(param_name, 0.0); double value this-get_parameter(param_name).as_double(); 迁移最佳实践1. 增量迁移策略从消息包开始迁移逐个迁移功能包保持ROS 1和ROS 2并行运行2. 测试驱动迁移为每个组件编写单元测试使用ROS 2的测试框架确保功能一致性3. 性能优化利用ROS 2的实时特性优化QoS配置使用组件化架构4. 文档更新更新README和文档添加ROS 2示例提供迁移指南PathArray消息的类结构图 性能对比与优化通信性能提升ROS 2的DDS通信机制相比ROS 1的TCPROS/UDPROS提供了更好的实时性和可靠性指标ROS 1 (Kinetic)ROS 2 (Foxy)提升幅度延迟10-50ms2-10ms5倍吞吐量100MB/s500MB/s5倍节点发现秒级毫秒级100倍内存使用优化ROS 2的内存管理更加精细通过以下方式优化零拷贝传输减少消息复制开销共享内存节点间高效数据共享内存池预分配减少动态分配 未来展望ROS 2 Humble兼容性MPL_ROS迁移到ROS 2 Foxy后可以进一步升级到更新的ROS 2版本Humble HawksbillLTS版本支持到2027年Iron Irwini最新稳定版本Jazzy Jalisco未来版本规划新特性集成迁移到ROS 2后MPL_ROS可以集成更多现代特性生命周期管理完善的节点状态机安全特性DDS安全层支持实时性能实时Linux支持容器化部署Docker/Kubernetes集成 总结MPL_ROS从ROS Kinetic迁移到ROS 2 Foxy是一个系统性的工程但通过本文提供的完整迁移方案您可以理解架构差异掌握ROS 1和ROS 2的核心区别逐步迁移组件从消息到节点从构建到部署解决常见问题避免迁移过程中的常见陷阱优化性能充分利用ROS 2的新特性迁移到ROS 2不仅能让MPL_ROS获得更好的性能和可靠性还能为未来的机器人应用开发奠定坚实的基础。现在就开始您的ROS 2迁移之旅吧✨核心建议采用渐进式迁移策略保持ROS 1和ROS 2的兼容性确保业务连续性。在迁移过程中充分利用ROS 2的测试工具和性能分析工具确保迁移质量。MPL_ROS在办公室环境中的地图和规划示例【免费下载链接】mpl_rosA ROS wrapper for trajectory planning based on motion primitives项目地址: https://gitcode.com/gh_mirrors/mp/mpl_ros创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考