
一、ROS和ROS2的区别对比维度ROS 1ROS 2核心架构基于Master的中心化架构。所有节点Node的发现和通信都需要通过Master进行。去中心化的分布式架构。基于DDS节点之间通过DDS的发现协议直接发现和通信无需中心节点。通信机制1.基于TCPROS/UDPROS自定义的序列化协议。2. 通信实时性较差不适合硬实时系统。1.基于DDS提供了丰富的QoS策略可以精细控制通信的可靠性、持久性、历史记录等。2. 支持实时通信。系统支持主要支持Linux (Ubuntu)对Windows和macOS支持较弱。跨平台原生支持Linux、Windows、macOS甚至RTOS。编程接口1. 支持C (roscpp)和Python (rospy)。2. API设计同步多异步支持较弱。1. 支持C (rclcpp)和Python (rclpy)API风格统一。2. 大量使用异步编程模型更好地与现代语言特性结合。多机器人支持支持有限通常需要为每个机器人启动单独的Master或者通过复杂的命名空间和重映射来实现。原生支持。通过DDS的分区Partition和域Domain机制可以轻松支持多机器人协作和分布式系统。安全性缺乏内置的安全机制。通信默认是明文的需要依靠外部工具如VPN、防火墙来保障安全。内置安全机制。DDS-Security协议支持身份验证、访问控制、通信加密等功能适用于对安全性要求高的场景。构建系统使用Catkin构建系统与CMake集成但相对复杂。使用ament构建系统是Catkin的改进版。同时引入了colcon作为统一的编译工具。启动文件使用.launch (XML格式)功能强大但语法冗长。使用.launch.py (Python格式)用Python脚本编写逻辑更灵活功能更强大。实时性不支持实时性要求不适合机器人控制和工业控制等硬实时系统。支持实时性。通过配置DDS和操作系统可以实现实时通信和控制。生命周期管理节点管理简单启动后即运行关闭后即退出缺乏统一的管理接口。引入Managed Nodes概念。为节点定义了标准化的生命周期如未配置、未激活、激活、关闭等方便系统统一管理和状态监控。参数服务器中心化的参数服务器所有节点可以读写存在单点故障和性能瓶颈。去中心化。每个节点有自己的参数但ROS 2也提供了一个基于服务的参数API可以实现类似功能但更灵活。环境变量依赖大量环境变量如ROS_PACKAGE_PATH、ROS_MASTER_URI配置相对复杂。环境变量依赖较少主要使用DDS相关配置和AMENT_PREFIX_PATH等。社区与生态生态成熟拥有大量积累的算法库和工具。但新功能开发已基本停止主要转向维护。生态正在快速发展和完善许多ROS 1的主流库已经或正在移植到ROS 2。是未来ROS发展的主要方向。主要目标主要用于学术研究和快速原型开发。面向产品化、工业化和商用化解决了ROS 1在生产环境中面临的实时性、安全性和可靠性问题。这里我选择ROS2进行学习。二、ROS2核心概念三、工作空间1、创建工作空间mkdir -p ~/study_ws/srcstudy_ws为自定义的工作空间名2、编译工作空间cd ~/study_ws/ 进入到工作空间下进行编译colcon build 找不到colcon命令安装colconsudo apt install python3-colcon-ros3、设置环境变量source install/local_setup.sh # 仅在当前终端生效echo source ~/study_ws/install/local_setup.sh ~/.bashrc# 所有终端均生效study_ws为自定义的工作空间名图1 工作空间根目录src代码空间未来编写的代码、脚本都需要人为的放置到这里build编译空间保存编译过程中产生的中间文件install安装空间放置编译得到的可执行文件和脚本log日志空间编译和运行过程中保存各种警告、错误、信息等日志。四、功能包1、创建功能包命令的格式ros2 pkg create --build-type build-type package_name1pkg表示功能包相关的功能2create表示创建功能包3build-type表示新创建的功能包是C还是Python的如果使用C或者C那这里就跟ament_cmake如果使用Python就跟ament_python4package_name新建功能包的名字开发者自己定义2、创建C功能包cd ~/study_ws/src功能包在src路径下创建ros2 pkg create --build-type ament_cmake learning_pkg_clearning_pkg_c自定义的功能包名3、编译功能包cd ~/study_ws # 切换路径到工作空间根目录下colcon build # 编译创建的功能包source install/local_setup.sh #再次设置环境变量只执行此条即可五、节点1. 节点的定义机器人的每一项功能就像一个工作细胞。在ROS中这种“细胞”被称为节点。节点是机器人功能的基本组成单元。2. 节点的本质从操作系统角度看节点就是进程。每个节点都是一个可以独立运行的可执行文件。例如运行一个Python程序或执行C编译生成的结果。3. 节点的开发语言节点可以使用不同的编程语言编写。支持语言包括C、Python、Java、Ruby等。4. 节点的分布节点可以运行在不同的硬件载体上。例如位于计算机A、计算机B或运行在云端。这种特性称为分布式。5. 节点的命名每个节点在ROS网络中必须有唯一的名称。通过节点名称可以查找特定节点或查询其状态。6. 节点的比喻总结节点就像工厂里的工人。各自完成不同的任务分布在不同的岗位。他们互相可能不认识但共同协作推动整个机器人系统完成复杂工作。六、案例从LuckyGO例程开始先来实现一个最为简单的节点功能并不复杂就是循环打印一个“Lucky,GO!”字符串到终端中。图2 功能包内部结构node_LuckyGo.cpp#include chrono #include thread #include rclcpp/rclcpp.hpp /** * 说明ROS2节点示例 - 发布“Lucky, GO”日志信息使用面向过程的实现方式 */ int main(int argc, char * argv[]) { // ROS2 C 接口初始化 rclcpp::init(argc, argv); // 创建ROS2节点对象并进行初始化 auto node rclcpp::Node::make_shared(node_LuckyGo); // ROS2系统是否正常运行 while (rclcpp::ok()) { // ROS2日志输出 RCLCPP_INFO(node-get_logger(), Lucky, GO!); // 休眠控制循环时间 (1秒) std::this_thread::sleep_for(std::chrono::seconds(1)); } // 节点对象会在智能指针超出作用域时自动销毁 // 关闭ROS2 C 接口 rclcpp::shutdown(); return 0; } // 运行命令 // colcon build // source install/local_setup.sh // ros2 run learn_c node_luckygoCMakeLists.txtcmake_minimum_required(VERSION 3.8) project(learn_c) 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) # 添加可执行文件,可执行文件名node_luckygo add_executable(node_luckygo src/node_LuckyGo.cpp) # 链接库 ament_target_dependencies(node_luckygo rclcpp) # 安装可执行文件 - 使用 ${PROJECT_NAME} 而不是 ${learn_c} install(TARGETS node_luckygo 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()package.xml?xml version1.0? ?xml-model hrefhttp://download.ros.org/schema/package_format3.xsd schematypenshttp://www.w3.org/2001/XMLSchema? package format3 namelearn_c/name version0.0.0/version descriptionTODO: Package description/description maintainer emailseantodo.todosean/maintainer licenseTODO: License declaration/license buildtool_dependament_cmake/buildtool_depend dependrclcpp/depend test_dependament_lint_auto/test_depend test_dependament_lint_common/test_depend export build_typeament_cmake/build_type /export /package运行结果图3 打印Lucky,GO!七、节点命令的常用操作节点运行格式ros2 run package name executable name查看节点列表ros2 node list查看节点信息ros2 node info node_name