写于2025.06,当前ubuntu 20.04的各方面支持更加全面一点,如对ROS1和2都有良好的兼容性。如从ros bridge便能够表现出系统对包的支持。但是新的系统对新的硬件的支持更好,以及有更长的支持,在后期对新包的支持也会更好一点。

Ubuntu Version Supported ROS 1 Versions Supported ROS 2 Versions ros1_bridge Support
20.04 (Focal) Noetic Ninjemys Foxy Fitzroy (EOL), Galactic Geochelone (EOL), Humble Hawksbill ✅ Full support
22.04 (Jammy) ⚠️ Partial (unsupported officially) Humble Hawksbill, Iron Irwini ⚠️ Requires building from source
24.04 (Noble) ❌ Not available Jazzy Jalisco, Kilted Kaiju ❌ Not supported

本文将介绍ubuntu 2204的安装及ROS2 Humble版本的安装。


win11 + ubuntu22 双系统

以下是在 Windows 11 基础上安装 Ubuntu 22.04 LTS 的双系统详细指南,使用 Rufus 工具制作启动盘:


准备工作

  1. 备份重要数据

    • 双系统安装可能涉及磁盘分区操作,建议提前备份 Windows 中的重要文件。
  2. 准备工具

镜像名称 镜像地址 备注
网易镜像 http://mirrors.163.com/ubuntu-releases/ 覆盖主流版本
中科大镜像 http://mirrors.ustc.edu.cn/ubuntu-releases/ 更新及时,支持IPv6
阿里云镜像 http://mirrors.aliyun.com/ubuntu-releases/ 企业级CDN加速
清华大学镜像 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 教育网优化
北京理工大学镜像 http://mirror.bit.edu.cn/ubuntu-releases/ 北方用户推荐
浙江大学镜像 http://mirrors.zju.edu.cn/ubuntu-releases/ 华东地区节点
南京大学镜像 https://mirror.nju.edu.cn/ubuntu-releases/ 新增科学中心节点
上海交通大学镜像 http://ftp.sjtu.edu.cn/ubuntu-releases/ 上海骨干网接入
  1. 分配磁盘空间(可选) 如果磁盘足够,新版本ubuntu会在安装时,自行规划,也可自行配置,但一定要保证有足够的空间。

    • 在 Windows 中打开 磁盘管理(Win+X → 磁盘管理)。
    • 右键点击一个分区(如 C:),选择 压缩卷,分配至少 50GB 未分配空间(后续安装 Ubuntu 用)。
  2. 取消磁盘加密(关闭BitLocker)

  • 常规关闭方法

    • 打开控制面板 → 进入"BitLocker驱动器加密"
    • 找到需要解密的驱动器,点击"关闭BitLocker"
    • 等待解密完成(时间取决于数据量)
  • 快速关闭方法(Win10/11)

    • 按Win+I打开设置 → 隐私和安全性 → 设备加密
    • 直接点击"关闭"按钮
  • 命令行方法(管理员权限)

    • 以管理员身份运行CMD/PowerShell
    • 输入:manage-bde -off C:(C:为需要解密的盘符)
    • 查看进度:manage-bde -status

步骤 1:使用 Rufus 制作 Ubuntu 启动盘

  1. 插入U盘,以管理员身份运行 Rufus
  2. 设备选择:你的U盘(确认无误,数据会被清空)。
  3. 镜像选择:点击 选择,找到下载的 Ubuntu 22.04 ISO 文件。
  4. 分区类型:
    • UEFI 电脑:选择 GPT + FAT32
    • 传统 Legacy BIOS 电脑:选择 MBR + FAT32(现代电脑通常为 UEFI)。
  5. 其他选项保持默认,点击 开始 → 确认警告 → 等待完成(约5-10分钟)。

步骤 2:设置 BIOS/UEFI 启动项

  1. 重启电脑,在启动时狂按 F2/F12/Del(具体键因品牌而异)进入 BIOS。
  2. 关键设置:
    • 关闭 Secure Boot(Ubuntu 支持但可能需额外驱动)。
    • 确保 UEFI 模式 开启(如使用 GPT 分区)。
  3. 保存设置并退出(通常按 F10)。

