【从零开始学ROS】ubuntu20.04+clion+ros环境搭建
文章目录
概要
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松耦合核心特性
- 生命周期解耦:节点无启动顺序依赖(仅
roscore需提前启动),hello_node可单独运行,其他节点启停不影响它; - 实现解耦:模块内部逻辑修改不影响其他模块(如路径规划算法从A*改Dijkstra,只要
/cmd_vel话题格式不变,电机节点无需改动); - 通信解耦:基于「发布-订阅」模式,发布者仅负责发数据,订阅者仅负责收数据,彼此无需知晓对方存在,一方离线不导致另一方崩溃。
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/
具体安装步骤为:
- 首先打开“软件和更新”对话框,具体可以在 Ubuntu 搜索按钮中搜索。进行配置(确保勾选了"restricted", “universe,” 和 “multiverse.”)
- 设置安装源:国内清华的安装源
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'
- 设置key
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
- 安装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
- 配置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 安装构建依赖
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
- 下载后解压到用户目录(这里安装的是 ~/clion-2025.3.3)
- 进入 bin 目录,执行 sh clion.sh 启动
- 首次启动后,可通过 Tools → Create Desktop Entry 生成桌面快捷方式
编写第一个程序(ROS快速体验)
一、概述

在ROS中,主要涉及的编程语言是C++和Python。ROS中的大多数程序都可以用这两种语言实现。在本系列教程中,每个案例都将分别演示C++和Python两种实现方案,您可以根据自己的需求选择合适的语言。
即使使用不同的编程语言,ROS程序的实现流程也大致相同。以当前的HelloWorld程序为例,其实现流程主要包括以下步骤:
- 创建一个工作空间;
- 创建一个功能包;
- 编辑源文件;
- 编辑配置文件;
- 编译并执行。
在上述流程中,C++和Python仅在步骤3和步骤4的实现细节上有差异,其他步骤基本一致。在本节中,我们将首先实现C++和Python程序编写的通用部分,即步骤1和步骤2。然后在1.3.2节和1.3.3节中,我们将分别使用C++和Python来编写HelloWorld程序。
具体步骤为:
- 创建工作空间并初始化
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: 编译的基本配置
- 创建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 编译整个项目
- 使用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++版
- 在 /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})
- 进入工作空间目录并编译
cd ~/sw1/first_ws
catkin_make
- 执行
先启动命令行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版
在如上的基础上:
- 进入 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!!!!")
- 为 python 文件添加可执行权限
chmod +x 自定义文件名.py
chmod +x hello_node.py
- 编辑 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} )
- 进入工作空间目录并编译
cd ~/sw1/first_ws
catkin_make
- 执行
先启动命令行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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)