ubuntu22.04: 安装ROS2并测试

1. 安装步骤

  1. 设置语言环境

    确保系统支持UTF-8,这对ROS2的正常运行很重要。

    bash 复制代码
    locale  # 检查当前语言环境
    sudo apt update && sudo apt install locales
    sudo locale-gen en_US en_US.UTF-8
    sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
    export LANG=en_US.UTF-8
    locale  # 再次检查,确保设置成功
  2. 添加ROS2软件源

    首先确保universe仓库已启用,然后添加ROS2官方的GPG密钥和软件源。

    bash 复制代码
    sudo apt install -y software-properties-common curl
    sudo add-apt-repository universe
    sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
  3. 安装ROS2 Humble

    更新软件包列表后,安装完整版的ROS2。这会包含库、工具、示例等所有内容。

    bash 复制代码
    sudo apt update
    sudo apt upgrade # 可选,但建议先升级系统现有包
    sudo apt install -y ros-humble-desktop-full
  4. 设置环境变量

    bash 复制代码
    echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
    source ~/.bashrc
  5. 安装开发工具和依赖管理工具
    ros-dev-tools包含编译ROS工作空间所需的工具,python3-rosdep用于管理项目依赖。

    bash 复制代码
    sudo apt install -y ros-dev-tools python3-rosdep
  6. 初始化rosdep

    这是很多新手容易漏掉的步骤,但它对后续编译其他ROS包很重要。

    bash 复制代码
    sudo rosdep init
    rosdep update

    如果遇到报错: ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml\]:

    Failed to download target platform data for gbpdistro:

    The read operation timed out

**使用国内工具 rosdepc。**这相当于rosdep的国内优化版,解决了网络问题和依赖源问题

bash 复制代码
sudo pip3 install rosdepc

sudo rosdepc init

rosdepc update

2. 如何判断ros2是否安装成功?

查看环境变量

首先确保ROS2环境已生效:

bash 复制代码
source /opt/ros/humble/setup.bash
printenv | grep -i ROS

如果安装成功,你应该能看到类似输出:

bash 复制代码
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DOMAIN_ID=0
ROS_DISTRO=humble

查看版本号

bash 复制代码
echo $ROS_DISTRO
printenv ROS_DISTRO

输出应为humble


运行官方示例验证

运行ROS2自带的talker-listener示例

bash 复制代码
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker

应该看到不断输出的消息:

bash 复制代码
[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'

如果能正常通信,说明ROS2安装完整无误。

启动乌龟模拟器

bash 复制代码
ros2 run turtlesim turtlesim_node

# 新终端启动键盘控制
ros2 run turtlesim turtle_teleop_key

如果能看到乌龟窗口并能用键盘控制,说明图形界面和通信都正常。

3. 如何杀死启动的节点?

停止方式 命令示例 原理 是否执行清理 风险
优雅终止(推荐) Ctrl + C 发送 SIGINT 信号 ✅ 是
命令行终止(生命周期) ros2 lifecycle set ... 通过服务接口控制 ✅ 是 仅适用于生命周期节点
命令行终止(系统命令) kill <PID> 发送 SIGTERM 信号 ✅ 是(默认处理) 需要先找到PID
强制终止 kill -9 <PID> 发送 SIGKILL 信号 ❌ 否 可能留下临时文件/资源未释放
关闭终端 点击 ❌ 按钮 终端退出时发送 SIGHUP ❌ 否 可能造成资源泄露

为什么没有ros2 node stop 命令?

ROS2的设计者有意没有提供这样一个命令,原因如下:

1. 哲学层面:ROS2是去中心化的

ROS2没有中心化的节点管理器(不像ROS1的roscore)。每个节点都是独立的进程,ROS2本身不知道 节点是如何启动的,也不应该替用户决定何时停止。

2. 技术层面:停止一个节点意味着什么?

一个节点被"停止"可能涉及:

  • 是否需要保存当前状态?

  • 是否需要发布"即将下线"的消息?

  • 是否需要等待正在处理的任务完成?

  • 是否需要通知其他节点?

不同的节点有不同的需求,ROS2无法提供一个通用的"停止"实现。

lifecycle(仅适用于生命周期节点)

bash 复制代码
# 生命周期节点才有这些状态
ros2 lifecycle set /node_name configure
ros2 lifecycle set /node_name activate
ros2 lifecycle set /node_name deactivate
ros2 lifecycle set /node_name shutdown

Ctrl+C 成为标准的原因

  1. 简单:不需要额外命令

  2. 通用:适用于任何ROS2节点

  3. 规范:给予节点完整的生命周期

  4. 一致:所有终端程序都这样用

Ctrl + C 是 ROS2 中最优雅、最通用的节点停止方式,它通过信号机制给予节点自我清理的机会,这是任何其他命令行工具难以完全替代的。

相关推荐
点灯小铭2 分钟前
基于单片机的智能感应式汽车雨刮器控制系统设计
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
独小乐2 分钟前
007.GNU C内联汇编杂谈|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·汇编·单片机·嵌入式硬件·arm·gnu
清风6666664 分钟前
基于单片机的自动存包柜设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
点灯小铭18 分钟前
基于单片机的火焰与温度联动检测及声光灭火控制系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
不做无法实现的梦~1 小时前
STM32 上部署 MAVLink 协议教程
stm32·单片机·嵌入式硬件
进击的小头1 小时前
第5篇:嵌入式处理器内核全解析:TI DSP各个系列核心差异与选型指南
单片机·嵌入式硬件
广药门徒1 小时前
PADS 复用模块的使用
嵌入式硬件
HIZYUAN1 小时前
AG32 MCU可以替代STM32+CPLD吗 (二)
stm32·单片机·嵌入式硬件·fpga开发·agm ag32·国产mcu+fpga·低成本soc
kobesdu1 小时前
ORB-SLAM3:从特征提取到稠密点云建图
机器人·ros·orbslam
IT WorryFree15 小时前
肺癌机器人专用技能定制(OpenClaw-Medical-Skills 适配版)
机器人