步骤 3:安装 Ubuntu 22.04

  1. 启动安装程序

    • 从U盘启动后,选择 Try or Install Ubuntu → 进入试用桌面后双击 Install Ubuntu
  2. 语言和键盘布局

    • 选择语言 → 继续 → 键盘布局默认(英语或中文)。
  3. 网络连接(可选)

    • 可连接Wi-Fi,便于安装更新和第三方驱动。
  4. 安装类型

    • 重要!选择“安装类型”
      • 双系统共存:勾选 Install Ubuntu alongside Windows Boot Manager(自动分配空间)。
      • 手动分区(推荐高级用户):
        • 选择之前分配的 未分配空间 → 点击 + 创建分区:
          • /(根分区):至少 30GB,类型 ext4
          • swap(交换空间):内存大小的 1-2倍(可选)。
          • /home(用户文件):剩余空间,类型 ext4(可选)。
        • 启动引导器位置:选择 EFI 分区(通常为 /dev/sda/dev/nvme0n1efi 分区)。
  5. 时区和用户设置

    • 选择时区(如 Shanghai)→ 输入用户名和密码。
  6. 开始安装

    • 点击 安装 → 等待完成(约15-30分钟)。
  7. 重启

    • 提示拔出U盘后重启,此时会进入 GRUB 引导菜单,可选择启动 Ubuntu 或 Windows。

步骤 4:后续配置

  1. 更新系统

    • 打开终端(Ctrl+Alt+T),运行:
      sudo apt update && sudo apt upgrade -y
      
  2. 修复引导问题(如 Windows 不显示)

    • 在 Ubuntu 终端执行:
      sudo update-grub
      
  3. 驱动管理

    • 打开 软件和更新附加驱动(setting->Software update->Addtional drivers),安装推荐显卡/Wi-Fi驱动。

常见问题

国内镜像源

利用软件与更新更换
1、打开“系统设置(右上角的齿轮里或者启动器里)软件和更新”,如果没有更新过软件源,先设置更新软件源。
2、下载自:下拉框里选择 “其他站点” .可以选择右侧的的“选择最佳服务器”(但这样有时会选择国外的站点,所以推荐直接在左侧列表里选择中国的站点,点击china的下三角,就可以选择类似科大等等的源) 然后点击下面的 “选择服务器”。
3、关闭“软件和更新”窗口时,会弹出一个窗口,选择“重新加载”。然后会出现下面的“正在更新缓存”的窗口。等它更新完就行了。
这时候再使用sudo apt update便可以看到源已经更换了。

手动更换
以下是Ubuntu中文软件镜像源的官方网站地址列表,按机构类型分类整理,便于根据地理位置或网络环境选择:

大学教育网镜像源(适合教育网用户或高校环境)

  1. 清华大学镜像站
  2. 中国科学技术大学(USTC)镜像站
  3. 上海交通大学镜像站
  4. 北京理工大学镜像站

企业云服务镜像源(适合普通用户及开发者)

  1. 阿里云开源镜像站
  2. 华为云开源镜像站
  3. 腾讯云软件源

其他知名中文镜像源

  1. 网易163镜像站
  2. 兰州大学开源镜像站

配置建议

  • 图形界面配置:Ubuntu系统内置“软件和更新”工具(software-properties-gtk),可可视化切换镜像源。
  • 命令行配置:编辑/etc/apt/sources.list文件,替换为目标镜像源地址后执行sudo apt update生效。
  • 验证完整性:下载后需校验ISO文件的SHA256值(官网提供),避免镜像篡改风险。

注:部分镜像站(如南京大学、华中科技大学)未提供独立官网,需通过子目录访问Ubuntu资源(例:南京大学镜像)。完整列表可参考清华大学镜像站帮助页或阿里云开发者社区文档。

