概要

ROS(Robot Operating System,机器人操作系统)是一个用于机器人软件开发的开源操作系统(Meta-OS)—— 它不是传统的电脑 / 手机操作系统,而是一套工具库 + 通信框架,帮开发者快速搭建机器人应用(如移动导航、机械臂控制、无人机飞行等)。
在这里插入图片描述

核心定义

松耦合分布式通信是一种软件架构设计模式:将复杂系统拆解为多个独立的小型功能模块(分布式),模块间仅通过标准化极简接口交互,模块的内部实现、启停状态、部署位置变化,几乎不影响其他模块和整体系统运行(松耦合)。ROS是该模式最典型的落地实现。

1. 分布式通信(ROS节点视角)

集中式 vs 分布式

模式 特点 示例
集中式 所有功能写在单个程序/进程中,一处崩溃整体失效 单文件程序包含所有机器人逻辑
分布式 拆分为独立模块(ROS节点Node),各模块独立进程/设备运行,通过统一框架通信 hello_node、摄像头节点、路径规划节点各司其职

ROS中的体现

  • 每个功能模块对应一个ROS节点(如编写的hello_node),可运行在同一设备不同进程,或不同硬件(树莓派/笔记本/地面站);
  • 所有节点通过roscore(通信注册中心)完成数据交互,无需直接关联。

2. 松耦合(ROS通信机制视角)

紧耦合 vs 松耦合

模式 特点 示例
紧耦合 模块强绑定,A改则B必改,A未启动则B无法运行,A崩溃则B失效 电机控制代码内嵌在路径规划函数中
松耦合 模块依赖最小化,生命周期/实现/通信完全解耦 ROS节点间通过话题/服务通信

ROS松耦合核心特性

  1. 生命周期解耦:节点无启动顺序依赖(仅roscore需提前启动),hello_node可单独运行,其他节点启停不影响它;
  2. 实现解耦:模块内部逻辑修改不影响其他模块(如路径规划算法从A*改Dijkstra,只要/cmd_vel话题格式不变,电机节点无需改动);
  3. 通信解耦:基于「发布-订阅」模式,发布者仅负责发数据,订阅者仅负责收数据,彼此无需知晓对方存在,一方离线不导致另一方崩溃。

3. 核心优势(ROS场景落地)

优势 具体体现
容错性强 单个节点崩溃(如可视化节点),机器人核心导航/控制节点仍正常运行
开发效率高 多人协作开发不同节点,仅需约定话题/服务格式,可独立开发、测试
复用性高 摄像头驱动节点可直接复用在小车、机械臂、无人机等不同机器人系统中
扩展性强 新增避障功能仅需编写新节点,接入现有话题即可,无需修改原有系统代码

4. 关键误区纠正

分布式≠多设备:即使所有ROS节点运行在同一台笔记本(不同进程),通过话题松耦合通信,仍属于「松耦合分布式通信」;跨设备通信仅是该模式的延伸能力,非必要条件。

ROS核心概念总结

在这里插入图片描述

一、核心通信相关组件

1. 节点与节点管理器

在这里插入图片描述

  • 节点(Node):ROS的执行单元,是执行具体任务的独立进程/可执行文件,可部署在不同主机,节点名称唯一。
  • 节点管理器(ROS Master):ROS的控制中心,为节点提供命名、注册服务,建立节点间连接,管理运行时参数。

2. 话题通信(异步)

在这里插入图片描述

  • 话题(Topic):节点间传输数据的总线,采用发布/订阅模型,异步通信。
  • 消息(Message):话题传输的数据载体,有固定类型/结构,支持标准类型和自定义类型,通过.msg文件定义并编译生成对应代码。
  • 特点:多对多节点关系,有缓冲区,无反馈机制,实时性弱,适合持续的数据传输。

3. 服务通信(同步)

在这里插入图片描述

  • 服务(Service):节点间的同步通信机制,采用客户端/服务器(C/S) 模型,客户端发请求,服务器处理后返回应答。
  • 数据定义:通过.srv文件定义请求/应答数据结构,编译生成对应代码。
  • 特点:一对多节点关系(一个服务器),无缓冲区,有反馈机制,实时性强,适合单次的逻辑处理请求。

4. 话题vs服务核心区别

维度 话题 服务
同步性 异步 同步
通信模型 发布/订阅 客户端/服务器
反馈机制
缓冲区
实时性
节点关系 多对多 一对多
适用场景 数据传输 逻辑处理

