ROS2学习笔记 - 1、编写运行第一个程序

1、ROS2开发环境准备

下面基于本地已经安装有Ubuntu虚拟机为前提、Ubutun安装教程

1.1、 安装必要工具
c 复制代码
sudo apt update && sudo apt install curl gnupg lsb-release -y
1.2、添加 ROS 2 GPG 密钥
c 复制代码
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
1.3、 创建独立的 ROS 2 源配置文件(使用阿里云镜像)
c 复制代码
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
https://mirrors.aliyun.com/ros2/ubuntu noble main" | \
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

配置好后、可以查看效果如下:

1.4、安装ROS 2

对于 Ubuntu 24.04,官方推荐的 ROS 2 版本是 Jazzy(2024年发布的 LTS 版本)

更新软件源

c 复制代码
sudo apt update

安装 ROS 2 Jazzy 桌面完整版(推荐)

c 复制代码
sudo apt install ros-jazzy-desktop -y
1.5、 配置环境变量

将ROS2的环境设置命令写入配置文件

c 复制代码
echo source /opt/ros/jazzy/setup.bash >> ~/.bashrc
  1. 让配置立即生效
c 复制代码
source ~/.bashrc
1.6、验证小乌龟是否可以正常运行
c 复制代码
ros2 run turtlesim turtlesim_node
1.7、安装 Ubuntu 24.04 兼容的 Mesa 驱动
c 复制代码
sudo apt install -y mesa-utils \
  libgl1-mesa-dri \
  libglapi-mesa \
  libgles2 \
  libegl1-mesa-dev

2、编写第一个 ROS2 程序

2.1、创建工作目录
c 复制代码
mkdir ros2_workspace  
2.2、在工作目录下创建功能包

创建 C++ 功能包

c 复制代码
ros2 pkg create c_package --build-type ament_cmake --license Apache-2.0 --dependencies rclcpp std_msgs 

运行结果如下:

创建 Python 功能包

c 复制代码
ros2 pkg create python_package --build-type ament_python --license Apache-2.0 --dependencies rclpy std_msgs

运行结果如下:

2.3、规范化目录

为了使用官方推荐的编译工具 colcon 需要把目录再规范一下、搞成下图的样子:

先创建 src 目录,再移动进去

c 复制代码
mkdir -p ~/ros2_workspace/src
mv ~/ros2_workspace/c_package ~/ros2_workspace/src/
mv ~/ros2_workspace/python_package ~/ros2_workspace/src/
2.4、第一个C++程序

在~/ros2_workspace/src/c_package/src/下创建第一个C++程序源文件: test.cpp 内容如下:

c 复制代码
#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<rclcpp::Node>("cpp_node");
    RCLCPP_INFO(node->get_logger(),"hello cpp node!");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

编辑 CMakeLists.txt

c 复制代码
nano ~/ros2_workspace/src/c_package/CMakeLists.txt

添加如下信息至文件:

c 复制代码
# ============================================
# 添加可执行文件(关键!)
# ============================================
add_executable(test_node src/test.cpp)
ament_target_dependencies(test_node rclcpp std_msgs)

# ============================================
# 安装可执行文件(关键!)
# ============================================
install(TARGETS
  test_node
  DESTINATION lib/${PROJECT_NAME}
)

修改后的效果如下:

要对程序进行编译、安装一个 colcon 的工具

c 复制代码
sudo apt update
sudo apt install python3-colcon-common-extensions

安装成功后、切换至 ~/ros2_workspace 目录、编译第一个程序:

c 复制代码
colcon build --packages-select c_package --event-handlers console_direct+

编译结果如下:

运行已经编译好的第一个程序:

加载环境
c 复制代码
source ~/ros2_workspace/install/setup.bash
运行节点
c 复制代码
ros2 run c_package test_node

🎉 成功了! ROS 2 C++ 节点已经正常运行了!

2.5、第一个python程序

在~/ros2_workspace/src/python_package/python_package/下创建第一个python程序源文件: test.py 目录结构如下:

编辑 test.py 内容如下:

c 复制代码
import rclpy
from rclpy.node import Node

def main():
    rclpy.init()
    node = Node("python_node")
    node.get_logger().info('Hello python node [info]')
    node.get_logger().warn('Hello python node [WARN]')
    rclpy.spin(node)
    rclpy.shutdown()