各种
  • 无法识别 Windows 分区:确保 Windows 为 正常关机(非快速启动)。

  • UEFI/GPT 错误:确认 Rufus 设置与 BIOS 模式匹配(UEFI → GPT)。

  • 磁盘空间不足:在 Windows 中压缩更多空间后,用 Ubuntu 安装器的 Something else 选项调整分区。

  • try and install Ubuntu 后黑屏可能是由于硬件如显卡比较新,导致驱动不兼容问题。可以选择第三行,使用兼容模式启动,然后安装。

  • 中文输入法
    安装中文输入法

sudo apt install ibus-libpinyin

然后终端输入ibus-setup打开配置界面->Input Method->Add 中文->智能拼音,add时没有中文智能拼音,重启一下。

系统setting界面(系统右上角,向下箭头->齿轮setting)->Input Sources(或键盘keyboard)点击“+”添加中文智能拼音

  • ubuntu 打字关闭触摸板

    • 使用 syndaemon 命令
      syndaemon 是一个命令行工具,可以监控键盘活动并在打字时禁用触摸板。
      示例:

      syndaemon -i 0.8 -K -t -d
      

      参数说明: -i 0.8:最后一次按键后等待 0.8 秒再启用触摸板。 -K:忽略修饰键(如 Ctrl、Alt)。 -t:仅禁用点击和滚动,允许鼠标移动。 -d:后台运行为守护进程。

      此命令将在后台运行,直到系统重启。如果需要开机自动运行,可将其添加到“启动应用程序”中。

    • 安装 Touchpad Indicator 工具

      Touchpad Indicator 是一个图形化工具,支持在打字时禁用触摸板,并提供更多自定义选项。

      安装步骤:
      打开终端,添加 PPA 并安装:

      sudo add-apt-repository ppa:atareao/atareao
      sudo apt update
      sudo apt install touchpad-indicator
      

      安装完成后,从应用程序菜单中打开 Touchpad Indicator,进入设置启用“打字时禁用触摸板”选项。

    • 修改配置文件(适用于 Xorg)永久禁用触摸板

      如果使用的是 Xorg 会话,可以通过编辑配置文件永久禁用触摸板。

      步骤:

      # 打开终端,编辑配置文件: 
      sudo vi /usr/share/X11/xorg.conf.d/40-libinput.conf
      

      libinput touchpad catchall 部分添加以下内容:
      Option "DisableWhileTyping" "True"
      保存并重启系统生效。

安装后没有wifi

查询网络设备:lshw -C network.如果出现“network UNCLAIMED”,说明没有网卡驱动。
查询网卡型号:lspci | grep -i net
查询具体无线网卡型号:lspci -nn | grep Network

  1. 手动下载匹配的网卡固件
    AX211需要iwlwifi-so-a0-gf-a0-xx.ucode系列固件(xx需77及以上版本),之前下载的ax201固件不匹配,需下载对应固件:
    # 进入固件目录
    cd /lib/firmware
    # 下载最新适配的固件(89版本兼容性好)
    sudo wget https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/iwlwifi-so-a0-gf-a0-89.ucode
    
    若下载失败,可在另一台有网设备打开链接下载,用U盘复制到Ubuntu的/lib/firmware目录。
  2. 重新加载驱动让固件生效
    固件放入后,重启驱动模块加载固件:
    # 先卸载iwlwifi模块
    sudo modprobe -r iwlwifi
    # 重新加载模块,此时会加载新固件
    sudo modprobe iwlwifi
    # 查看固件加载日志,确认无报错
    dmesg | grep iwlwifi
    
    若日志出现Detected Intel(R) Wi-Fi 6 AX211 160MHz等内容,说明固件加载成功。
  3. 重启网络管理服务调出wifi图标
    驱动和固件正常后,重启网络管理服务让系统显示wifi图标:
    # 重启NetworkManager
    sudo systemctl restart NetworkManager
    # 强制开启wifi功能
    nmcli radio wifi on
    
    此时顶部状态栏一般会出现wifi图标。若仍未显示,执行以下命令刷新网络状态:
    nmcli networking off && nmcli networking on
    
  4. 兜底:安装内核专用iwlwifi模块
    若上述步骤无效,安装当前内核对应的专用iwlwifi模块包,确保驱动与内核完全适配:
    sudo apt install linux-modules-iwlwifi-5.15.0-139-generic -y
    # 安装完成后重启电脑
    sudo reboot
    

