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 小时前
【deepseek】Prefetchable的bar是否需要自己处理缓存一致性
嵌入式硬件
BFT白芙堂2 小时前
高精度仿真引领机器人学习:以 Franka Research 3 为核心的 PolaRiS 评估框架深度解析
人工智能·学习·机器人·人机交互·具身智能机器人·franka
视觉&物联智能2 小时前
【杂谈】-新机器人竞赛的深层洞察:数据、模型与制造的博弈
人工智能·ai·机器人·制造·agi·具身智能
放下华子我只抽RuiKe53 小时前
机器学习终章:集成学习的巅峰与全流程实战复盘
开发语言·人工智能·python·机器学习·数据挖掘·机器人·集成学习
学术小白人3 小时前
【见刊通知】第二届绿色能源与机电工程国际学术会议(ICGEME 2025)
人工智能·机器人·能源·期刊·投稿·电气工程·rdlink研发家
学嵌入式的小杨同学3 小时前
STM32 进阶封神之路(十六):PWM 波深度实战 —— 定时器输出 + LED 调光 + 电机调速(库函数 + 寄存器)
stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程·智能硬件
ShiMetaPi3 小时前
从帧触发到事件驱动:RGB+EVS多模态融合下的无人机识别重构
嵌入式硬件·计算机视觉·嵌入式开发·无人机避障·事件相机
V搜xhliang02463 小时前
具身机器人在实际场景中的安全保障
人工智能·安全·计算机视觉·分类·机器人·知识图谱
飞睿科技4 小时前
UWB技术推动户外直播摄像跟随应用演进
嵌入式硬件·数码相机·目标跟踪·uwb·相机云台