写在前面

Verti-Bench 是一个基于 Project Chrono 的高保真越野仿真平台,专门用于研究车辆在极端地形下的移动性能。本文记录了在 Ubuntu 20.04 上完整配置 Verti-Bench 的全过程,包括 ROS2 安装、Chrono 编译、Python 环境配置等所有步骤。

第一部分:系统准备

1.1 更新系统

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential cmake git curl wget

1.2 安装 NVIDIA 驱动和 CUDA

# 检查显卡驱动
nvidia-smi

# 如果未安装,安装驱动
sudo apt install nvidia-driver-525 -y
sudo reboot

# 安装 CUDA 11.8(注意:系统级安装,但后续在 conda 中使用)
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
# 安装时取消勾选 Driver,只安装 Toolkit

# 配置 CUDA 环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

第二部分:安装 ROS2 Foxy

2.1 添加 ROS2 源

# 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8

# 添加 ROS2 源
sudo apt install -y curl gnupg2 lsb-release
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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

2.2 安装 ROS2 Foxy

sudo apt update
sudo apt install -y ros-foxy-desktop python3-argcomplete
sudo apt install -y ros-foxy-geometry-msgs

# 安装 colcon 构建工具
sudo apt install -y python3-colcon-common-extensions

2.3 配置 ROS2 环境(不自动加载)

# 不自动加载,避免与 conda 环境冲突
# 需要时手动执行:source /opt/ros/foxy/setup.bash

第三部分:安装 Miniconda 并创建环境

3.1 安装 Miniconda

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# 按照提示完成安装
source ~/.bashrc

3.2 创建 Verti-Bench 专用环境

# 创建环境(指定 Python 3.9)
conda create -n verti_bench_env python=3.9 -y

# 激活环境
conda activate verti_bench_env

第四部分:安装 Python 依赖(严格按顺序!)

4.1 首先安装 NumPy 1.24.0(最关键!)

# 必须第一个安装,防止被其他包自动升级
conda install numpy=1.24.0 -c conda-forge -y

# 验证版本
python -c "import numpy; print('NumPy版本:', numpy.__version__)"
# 必须显示 1.24.0

4.2 安装 PyTorch

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

4.3 安装机器学习相关包

pip install gymnasium
pip install stable-baselines3[extra]

4.4 安装基础工具包

pip install pyyaml scipy evdev-binary matplotlib pandas

4.5 安装 OpenCV(兼容版本)

# 必须安装与 NumPy 1.24 兼容的版本
pip install opencv-python==4.5.5.64

4.6 版本锁定(防止未来升级)

# 创建 pinned 文件
echo "numpy ==1.24.0" >> $CONDA_PREFIX/conda-meta/pinned

第五部分:编译 grid_map(ROS2 依赖)

5.1 安装系统依赖

conda deactivate  # 临时退出 conda 环境
sudo apt install -y libeigen3-dev libtinyxml2-dev

5.2 克隆并编译 grid_map

# 创建工作空间
mkdir -p ~/Code/grid_map_ws/src
cd ~/Code/grid_map_ws/src

# 克隆 ros2 分支
git clone https://github.com/ANYbotics/grid_map.git -b ros2

# 安装依赖
cd ~/Code/grid_map_ws
source /opt/ros/foxy/setup.bash
rosdep install --from-paths src --ignore-src -r -y

# 设置 CMake 策略(解决版本兼容性问题)
export CMAKE_POLICY_VERSION_MINIMUM=3.5

# 编译
colcon build --symlink-install

# 验证编译结果
source install/setup.bash
ros2 pkg list | grep grid_map

第六部分:编译 PyChrono

6.1 克隆 Chrono 源码

# 回到 conda 环境
conda activate verti_bench_env

# 创建工作空间
mkdir -p ~/Code/verti_bench_workspace
cd ~/Code/verti_bench_workspace

# 克隆 Chrono(901分支)
git clone -b 901 https://gitee.com/zhangzicheng/chrono.git

6.2 安装编译依赖

# 系统依赖
sudo apt install -y libirrlicht-dev libgl1-mesa-dev libx11-dev \
    libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev \
    libglu1-mesa-dev freeglut3-dev libopenmpi-dev openmpi-bin \
    swig libeigen3-dev

# conda 依赖
conda install -c conda-forge mkl=2020 irrlicht=1.8.5 glfw -y

6.3 下载第三方依赖

# Blaze 3.8(Multicore 模块必需)
cd ~/Code/verti_bench_workspace
wget https://bitbucket.org/blaze-lib/blaze/downloads/blaze-3.8.tar.gz
tar -xzf blaze-3.8.tar.gz
mv blaze-3.8 ~/Code/third_party/blaze