重启后wifi图标通常会正常显示,若想验证,可执行nmcli device wifi list,能列出周边wifi网络即代表问题完全解决。

重复进入grub界面

启动盘有问题,但是还被选择了优先启动
针对Windows系统重复进入GRUB界面的问题,以下是综合解决方案:

在GRUB命令行输入以下命令找到windows分区,并重新启动windows系统(需每次手动操作):

grub> ls  # 列出分区,找到Windows所在分区(如(hd0,gpt1))
#分别ls 各个分区,如 grub> ls (hd0,gpt1) 查找windwos启动分区
grub> ls (hd0,gpt1) # 以及其他
#如果看到Filessystem type fat uuid xxx Total size 524288k(文件系统类型 FAT、总大小 524288KB(512MB)),该分区极大概率是 Windows 的启动分区(EFI 系统分区)
grub> set root=(hd0,gpt1)
grub> chainloader /efi/Microsoft/Boot/bootmgfw.efi
grub> boot
系统不能正常启动-使用recovery mode修复

如安装了显卡驱动,更新了内核版本等等,系统不能正常启动。
先不要着急重装,重启,进入grub菜单选择界面(就是选择登陆哪个系统的界面)。
选择“Advanced options for ubuntu” -> 选择带“recovery mode”的内核。
而后弹出修复菜单,选择“root” 可以以登陆root 终端,而后卸载相关的驱动,再重启。

此外,也可以在修复菜单中,选择“dpkg”,来修复破损包。

注意: Xorg Nouveau 与英伟达(NVIDIA)官方闭源驱动存在严重冲突,二者无法共存。

recovery mode失效

有手动boot分区的参考链接
当recovery mode都启动不了时,使用USB启动盘进行系统修复
当更新内核等等,使得recovery 都进不去时,可以使用启动盘来对系统进行修复。避免系统重装数据丢失。

‌Ubuntu内核损坏可以通过多种方式进行修复,常见方法包括使用Live CD/USB修复、使用GRUB恢复模式、重新安装内核等‌。
以下是具体的修复方法及操作步骤:

1 准备一个Ubuntu Live CD/USB系统启动盘(直接用rufus做好的启动盘)。
使用启动盘启动计算机,选择“试用Ubuntu”模式进入Live环境。

2 打开终端,查看系统对应的分区

sudo fdisk -l
#或
sudo blkid
#或
df -hT 

3 挂载损坏系统的根分区:
注: 以下的/mnt/root也可以直接是/mnt,或者自定义的其他路径。

sudo mkdir /mnt/root
sudo mount /dev/sdXn /mnt/root  # 替换/dev/sdXn为实际的根分区设备名

4 挂载其他必要的分区(如/boot、/home等):

# 如果装系统时有单独手动的/boot分区,则需要执行,默认分区不需要执行下边这一步
sudo mount /dev/sdXn /mnt/root/boot 
# 挂在
sudo mount --bind /dev /mnt/root/dev
sudo mount --bind /proc /mnt/root/proc
sudo mount --bind /sys /mnt/root/sys
操作 命令示例 本质
挂载设备 mount /dev/sda1 /mnt 接入新数据:将一个存储设备的内容添加到文件系统树中。
绑定挂载 mount --bind /A /B 映射现有数据:让同一个份数据(目录A)从两个不同的路径(A和B)都能被访问。

简单记忆:

  • 想用U盘、新硬盘?用 mount /dev/... /path
  • 想把一个目录“复制”或“映射”到另一个地方?用 mount --bind /old/path /new/path

5 使用chroot切换到损坏系统的环境:

sudo chroot /mnt/root

