ROS 入门实战:编写第一个 Hello World 程序(C++/Python)
介绍 ROS 开发环境搭建及第一个 Hello World 程序的编写流程。涵盖创建工作空间、功能包配置、C++ 与 Python 两种语言的代码实现、编译规则设置及运行步骤。详细对比了两种语言在 ROS 中的差异,并提供了常见问题排查指南,适合 ROS 初学者快速上手。

介绍 ROS 开发环境搭建及第一个 Hello World 程序的编写流程。涵盖创建工作空间、功能包配置、C++ 与 Python 两种语言的代码实现、编译规则设置及运行步骤。详细对比了两种语言在 ROS 中的差异,并提供了常见问题排查指南,适合 ROS 初学者快速上手。

本教程将带你从零开始,动手编写、编译并运行第一个 ROS 程序——经典的'Hello World',用两种主流语言(C++和 Python)分别实现。
ROS 程序主要使用 C++ 和 Python 实现,两者在 ROS 中地位相当:
无论使用哪种语言,编写一个 ROS 程序的核心流程都是固定的,就像一套标准化的'建房子'工序:
接下来,我们就严格按照这五步,完成我们的第一个 ROS 程序。本文将以 C++ 实现为例,详解每一步,并在最后对比给出 Python 的实现差异。
工作空间(Workspace)是你存放所有 ROS 代码项目的'项目总文件夹'。 打开终端(Ctrl+Alt+T),执行以下命令创建并进入一个名为 demo01_ws 的工作空间:
mkdir -p ~/demo01_ws/src
cd ~/demo01_ws/
mkdir -p 命令会递归创建目录。src 目录是存放所有功能包源代码的必备子文件夹。
在工作空间根目录(demo01_ws/)下,使用 ROS 内置命令初始化工作空间:
catkin_make
这个命令会自动在 demo01_ws 下创建 build 和 devel 两个文件夹,并生成一系列配置文件。看到大量编译日志并以 100% 结束,即表示初始化成功。
此时你的工作空间结构如下:
demo01_ws/
├── build/ # 编译中间文件,无需关心
├── devel/ # 生成的目标文件和环境设置脚本
└── src/ # 【核心】你的所有功能包源码都放这里
功能包(Package)是 ROS 中软件组织的基本单元,可以理解为你的一个'具体项目'或'功能模块'。 进入 src 目录:
cd src
使用 catkin_create_pkg 命令创建功能包:
catkin_create_pkg helloworld roscpp rospy std_msgs
roscpp:C++ 客户端库,用 C++ 写 ROS 程序必须。rospy:Python 客户端库,用 Python 写 ROS 程序必须。std_msgs:标准消息库,定义了常见的数据类型(如 Int32,String)。创建成功后,src 目录下会生成一个以你的功能包名命名的文件夹(helloworld/),里面包含了默认的文件结构。
现在我们来创建并编写真正的'Hello World'程序。 进入功能包的 src 目录(注意:是功能包下的 src,不是工作空间的 src):
cd ~/demo01_ws/src/helloworld/src
创建并编辑 C++ 源文件,例如命名为 helloworld_c.cpp:
gedit helloworld_c.cpp &
将以下代码复制进去:
// 1. 包含 ROS 的头文件
#include "ros/ros.h"
// 2. 主函数
int main(int argc, char* argv[]) {
// 3. 初始化 ROS 节点,节点名称为 "hello_node"
// 节点名称在运行时必须是唯一的。
ros::init(argc, argv, "hello_node");
// 4. 在 ROS 中输出日志信息 "hello world!"
ROS_INFO("hello world!");
return 0;
}
#include "ros/ros.h":包含 ROS C++ API 的核心头文件,必不可少。ros::init(...):初始化 ROS 节点。可以理解为给你的程序在 ROS 网络中'上户口'。ROS_INFO(...):ROS 中打印信息级别日志的宏,相当于 C++ 的 cout 或 C 的 printf,但功能更强大。ROS 使用 CMake 构建系统。我们需要告诉 CMake:编译哪个源文件?生成的可执行文件叫什么?需要链接哪些库? 打开功能包根目录下的 CMakeLists.txt 文件(与 src 文件夹同级):
gedit ~/demo01_ws/src/helloworld/CMakeLists.txt
找到文件中的 add_executable 和 target_link_libraries 部分(通常在文件后半部分),取消注释并修改:
修改一:定义可执行文件 找到类似下面的行:
#add_executable(${PROJECT_NAME}_node src/helloworld_node.cpp)
修改为(将 _node 前的部分替换为你的项目名,并指向你的源文件):
add_executable(haha src/helloworld_c.cpp)
src/helloworld_c.cpp:源文件的路径。修改二:链接 ROS 库 找到紧接着的 target_link_libraries 行:
#target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
修改为:
target_link_libraries(haha ${catkin_LIBRARIES})
这里的 haha 必须和上面 add_executable 里定义的名字完全一致。
房子盖好了,让我们启动它!
编译: 回到工作空间根目录(~/demo01_ws/),执行编译:
cd ~/demo01_ws
catkin_make
看到 100% 的进度提示,即表示编译成功。
执行:
roscore
这是 ROS 的'总机',所有程序运行前都必须先启动它。source devel/setup.bash
这条命令的作用是将你刚刚编译生成的功能包路径添加到当前终端的 ROS 环境变量中,这样 ROS 才能找到你的 helloworld 包。注意:此设置只对当前终端有效。rosrun helloworld haha
如果一切顺利,你将在这个终端中看到输出的 [ INFO] [时间戳]: hello world!。
Python 版本的流程在第 1、2、5 步完全一致。差异仅在第 3、4 步,因为 Python 是解释型语言,无需编译。
在功能包下创建一个 scripts 文件夹(通常用于存放 Python 脚本):
mkdir -p ~/demo01_ws/src/helloworld/scripts
cd ~/demo01_ws/src/helloworld/scripts
创建并编辑 Python 文件,例如 helloworld_p.py:
gedit helloworld_p.py &
写入以下代码:
#!/usr/bin/env python3
# 1. 导入 rospy 模块
import rospy
# 2. 主程序入口
if __name__ == "__main__":
# 3. 初始化 ROS 节点,节点名称为 "hello_node_py"
rospy.init_node("hello_node_py")
# 4. 在 ROS 中输出日志信息 "hello world! (Python)"
rospy.loginfo("hello world! (Python)")
#!/usr/bin/env python3:指定解释器为 python3。import rospy:导入 ROS 的 Python 客户端库。rospy.init_node("hello_node_py"):初始化 ROS 节点。rospy.loginfo():等同于 C++ 的 ROS_INFO()。重要:为 Python 脚本添加可执行权限:
chmod +x helloworld_p.py
输入 ll 查看是否有可执行权限。
Python 脚本需要被'安装'到正确的位置(主要是 devel 或 install 目录下的 lib 中),ROS 才能找到它。通常有简单方法和标准方法。
推荐简单方法:修改 package.xml,确保 <exec_depend> 标签包含 rospy。然后,你可以直接通过完整路径运行,或者用下面的标准方法配置。
标准配置方法: 在 CMakeLists.txt 中,找到 catkin_install_python 部分,取消注释并修改:
catkin_install_python(PROGRAMS scripts/helloworld_p.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
catkin_makesource devel/setup.bash
rosrun helloworld helloworld_p.py
注意,这里直接写脚本名 helloworld_p.py。source devel/setup.bash。chmod +x 脚本名.py。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online