# OptiX 7.7(Sensor 模块必需,需手动下载)
# 从 NVIDIA 官网下载后安装
cd ~/Code/third_party
chmod +x ~/Downloads/NVIDIA-OptiX-SDK-7.7.0-linux64-x86_64.sh
./NVIDIA-OptiX-SDK-7.7.0-linux64-x86_64.sh --skip-license --prefix=/home/bingo/Code/third_party/optix7

6.4 编译 tinyxml2(解决 CMake 配置缺失问题)

cd ~/Code/third_party
git clone https://github.com/leethomason/tinyxml2.git
cd tinyxml2
mkdir build && cd build
cmake .. \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=/home/bingo/Code/third_party/tinyxml2_install \
    -DBUILD_SHARED_LIBS=ON \
    -Dtinyxml2_INSTALL_CMAKEDIR=lib/cmake/tinyxml2
make -j4
make install

6.5 编译 urdfdom(PARSERS 模块必需)

# urdfdom_headers
cd ~/Code/third_party
git clone https://github.com/ros/urdfdom_headers.git
cd urdfdom_headers
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/home/bingo/Code/third_party/urdfdom_headers_install
make -j4
make install

# urdfdom
cd ~/Code/third_party
git clone https://github.com/ros/urdfdom.git
cd urdfdom
mkdir build && cd build
cmake .. \
    -DCMAKE_INSTALL_PREFIX=/home/bingo/Code/third_party/urdfdom_install \
    -Durdfdom_headers_DIR=/home/bingo/Code/third_party/urdfdom_headers_install/share/urdfdom_headers/cmake
make -j4
make install

6.6 配置并编译 Chrono

cd ~/Code/verti_bench_workspace
mkdir chrono_build && cd chrono_build

cmake ../chrono \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
    -DCH_ENABLE_MODULE_IRRLICHT=ON \
    -DCH_ENABLE_MODULE_VEHICLE=ON \
    -DCH_ENABLE_MODULE_SENSOR=ON \
    -DCH_ENABLE_MODULE_MULTICORE=ON \
    -DCH_ENABLE_MODULE_GPU=ON \
    -DCH_ENABLE_MODULE_PYTHON=ON \
    -DCH_ENABLE_MODULE_PARSERS=ON \
    -DCH_ENABLE_MODULE_OPENGL=ON \
    -DBUILD_DEMOS=OFF \
    -DBUILD_TESTING=OFF \
    -DOptiX_INSTALL_DIR=/home/bingo/Code/third_party/optix7 \
    -DOptiX_ROOT_DIR=/home/bingo/Code/third_party/optix7 \
    -DBLAZE_INSTALL_DIR=/home/bingo/Code/third_party/blaze \
    -Dtinyxml2_DIR=/home/bingo/Code/third_party/tinyxml2_install/lib/cmake/tinyxml2 \
    -Durdfdom_DIR=/home/bingo/Code/third_party/urdfdom_install/lib/urdfdom/cmake \
    -Durdfdom_headers_DIR=/home/bingo/Code/third_party/urdfdom_headers_install/share/urdfdom_headers/cmake \
    -DPYTHON_EXECUTABLE=$CONDA_PREFIX/bin/python \
    -DPYTHON_LIBRARY=$CONDA_PREFIX/lib/libpython3.9.so \
    -DPYTHON_INCLUDE_DIR=$CONDA_PREFIX/include/python3.9 \
    -DNUMPY_INCLUDE_DIR=$CONDA_PREFIX/lib/python3.9/site-packages/numpy/core/include

# 编译(根据 CPU 核心数调整 -j4)
make -j4

6.7 创建 sensor 模块包装器

# 进入 pychrono 目录
cd ~/Code/verti_bench_workspace/chrono_build/bin/pychrono

# 创建 sensor.py
echo "from _sensor import *" > sensor.py

第七部分:克隆 Verti-Bench

7.1 克隆仓库

cd ~/Code/verti_bench_workspace

# 使用浅克隆(避免网络问题)
git clone --depth 1 https://github.com/RobotiXX/verti_bench.git

# 拉取 LFS 文件
cd verti_bench
git lfs pull

7.2 验证数据文件

# 检查 OBJ 文件是否存在
ls -la envs/data/sensor/offroad/rock.obj

第八部分:配置环境变量

8.1 创建 Conda 激活脚本

mkdir -p $CONDA_PREFIX/etc/conda/activate.d