6 解决在修复时apt update 时,报temorary failure resolving tuna.tsinghua
修改DNS的步骤:
临时生效:sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf
永久生效:编辑/etc/systemd/resolved.conf,添加DNS=8.8.8.8,然后sudo systemctl restart systemd-resolved

DNS(Domain Name System)是互联网的“电话簿”,负责将人类可读的域名(如 www.baidu.com)转换为计算机可识别的 IP 地址(如 220.181.38.148)。若 DNS 配置错误或响应缓慢,会导致网页无法加载或访问延迟。
8.8.8.8是 Google 公共 DNS 服务器 的 IP 地址,提供免费、开放的域名解析服务。
备用服务器为 8.8.4.4,用于主服务器故障时的冗余支持

7 修复或重新安装内核:

apt update
apt install --reinstall linux-image-generic linux-headers-generic

更新GRUB引导加载程序:

update-grub

运行update-grub的时候报错:

sourcing file ‘/etc/default/grub’ sourcing file ‘/etc/default/grub.d/init-select.cfg’ /usr/sbin/grub-mkconfig: 275:cannot create /boot/grub/grub.cfg.new: Directory nonexistent和/usr/sbin/grub-probe

检查第4步 挂载如/boot分区是否对不对:
如果装系统时有单独手动的/boot分区,则需要找到/boot的分区,并mount到一个路径。
sudo mount /dev/sd<boot> /mnt/root/boot
如果是系统分区,这一步不需要执行。

退出chroot环境并重启计算机:

exit
sudo reboot

最次最次,直接mount 系统盘到一个文件下,就可以对数据进行访问,防止直接重装带来数据丢失。

win11 和 ubuntu互相访问

win11 读 ubuntu文件

关键在于让 Windows 能够识别并读取 Ubuntu 所用的分区格式。Ubuntu 通常采用 Ext4 等 Linux 特有的文件系统,而 Windows 自身并不能直接读写这些分区。

使用软件访问 Ext4 分区(推荐)

Windows 本身不支持直接读取 Linux 的 Ext4 文件系统,因此我们需要借助第三方工具。DiskInternals Linux Reader 是一个免费、易用且可靠的选择,它可以像文件管理器一样浏览 Ext4 分区。

  1. 下载并安装 DiskInternals Linux Reader
    访问 DiskInternals 官网或其他可信的软件下载平台,下载 Linux Reader 的安装程序,并按照提示在 Windows 11 中完成安装。

  2. 运行软件并定位分区
    打开 Linux Reader。软件会自动扫描并列出所有连接到电脑的磁盘分区,包括 Ubuntu 的 Ext4 分区。你需要在这些分区中找到你的 Ubuntu 系统分区(通常需要根据分区大小来判断)。

  3. 浏览并导出文件
    在 Linux Reader 中找到你的 Ubuntu 系统分区,然后依次展开目录,定位到存放的文件夹(例如 /home/你的用户名/xxx)。你可以直接预览图片,或者将文件复制(导出)到 Windows 的某个分区(如 NTFS 格式的 D 盘)。之后,你就可以在 Windows 中直接访问这些复制过来的图片了。
    在这里插入图片描述

    使用 DiskInternals Linux Reader 可以像在资源管理器中一样浏览 Ubuntu 分区内的文件。

在进行任何操作之前,请务必注意以下几点:

  • 谨慎操作:避免在 Windows 环境下直接修改或删除 Ubuntu 分区上的原始文件,以免误删系统文件或导致 Ubuntu 系统启动问题。
  • 优先考虑备份:对于非常重要的图片资料,建议先进入 Ubuntu 系统进行备份,然后再在 Windows 中进行操作。
  • 尝试替代方案
    • 使用共享分区:你可以在磁盘上创建一个单独的 NTFS 格式分区。因为 Windows 和 Ubuntu 都支持读写 NTFS 文件系统,所以可以将图片等需要共享的文件存放在这个分区中,这样在两个系统下都能直接访问。
    • 通过网络共享:如果在 Ubuntu 中配置 Samba 文件共享服务,就可以在局域网内通过 Windows 的网络邻居直接访问 Ubuntu 系统中的文件,无需额外软件。但这需要一定的网络配置知识。
    • 借助第三方云存储或工具:你也可以使用 U 盘、移动硬盘等物理介质中转文件,或者利用云存储服务(如 OneDrive、Dropbox)以及一些跨设备的文件同步工具(如 GCopy)来实现文件共享。
