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 中最优雅、最通用的节点停止方式,它通过信号机制给予节点自我清理的机会,这是任何其他命令行工具难以完全替代的。

相关推荐
xwz小王子3 小时前
Science Robotics 让机器人学会“削果皮”:一种曲面物体操作任务转移的新方法
人工智能·机器人
xiaoduo AI3 小时前
客服机器人非工作时间能休眠?智能Agent开放平台定时唤醒,无人值守省资源?
大数据·人工智能·机器人
rit84324994 小时前
STM32 + DS3231 + TM1640 实时时钟数码管显示系统
stm32·单片机·嵌入式硬件
集和诚JHCTECH6 小时前
BRAV-7120加持,让有毒有害气体无处遁形
大数据·人工智能·嵌入式硬件
LCG元6 小时前
STM32实战:基于STM32F103的I2C通信(AT24Cxx EEPROM读写)
stm32·单片机·嵌入式硬件
code_pgf7 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
星恒讯工业路由器8 小时前
MCU+WiFi与CPU+WiFi模块区别
单片机·嵌入式硬件
LCMICRO-133108477468 小时前
长芯微LD7940完全P2P替代AD7940,是一款14位、逐次逼近型模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc
经济元宇宙9 小时前
全场景 AI 智能交互 专业级语音机器人推荐什么?
人工智能·机器人·语音识别
EriccoShaanxi10 小时前
高性能MEMS陀螺仪:精准导航,引领未来科技新风尚
科技·机器人·无人机