cat > $CONDA_PREFIX/etc/conda/activate.d/verti_bench.sh << 'EOF'
#!/bin/bash
# PyChrono 路径
export PYTHONPATH=/home/bingo/Code/verti_bench_workspace/chrono_build/bin:/home/bingo/Code/verti_bench_workspace/chrono_build/lib:$PYTHONPATH
export LD_LIBRARY_PATH=/home/bingo/Code/verti_bench_workspace/chrono_build/lib:$LD_LIBRARY_PATH
export CHRONO_DATA_DIR=/home/bingo/Code/verti_bench_workspace/verti_bench/envs/data/

# grid_map 路径
export PYTHONPATH=/home/bingo/Code/grid_map_ws/install/grid_map_msgs/lib/python3.8/site-packages:$PYTHONPATH

# Verti-Bench 路径
export PYTHONPATH=/home/bingo/Code/verti_bench_workspace:$PYTHONPATH

echo "✓ Verti-Bench Conda环境已激活"
echo "  CHRONO_DATA_DIR: $CHRONO_DATA_DIR"
echo ""
echo "注意: 如需ROS2功能,请手动执行: source /opt/ros/foxy/setup.bash"
EOF

chmod +x $CONDA_PREFIX/etc/conda/activate.d/verti_bench.sh

8.2 创建启动脚本

cat > ~/start_verti_bench.sh << 'EOF'
#!/bin/bash
source ~/miniconda3/etc/profile.d/conda.sh
conda activate verti_bench_env

cd /home/bingo/Code/verti_bench_workspace/verti_bench

echo "========================================"
echo "Verti-Bench 环境已就绪"
echo "Python: $(which python)"
echo "NumPy: $(python -c 'import numpy; print(numpy.__version__)')"
echo "========================================"

exec $SHELL
EOF

chmod +x ~/start_verti_bench.sh

第九部分:验证安装

9.1 创建验证脚本

cat > ~/validate_verti_bench.py << 'EOF'
#!/usr/bin/env python3
import sys
import os
import numpy
import pychrono.core
import pychrono.vehicle
import pychrono.sensor
import pychrono.irrlicht

print("✅ PyChrono 所有模块导入成功")
print(f"NumPy版本: {numpy.__version__}")
print(f"CHRONO_DATA_DIR: {os.environ.get('CHRONO_DATA_DIR', '未设置')}")

try:
    from grid_map_msgs.msg import GridMap
    print("✅ grid_map_msgs 导入成功")
except ImportError as e:
    print(f"❌ grid_map_msgs 导入失败: {e}")
EOF

chmod +x ~/validate_verti_bench.py

9.2 运行验证

conda activate verti_bench_env
python ~/validate_verti_bench.py

第十部分:运行测试

10.1 无渲染测试

cd ~/Code/verti_bench_workspace/verti_bench
python setup.py vehicle=hmmwv system=pid speed=4.0 world_id=1 render=false

10.2 带渲染测试

python setup.py vehicle=hmmwv system=pid speed=4.0 world_id=1 render=true

常见问题及解决方案

Q1: NumPy 版本冲突

症状: _ARRAY_API not found 错误
原因: opencv 或其他包自动升级了 NumPy
解决:

pip uninstall numpy -y
pip install numpy==1.24.0
pip install opencv-python==4.5.5.64
echo "numpy ==1.24.0" >> $CONDA_PREFIX/conda-meta/pinned

Q2: rock.obj 文件找不到

症状: Error loading OBJ file
原因: 路径错误或 LFS 文件未拉取
解决:

export CHRONO_DATA_DIR=/home/bingo/Code/verti_bench_workspace/verti_bench/envs/data/
cd /home/bingo/Code/verti_bench_workspace/verti_bench
git lfs pull

Q3: ROS2 和 Conda 环境冲突

症状: ros2: command not found 或 Python 版本错误
原因: 环境变量混合
解决: 不要自动加载 ROS2,需要时手动执行 source /opt/ros/foxy/setup.bash

Q4: grid_map_msgs 找不到

症状: No module named 'grid_map_msgs'
原因: Python 路径未包含 grid_map 安装目录
解决:

export PYTHONPATH=/home/bingo/Code/grid_map_ws/install/grid_map_msgs/lib/python3.8/site-packages:$PYTHONPATH

总结

经过以上步骤,你已经拥有了一个完整的 Verti-Bench 开发环境。这个环境包括:

  1. ✅ ROS2 Foxy(系统级安装,按需加载)
  2. ✅ Conda Python 3.9 环境(所有 Python 依赖)
  3. ✅ PyChrono 核心模块(core, vehicle, sensor, irrlicht)
  4. ✅ grid_map_msgs(ROS2 消息包)
  5. ✅ 所有 Verti-Bench 数据文件

现在你可以开始使用 Verti-Bench 进行越野仿真研究了!祝研究顺利! 🚗💨

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