ubuntu文件读win11

安装好系统后,ubuntu2204直接将win下的文件系统到工具栏:
在这里插入图片描述
如果是20及以前,可能没有直接显示在工具栏,但是可以通过文件系统的其他位置看到win下的文件盘,然后访问:
在这里插入图片描述


ROS2 Humble 安装

确保系统区域支持UTF-8编码:

sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.

确保系统安装了ubuntu的官方源

sudo apt install software-properties-common
sudo add-apt-repository universe

一、准备工作

  1. 系统更新

在开始安装之前,确保你的 Ubuntu 22.04 系统是最新的。打开终端并运行以下命令:

sudo apt update
sudo apt upgrade -y
  1. 设置密钥和源

为了安装 ROS 2 Humble,首先,导入 ROS 2 的 GPG 密钥:

#官方key,公钥可能会变,可以查最新官网去拉
#官方地址:https://github.com/ros-infrastructure/ros-apt-source
# 其他人的 - **推荐**
sudo curl -sSL https://gitee.com/tyx6/rosdistro/raw/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
#以下是个人拷贝 不可用了
sudo curl -sSL https://gitee.com/nie_xun/ros-apt-source/tree/1.1.0/ros-apt-source/keys/ros-archive-keyring.gpg -o /usr/share/keyrings/ros-archive-keyring.gpg

然后,添加 ROS 2 Humble 存储库到你的 sources.list.d 目录:以下二者选其一。

#官方
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

#清华:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

二、安装 ROS 2

1. 安装依赖项

在安装 ROS 2 之前,你需要安装一些依赖项:

sudo apt update
sudo apt install -y curl python3-rosdep python3-rosinstall python3-rosinstall-generator python3-vcstool build-essential cmake git

2. 初始化 rosdep

rosdep 是一个工具,它可以帮助你安装 ROS 包所依赖的系统库。初始化 rosdep:

sudo rosdep init
rosdep update

如果rosdep不成功,rosdep timeout的问题,以下方法选一个就可以。

    1. 使用rosdepc
sudo apt-get install python3-pip 
sudo pip install rosdepc

sudo rosdepc init
rosdepc update
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list

export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
# 后面的参数是为了不跳过ROS版本
rosdep update --include-eol-distros
#建议写环境到bashrc《可选》
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc
sudo gedit /usr/lib/python3/dist-packages/rosdep2/sources_list.py
# 在大概64行 修改 DEFAULT_SOURCES_LIST_URL = 'https://gitee.com/tyx6/mytools/raw/main/ros/20-default.list'

sudo gedit /usr/lib/python3/dist-packages/rosdistro/__init__.py
# 大概在68行的地址

sudo gedit /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py
# 大概在34行的地址
 
sudo gedit /usr/lib/python3/dist-packages/rosdep2/rep3.py
# 大概在36行的地址

使用如下脚本内容更改:

#!/usr/bin/python3 python3
# -*- coding:utf-8 -*-
# @FileName  :Mrosdep.py
# @Author    :TFly
import os
import subprocess
from colorama import Fore,Style

url = "https://gitee.com/tyx6/rosdistro/raw/master"
url_list = "https://gitee.com/tyx6/mytools/raw/main/ros/20-default.list" 
ros_distros = ['kinetic', 'melodic', 'noetic', 'foxy', 'galactic', 'humble', 'iron', 'rolling']

def find_ros_setup_script():
    #ros_distros = ['melodic', 'noetic']
    for distro in ros_distros:
        setup_script = f"/opt/ros/{distro}/setup.bash"
        if os.path.exists(setup_script):
            return setup_script
    return None