编辑 ~/ros2_workspace/src/python_package/setup.py 为程序填加入口

c 复制代码
entry_points={
    'console_scripts': [
        'test_node = python_package.test:main',
    ],
},

接下来就可以编译了:

c 复制代码
colcon build --packages-select python_package --symlink-install

加载环境、运行

c 复制代码
source ~/ros2_workspace/install/setup.bash
ros2 run python_package test_node

运行效果如下图:

2.6、完整目录结构
*** 编译后的完整的目录参考结构如下 ***
c 复制代码
~/ros2_workspace/                         # 工作空间根目录
│
├── 📂 src/                                # 【源代码目录】所有功能包都在这里
│   │
│   ├── 📂 c_package/                     # C++ 功能包
│   │   ├── 📄 CMakeLists.txt             # CMake 构建配置
│   │   ├── 📄 package.xml                # 包元信息(依赖、版本等)
│   │   │
│   │   ├── 📂 src/                       # C++ 源文件目录
│   │   │   └── 📄 test.cpp               # 在此处创建的第一个程序源文件
│   │   │
│   │   ├── 📂 include/                   # 头文件目录(可选)
│   │   │   └── 📂 c_package/
│   │   │
│   │   └── 📂 launch/                    # 启动文件目录(可选)
│   │       └── 📄 my_launch.py
│   │
│   └── 📂 python_package/                # Python 功能包
│       ├── 📄 setup.py                   # Python 包安装配置
│       ├── 📄 setup.cfg                  # 附加配置
│       ├── 📄 package.xml                # 包元信息
│       │
│       ├── 📂 python_package/            # Python 模块目录(与包同名)
│       │   ├── 📄 __init__.py            # Python 包标识
│       │   └── 📄 my_first_node.py       # 你的 Python 节点代码
│       │
│       ├── 📂 resource/                  # 资源文件
│       │   └── 📄 python_package
│       │
│       ├── 📂 launch/                    # 启动文件(可选)
│       │   └── 📄 my_launch.py
│       │
│       ├── 📂 test/                      # 测试文件
│       │   ├── 📄 test_copyright.py
│       │   ├── 📄 test_flake8.py
│       │   └── 📄 test_pep257.py
│       │
│       └── 📂 config/                    # 配置文件(可选)
│           └── 📄 params.yaml
│
├── 📂 build/                             # 【编译目录】colcon 自动生成
│   ├── 📂 c_package/                     # C++ 包的编译中间文件
│   ├── 📂 python_package/                # Python 包的编译中间文件
│   └── 📄 ...                            # 其他编译产物
│
├── 📂 install/                           # 【安装目录】colcon 自动生成
│   ├── 📂 c_package/                     # C++ 包安装后的文件
│   │   ├── 📂 lib/
│   │   ├── 📂 share/
│   │   └── 📄 setup.bash                 # 环境变量脚本
│   │
│   ├── 📂 python_package/                # Python 包安装后的文件
│   │   ├── 📂 lib/
│   │   ├── 📂 share/
│   │   └── 📄 setup.bash
│   │
│   ├── 📄 setup.bash                     # 总环境变量脚本(source 这个)
│   ├── 📄 setup.sh
│   └── 📄 ...
│
└── 📂 log/                               # 【日志目录】colcon 自动生成
    ├── 📄 build_2024-01-01_12-00-00.log
    ├── 📄 ...
    └── 📂 latest/                        # 最新编译日志的软链接
相关推荐
星恒随风3 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
§ꦿCFོ༉4 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
2603_969694856 小时前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
可乐ea6 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
Go Work10 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
Oll Correct10 小时前
Adobe illustrator 案例十四:花元素标志草图绘制
笔记·ui·adobe·illustrator
北京云帆互联科技12 小时前
云帆培训考试系统更新说明:v9.3.0
java·学习
sxlishaobin14 小时前
Maven Setting详解
java·学习·maven
每月一号准时摆烂14 小时前
服务器运维笔记(一)——使用shell编写实时查看BMC功率的脚本
运维·服务器·笔记
柳鲲鹏1 天前
内斗学概论:43、平级内斗
笔记