论文:https://arxiv.org/abs/2501.11515
Github:https://github.com/sjtuyinjie/Ultra-Fusion.git
windows安装WSL2
手动安装
因为如果直接安装wsl --install,会下载不到你自己想要的Ubuntu 版本
1 | wsl --update |
然后设置WSL默认版本
1 | # 将 WSL 默认版本设置为 WSL 2 |
wsl1与wsl2区别:

官网下载Ubuntu版本

下载下来是一个后缀为AppxBundle文件,修改后缀为zip,然后解压

找到后缀为appx最大文件并且适合自己的windows版本,我的为x64
修改appx后缀为zip,然后解压,移动到想要自己安装的路径,例如移动到D盘

然后双击ubuntu.exe文件即可,初次打开会让你设置用户名和密码,然后在文件夹里生成一个ext4.vhdx文件

参考连接:https://blog.csdn.net/weixin_48076899/article/details/135214749
打开wsl
按win键输入wsl或者ubuntu即可打开
wsl相关命令如下
| 命令 | 功能说明 |
|---|---|
wsl |
直接启动默认 WSL 发行版,进入 Linux 交互终端 |
wsl --list |
查看已安装的所有 WSL 发行版 |
wsl --list --verbose |
查看已安装发行版的详细信息(版本、运行状态、默认标识) |
wsl --install |
一键安装 WSL2 + 默认 Ubuntu 发行版 |
wsl --install -d <发行版名> |
指定发行版安装 WSL |
wsl -d <发行版名> |
启动指定名称的 WSL 发行版 |
wsl --set-default <发行版名> |
设置指定发行版为默认启动系统 |
wsl --shutdown |
强制关闭所有正在运行的 WSL 虚拟机 |
wsl -t <发行版名> |
单独终止指定发行版的运行进程 |
wsl --set-version <发行版名> 2 |
将指定发行版切换为 WSL2 版本(推荐) |
wsl --get-default-version |
查看新建发行版默认使用的 WSL 版本 |
wsl --set-default-version 2 |
设置新建发行版默认使用 WSL2 |
wsl --export <发行版名> <保存路径> |
导出发行版镜像备份为 tar 文件 |
wsl --unregister <发行版名> |
注销指定发行版(删除所有数据,不可恢复) |
wsl --uninstall |
卸载 WSL 组件与虚拟机平台 |
wsl --help |
查看 WSL 命令的全部官方参数说明 |
wsl里推出到powershell :exit