def get_ros_version():
    try:
        ros_setup_script = find_ros_setup_script()
        if not ros_setup_script:
            print("ROS setup script not found.")
            return None

        command = f"source {ros_setup_script} && echo $ROS_DISTRO"
        ros_version = subprocess.check_output(['bash', '-c', command], universal_newlines=True).strip()
        return ros_version
    except subprocess.CalledProcessError as e:
        print(f"An error occurred while getting ROS version: {e}")
        return None

def rep(data):
    flag_list = data.find("https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list")
    if flag_list != -1:
        data = data.replace("https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list",url_list)

    flag = data.find("https://raw.githubusercontent.com/ros/rosdistro/master")
    flag1 = data.find("FUERTE_GBPDISTRO_URL = \'https://raw.githubusercontent.com/ros/rosdistro")
    flag2 = data.find("master/releases/fuerte.yaml")
    if flag != -1:
        data = data.replace("https://raw.githubusercontent.com/ros/rosdistro/master", url)
    if flag1 != -1:
        data = data.replace("https://raw.githubusercontent.com/ros/rosdistro",url)
    if flag2 != -1:
        data = data.replace("master/releases/fuerte.yaml","releases/fuerte.yaml")
    
    return data

def re_files(fileName):
    try:
        con = ""
        with open(fileName,'r') as fp:
            con = fp.readlines()
            for i in range(0,len(con)):
                con[i] = rep(con[i])

        with open(fileName,'w+') as fp:
            for str1 in con:
                fp.write(str1)
    except FileNotFoundError:
        print(fileName+'not found')
    else:
        print(fileName+' is ok')


if __name__ == '__main__':
    print(Fore.GREEN + '欢迎使用脚本,本脚本适用于ROS1、ROS2.\n'+
            'Test: ROS1 Melodic、ROS2 Noetic、ROS2 Humble' + Style.RESET_ALL)
    version = get_ros_version()

    if version not in ros_distros :
        print(Fore.RED + "不支持此版本、或版本获取失败!"+ Style.RESET_ALL)
    else:
        print(Fore.GREEN + "The ROS version is: " + version + Style.RESET_ALL)
        fileName = []

        if version == 'melodic' :
            fileName = ['/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py',
                    '/usr/lib/python2.7/dist-packages/rosdistro/__init__.py',
                    '/usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py',
                    '/usr/lib/python2.7/dist-packages/rosdep2/rep3.py']
        else:
            fileName = ['/usr/lib/python3/dist-packages/rosdep2/sources_list.py',
                    '/usr/lib/python3/dist-packages/rosdistro/__init__.py',
                    '/usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py',
                    '/usr/lib/python3/dist-packages/rosdep2/rep3.py']

            

        for name in fileName:
            re_files(name)

        print("修改成功!请执行下面命令:\n"+
                "sudo rosdep init\n"+
                "rosdep update")

3. 安装 ROS 2 核心包

现在,你可以安装 ROS 2 Humble 的核心包了:

sudo apt install -y ros-humble-desktop

这将安装 ROS 2 的核心功能,包括 RCL、RMW 实现、各种工具和示例节点。

三、设置环境变量

为了使 ROS 2 的命令和包在你的终端中可用,你需要将 ROS 2 的安装目录添加到你的 PATH 和 LD_LIBRARY_PATH 环境变量中。这通常通过在你的 shell 配置文件中添加以下行来完成(例如,~/.bashrc 或 ~/.zshrc):

source /opt/ros/humble/setup.bash

添加后,运行以下命令使更改生效:

source ~/.bashrc  # 或者 ~/.zshrc,取决于你使用的 shell

四、验证安装

为了验证 ROS 2 是否正确安装,你可以运行以下命令来检查 ROS 2 版本并启动一个简单的示例节点:

ros2 --version
ros2 node list  # 在另一个终端中运行一个 ROS 2 节点后再检查这个命令的输出