5. 参数(Parameter)

  • 本质是全局共享字典,由ROS Master管理;
  • 适合存储静态、非二进制的配置参数,不适合存储动态数据,支持设置和获取操作。

二、文件系统相关核心概念

在这里插入图片描述

1. 功能包(Package)

ROS软件的基本单元,包含节点源码、配置文件、数据定义等所有相关文件。

2. 功能包清单(Package manifest)

记录功能包的基础信息,包括作者、许可、依赖选项、编译标志等。

3. 元功能包(Meta Packages)

用于组织多个实现同一目的的功能包,方便管理和使用。

4. 整体结构

以功能包为基础单元,元功能包对相关功能包做整合,多个功能包/元功能包构成ROS的软件仓库,形成完整的文件系统体系。

环境搭建

一、安装ubuntu

较为简单,不详细介绍。本文章使用的是单系统ubuntu20.04,推荐使用虚拟机。
1.虚拟机安装;2.双系统;

二、安装ROS

因为版本迭代导致各种出错的问题,推荐三个版本的 ROS 安装教程,Kinetic 对应于 Ubuntu16.04,Melodic 对应于Ubuntu18.04,Noetic 对应于 Ubuntu20.04,务必进行对应版本的 Linux 系
统的安装。本文章使用的是Noetic。根据自己需要的版本,进行安装:

2.1 Kinetic

http://wiki.ros.org/kinetic/Installation/Ubuntu

2.2 Melodic

http://wiki.ros.org/melodic/Installation/Ubuntu

2.3 Noetic

http://wiki.ros.org/noetic/Installation/Ubuntu
补充说明:英文阅读困难,这部分内容可以参考 ROSWiki 的中文版网站
http://wiki.ros.org/cn/

具体安装步骤为:

  1. 首先打开“软件和更新”对话框,具体可以在 Ubuntu 搜索按钮中搜索。进行配置(确保勾选了"restricted", “universe,” 和 “multiverse.”)
  2. 设置安装源:国内清华的安装源
 sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
  1. 设置key
 sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
  1. 安装ROS:
sudo apt update
sudo apt install ros-noetic-desktop-full

Desktop-Full(官方推荐)安装: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception

  1. 配置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
  1. 安装构建依赖
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

测试:

sudo rosdep init
rosdep update

提示:可参考http://wiki.ros.org/noetic/Installation/Ubuntu

三、安装 Clion

IDE工具使用参考: https://wiki.ros.org/IDEs

3.1 官网下载

https://www.jetbrains.com/clion/

3.2 安装IDE—Clion

  1. 下载后解压到用户目录(这里安装的是 ~/clion-2025.3.3)
  2. 进入 bin 目录,执行 sh clion.sh 启动
  3. 首次启动后,可通过 Tools → Create Desktop Entry 生成桌面快捷方式

编写第一个程序(ROS快速体验)

一、概述

在这里插入图片描述
在ROS中,主要涉及的编程语言是C++和Python。ROS中的大多数程序都可以用这两种语言实现。在本系列教程中,每个案例都将分别演示C++和Python两种实现方案,您可以根据自己的需求选择合适的语言。

即使使用不同的编程语言,ROS程序的实现流程也大致相同。以当前的HelloWorld程序为例,其实现流程主要包括以下步骤:

  1. 创建一个工作空间;
  2. 创建一个功能包;
  3. 编辑源文件;
  4. 编辑配置文件;
  5. 编译并执行。

在上述流程中,C++和Python仅在步骤3和步骤4的实现细节上有差异,其他步骤基本一致。在本节中,我们将首先实现C++和Python程序编写的通用部分,即步骤1和步骤2。然后在1.3.2节和1.3.3节中,我们将分别使用C++和Python来编写HelloWorld程序。

具体步骤为:

  1. 创建工作空间并初始化
mkdir -p sw1/first_ws/src
cd first_ws

在这里插入图片描述

catkin_make

catkin_make运行后,文件夹下会多出/bulid /devel目标
在这里插入图片描述

|--- WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

    |--- src: 源码

        |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts 存储python文件

            |-- src 存储C++源文件

            |-- include 头文件

            |-- msg 消息通信格式文件

            |-- srv 服务通信格式文件

            |-- action 动作格式文件

            |-- launch 可一次性运行多个节点 

            |-- config 配置信息

        |-- CMakeLists.txt: 编译的基本配置
  1. 创建package
cd first_ws/src
catkin_create_pkg helloros roscpp rospy std_msgs

cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

上述命令,会在工作空间下生成一个功能包,该功能包依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。

3.编译功能包

# 进入工作空间编译项目
cd .. #返回ws 工作空间
catkin_make 编译整个项目
  1. 使用clion打开package工程
    命令行打开src/package 或者图形界面直接打开src/package工程(这里为hellros功能包),编译器会报错。具体如下:
    在这里插入图片描述

CMakeLists.txt 文件中指定的最低 CMake 版本低于 3.5,而当前使用的 CMake 版本已经移除了对 3.5
以下版本的兼容支持。
直接更新 CMakeLists.txt 第一行的最低版本要求,将其改为 3.5

# 声明最低要求 3.5,且已适配到 3.20 的特性
cmake_minimum_required(VERSION 3.5)
project(YourProjectName)

在这里插入图片描述好像这样更改后,刷新无效。

步骤 2:全局添加 CMake 兼容参数
a. 打开 CLion → File → Settings → Build, Execution, Deployment → CMake;
b. 在 CMake options 输入框中,清空原有内容,粘贴以下参数:

-DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCATKIN_DEVEL_PREFIX:PATH=/home/chen/sw1/first_ws/devel -DCMAKE_PREFIX_PATH=/opt/ros/noetic`

c. 修改 Generation path 为:
#可不修改

/home/chen/sw1/first_ws/build

d. 点击「Apply」→「OK」。

在这里插入图片描述

这个错误表明 CMake 在配置过程中找不到 catkin 包,CMake 无法定位到 catkin 的安装路径
需要确认 ROS 版本并激活环境

建议按如下处理:

#关掉IDE-Clion
#工作空间下,在当面的命令行窗口注入一些系统环境
source devel/setup.bash
#到package包路径下
cd src/helloros/
#来到clion安装目录-启动文件(打开clion)
sh ~/clion-2025.3.3/bin/clion.sh

在这里插入图片描述

二、C++版

  1. 在 /home/chen/sw1/first_ws/src/helloros/src 下新建hello_node_cpp.cpp、
#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //执行 ros 节点初始化
    ros::init(argc,argv,"hello");
    //创建 ros 节点句柄(非必须)
    ros::NodeHandle n;
    //控制台输出 hello world
    ROS_INFO("cpp:hello world!");

    return 0;
}

在这里插入图片描述
5. 编辑 ros 包下的 Cmakelist.txt文件

add_executable(hello_node_cpp
  src/hello_node_cpp.cpp
)
target_link_libraries(hello_node_cpp
  ${catkin_LIBRARIES}
)
# add_executable(步骤3的源文件名  src/步骤3的源文件名.cpp)
# target_link_libraries(步骤3的源文件名  ${catkin_LIBRARIES})
  1. 进入工作空间目录并编译
cd ~/sw1/first_ws
catkin_make
  1. 执行

先启动命令行1:

roscore

再启动命令行2:

cd ~/sw1/first_ws #工作空间
source ./devel/setup.bash
rosrun 包名 C++节点

cd ~/sw1/first_ws #工作空间
source ./devel/setup.bash 
rosrun helloros hello_node_cpp

在这里插入图片描述

命令行输出: HelloWorld!

三、python版

在如上的基础上:
在这里插入图片描述

  1. 进入 ros 包添加 scripts 目录并编辑 python 文件
cd ros包
mkdir scripts

新建 python 文件: (文件名自定义)hello_node.py

#! /usr/bin/env python
"""
    Python 版 HelloWorld
"""
import rospy

if __name__ == "__main__":
    rospy.init_node("Hello")
    rospy.loginfo("Hello World!!!!")
  1. 为 python 文件添加可执行权限

chmod +x 自定义文件名.py

 chmod +x hello_node.py
  1. 编辑 ros 包下的 CamkeList.txt 文件

catkin_install_python(PROGRAMS scripts/自定义文件名.py DESTINATION
${CATKIN_PACKAGE_BIN_DESTINATION} )

catkin_install_python(PROGRAMS scripts/hello_node.py   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
  1. 进入工作空间目录并编译
cd ~/sw1/first_ws
catkin_make
  1. 执行

先启动命令行1:

roscore

再启动命令行2:

cd ~/sw1/first_ws #工作空间
source ./devel/setup.bash
rosrun 包名 C++节点

cd ~/sw1/first_ws #工作空间
source ./devel/setup.bash 
rosrun helloros hello_node.py
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