挂载目录
默认挂载目录
| Windows 盘符 | WSL 内默认挂载路径 | 说明 |
|---|---|---|
| C: | **/mnt/c/** |
系统盘,可读写 |
| D: | **/mnt/d/** |
数据盘 |
| E: / F: / U 盘 | **/mnt/e/**``**/mnt/f/**``**/mnt/u/** |
所有固定 / 移动磁盘自动挂载 |
自定义挂载
1 | mkdir /home/ychooo/datasets |
这就相当于把wsl2中的/home/ychooo/datasets文件夹映射到windows的E:/Datasets文件夹
这里推荐使用mkdir,因为后续docker目录挂载如果使用sudo mkdir创建的目录,后续在docker中映射不到
使用:ro 代表只读挂载,不影响读取查看文件,但有 2 个坑:
- 容器内无法新建 / 修改文件,但原有文件一定能 ls 看到;
- 如果宿主机目录权限是 root,WSL 普通用户可读,但容器内 root 权限不兼容会看不见。
开机自动挂载
在wsl中执行
1 | sudo nano /etc/fstab |
如果重复挂载可以参考下列命令
1 | # 1. 查看重复挂载 |
参考链接:https://www.cnblogs.com/duzw/p/16594104.html
docker连接wsl2
下载docker desktop

连接时一定要启动这个位置

否则会报错
1 | failed to connect to the docker API at unix:///var/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /var/run/docker.sock: connect: no such file or directory |
在powershell输入命令
1 | ╰─wsl --list --verbose |
可查看运行,这样在wsl中可以检测到docker命令

相关docker命令如下
1 | docker exec -it 容器ID bash |
vscode连接wsl2
安装完成后先下载一些插件,如下相关远程的插件

安装完成后点左下角有一个 打开远程窗口->使用发行版连接到wsl->选择Ubunt版本,连接后如下

docker部署算法
安装Ultra-Fusion
1 | git clone https://github.com/sjtuyinjie/Ultra-Fusion.git |
启动容器rosbag2 ├─ /livox/imu sensor_msgs/msg/Imu ───────────────┐ └─ /livox/lidar livox_ros_driver2/msg/CustomMsg │ ↓ 转换节点 │ /livox/lidar_points PointCloud2 ───────┤ ↓ Ultra-Fusion LIO
1 | xhost +local:docker |
| 分类 | 参数 / 选项 | 核心作用 | 关键说明 |
|---|---|---|---|
| 基础运行 | docker run -dit |
后台启动容器并保留交互能力 | --name自定义容器名-d后台常驻不阻塞终端;-i保持标准输入打开;-t 分配伪终端,支持后续exec进入交互 |
--rm |
容器停止后自动删除容器,不会残留无用容器,清理更省心 | ||
| 网络与进程通信 | --net=host |
容器共享宿主机网络命名空间 | 不做网络隔离,直接复用宿主机网卡、IP、端口,解决 ROS2/DDS 设备发现、端口转发、网络延迟问题 |
| 网络与进程通信 | --ipc=host |
容器共享宿主机进程间通信命名空间 | 共享内存、信号量互通,解决 RViz/Gazebo 共享内存渲染崩溃、ROS2 大数据传输卡顿问题 |
| GUI 图形环境 | -e DISPLAY="${DISPLAY}" |
传递图形显示地址 | 告诉容器内 GUI 程序(RViz/Gazebo/Qt)渲染到宿主机 X11 显示服务器,否则会报无法连接显示的错误 |
| GUI 图形环境 | -e QT_X11_NO_MITSHM=1 |
关闭 Qt 共享内存扩展 | 经典排错参数,解决容器内 RViz 白屏、Gazebo 闪退、Qt 程序 X11 报错问题 |
| 数据卷挂载 | -v /tmp/.X11-unix:/tmp/.X11-unix:rw |
挂载 X11 图形套接字 | GUI 必备参数,容器通过该套接字和宿主机显卡通信,无此挂载无法弹出图形窗口,rw为读写权限 |
| 数据卷挂载 | -v /media:/media:ro |
挂载宿主机外接存储目录 | 只读(ro)映射 U 盘、移动硬盘等外接设备,容器内可直接读取数据集、标定文件 |
| 数据卷挂载 | -v "$(pwd)":/workspace |
挂载当前终端目录到容器 | 宿主机当前工作目录映射到器/workspace,默认读写,本地代码修改实时同步到容器,无需重新构建镜像 |
| 数据卷挂载 | -v /home/ychooo/ros2_ws/datasets:/root/datasets:ro |
挂载宿主机数据集目录 | 只读映射本地数据集文件夹到容器/root/datasets,保护原始点云 / 图像数据不被误修改 |
| 镜像标识 | ultrafusion-ros2:0.2.0 |
指定启动的容器镜像 | 基于 Ultra-Fusion 多传感器融合 ROS2 环境镜像,0.2.0 为指定的镜像版本标签 |
这里以自己录制的数据集为例
1 | [INFO] [1783862094.897458058] [rosbag2_storage]: Opened database 'rosbag2_2026_07_03-16_05_12/rosbag2_2026_07_03-16_05_12_0.db3' for READ_ON│> [ DataSync_Interpolation ] average time usage: 0.0013789 ms , called times: 1853 |
安装ROS2相关依赖
1 | apt install \ |
安装Livox驱动
数据及转换
我的数据bag 不能直接使用当前官方 Ultra-Fusion ROS2 v0.2.1 配置运行,原因是:
1 | /livox/lidar |
而 Ultra-Fusion ROS2 版本实际接收的是:
1 | sensor_msgs/msg/PointCloud2 |
官方的 M3DGR ROS2 流程也会先把 Livox CustomMsg 转换为 PointCloud2,再交给 uf_node。
正确链路为:
1 | rosbag2 |
修改/opt/ultrafusion/config/m3dgr/uf_m3dgr_ros2_lio.yaml的雷达和IMU话题
创建 CustomMsg → PointCloud2 转换节点
1 | touch Ultra_Fusion/scripts/livox_custom_to_pointcloud2.py |
运行算法
终端1:启动消息转换节点
1 | source /opt/ros/humble/setup.bash |
正常输出:
1 | Converting /livox/lidar CustomMsg -> |
终端2:启动 Ultra-Fusion
1 | source /opt/ros/humble/setup.bash |
应得到:
1 | /usr/bin/uf_node |
然后执行:
1 | mkdir -p ~/ultrafusion_output |
例如:
1 | uf_node ~/Ultra-Fusion/config/m3dgr/uf_m3dgr_ros2_lio.yaml |
官方 ROS2 版本使用的就是:
1 | uf_node 配置文件.yaml |
这种启动方式,不需要 ros2 launch。
终端3:启动 RViz2
1 | source /opt/ros/humble/setup.bash |
终端4:最后播放 bag
先进入 bag 所在目录,确认其结构:
1 | ls /你的bag路径/rosbag2_2026_07_03-16_05_12 |
通常应包含:
1 | metadata.yaml |
播放目录,而不是只写文件名:
1 | source /opt/ros/humble/setup.bash |
Rosbag2 可以播放包含 metadata.yaml 和数据库文件的 bag 目录。
第一次测试不要加速,保持一倍速。

其他
Tmux终端使用
1 | # 安装 |
tmux 快捷键汇总表(按功能分类)
一、会话(Session)操作快捷键
| 快捷键 | 功能说明 |
|---|---|
| Ctrl+b d | 分离当前会话,后台保留运行 |
| Ctrl+b s | 列出所有会话,可切换选择 |
| Ctrl+b $ | 重命名当前会话 |
二、窗口(Window)操作快捷键
| 快捷键 | 功能说明 |
|---|---|
| Ctrl+b c | 创建新窗口,状态栏会同步显示多窗口信息 |
| Ctrl+b p | 按状态栏顺序,切换到上一个窗口 |
| Ctrl+b n | 切换到下一个窗口 |
| Ctrl+b | 快速切换到指定编号的窗口 |
| Ctrl+b w | 弹出窗口列表,按上下键选择切换 |
| Ctrl+b , | 重命名当前窗口 |
三、窗格(Pane)操作快捷键
| 快捷键 | 功能说明 |
|---|---|
| Ctrl+b % | 垂直划分,生成左右两个窗格 |
| Ctrl+b “ | 水平划分,生成上下两个窗格 |
| Ctrl+b | 按方向键,将光标切换到对应方向的其他窗格 |
| Ctrl+b ; | 光标切换到上一个窗格 |
| Ctrl+b o | 光标循环切换到下一个窗格 |
| Ctrl+b x | 关闭当前窗格 |
| Ctrl+b ! | 将当前窗格拆分为独立的新窗口 |
| Ctrl+b z | 切换当前窗格的全屏/还原状态 |
| Ctrl+b q | 显示所有窗格的编号 |