如果你还没有运行任何 ROS 2 节点,ros2 node list 命令可能不会返回任何内容。为了测试,你可以启动一个简单的 “talker” 和 “listener” 节点,它们是 ROS 2 教程中的示例节点。首先,确保你已经安装了 ros2-examples 包:

sudo apt install -y ros-humble-examples-rclcpp-minimal

然后,在两个不同的终端中分别运行以下命令:

# 在第一个终端中运行 talker 节点
ros2 run examples_rclcpp_minimal_talker talker
# 在第二个终端中运行 listener 节点
ros2 run examples_rclcpp_minimal_listener listener

自此,ROS2 Humble 安装完成。

常见问题

error: ‘shared_mutex’ in namespace ‘std’ does not name a type
解决办法:
ROS Noetic (Ubuntu 22.04) 等环境中,可能因 log4cxx 头文件与 C++17 冲突:

  • 解决方法
    修改 sudo vi /usr/include/log4cxx/boost-std-configuration.h
    #define STD_SHARED_MUTEX_FOUND 0   // 禁用 std::shared_mutex
    #define Boost_SHARED_MUTEX_FOUND 1  // 启用 Boost 版本
    
    然后重新编译项目。
gazebo

Ubuntu 22.04 完全可以同时安装两个gazebo版本: Gazebo Classic(11)Gazebo Fortress

维度 Gazebo Classic (11) Gazebo Fortress
启动命令 gazebo / roslaunch gazebo_ros ... ign gazebo / gz sim empty.sdf
ROS 集成 深度绑定 ROS 1,原生支持 完全独立,通过 gz_ros2_bridge 支持 ROS 2(无 ROS 1 官方支持)
配置文件 依赖 .world + ROS .launch 文件 直接用 .sdf 文件,无需 ROS 依赖
命令工具 单一 gazebo 命令 模块化 gz 命令族(gz sim/gz model/gz log 等)
  1. 架构:Classic 是单体架构(所有功能耦合在一个进程);Fortress 是模块化架构(拆分为仿真、物理、渲染、通信等独立模块,通过 GZ Transport 通信)。
  2. 核心技术
    • Classic:依赖 ROS 1 通信,物理引擎仅 ODE/Bullet,渲染 OGRE 1.9,支持 SDF 1.6。
    • Fortress:自研 GZ Transport(基于 DDS),模块化物理引擎(ODE/Bullet/PhysX 等),渲染 OGRE 2.1(性能提升 30%+),支持 SDF 1.9+。
  3. 能力:Fortress 性能更高、扩展性更强(可单独替换模块)、支持跨平台(Linux/Windows/macOS)和实时仿真;Classic 仅适合 Linux 下的 ROS 1 软件在环仿真。
  • ROS 1 项目 → 用 Classic;
  • ROS 2 项目无 ROS 纯仿真 → 用 Fortress(未来趋势)。
  • 使用过程中发现,source ros2的setup.sh后,gazebo calssic 加载会出现奇奇怪怪的问题。

参考链接

  1. fishros-ROS1&ROS2共存-https://fishros.org.cn/forum/topic/3943/ubuntu22-04%E4%B8%8B%E5%A6%82%E4%BD%95ros2-humble%E5%92%8C-ros1-%E5%85%B1%E5%AD%98/2

  2. 官方ROS Bridge-https://carla.readthedocs.io/projects/ros-bridge/en/latest/ros_installation_ros2/

  3. ros2 humble install-https://blog.csdn.net/weixin_55944949/article/details/140373710

  4. https://docs.ros.org/en/humble/How-To-Guides/Using-ros1_bridge-Jammy-upstream.html

  5. fishros-端口映射https://fishros.org.cn/forum/topic/2811/ros2-humble-docker-%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%E9%97%AE%E9%A2%98

  6. ros-官方-https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html

  7. 小鱼安装-https://blog.csdn.net/weixin_55944949/article/details/140373710

  8. 简洁版-https://blog.csdn.net/weixin_44197671

  9. ros1ros2 ubuntu20上共存:https://blog.csdn.net/zardforever123/article/details/130510145

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