Files
ros_contorl/docs/ENVIRONMENT.md
T
2026-10-09 14:51:03 +08:00

12 KiB
Raw Blame History

环境安装(按本机快照复现)

本文是 2026-10-09 在这台工控机上核对过的软件栈,用来在另一台电脑上装出同一套能跑本仓库的环境。 核对来源:/etc/os-release、conda-meta/history、conda list、~/flexiv_install 的 cmake 版本文件、nvidia-smi。

日常怎么用已经装好的环境,看 QUICKSTART.md。本文只回答「从一台空的 Ubuntu 装到能 source scripts/env.sh」。


1. 本机现在是什么

项 本机实测
系统 Ubuntu 22.04.5 LTS,x86_64,内核 6.8.0-138-generic
GPU NVIDIA GeForce RTX 3090 24GB,驱动 595.91.07(DKMS)。nvidia-smi 报告的 CUDA 是驱动上限 13.2
推理用的 CUDA 不装系统 CUDA toolkit。PyTorch / TensorRT 用 pip wheel 自带的 CUDA 12.4 用户态库
ROS Humble。本机 没有 /opt/ros/humble,ROS 在 conda 里(RoboStack)
Conda Anaconda3 装在 ~/anaconda3,conda 25.11.1
真机环境 conda 环境 ros_flexiv,Python 3.11.15,约 15GB
仿真环境 conda 环境 ros_gz_sim,Python 3.11.6,Gazebo Sim 6.16.0(Fortress / ign gazebo),约 5.1GB
工作区 仓库在 ~/ros2(ASCII)。~/文档/ros2 只是指向它的符号链接
Flexiv C++ ~/flexiv_install,flexiv_rdk 1.9.1(spdlog 1.9.2,Boost 1.83.0),约 194MB
Flexiv Python ~/rdk_py310/bin/python → 系统 /usr/bin/python3.10(3.10.12)+ flexivrdk==1.9.1 + numpy==1.26.4
DDS 域 真机 ROS_DOMAIN_ID=0,仿真强制 77

真机和仿真是两套 conda、两套 colcon 产物,互不覆盖:

真机 仿真
激活 source ~/ros2/scripts/env.sh source ~/ros2/scripts/sim_env.sh
conda ros_flexiv ros_gz_sim
产物 build/ install/ build_sim/ install_sim/
域 0 77

同一只 shell 里来回 source 会残留 PATH / PYTHONPATH。换环境时开新终端。


2. 新机器先对齐的路径

下面这些路径被脚本写死为用户 cc 的家目录。新机器用同一个用户名 cc(家目录 /home/cc)时,后面的命令可以原样复制。

路径 谁在用
/home/cc/anaconda3 scripts/run_real.sh、scripts/run_mock_demo.sh 直接 source 这个 conda.sh。scripts/env.sh 用的是 $HOME/anaconda3,两边要是同一个目录
/home/cc/rdk_py310/bin/python run_real.sh、test_rdk_python.sh、rdk_switch_tool.sh、scripts/lib/real_preflight.py 的默认 RDK_PYTHON
/home/cc/flexiv_install run_real.sh 用 $HOME/flexiv_install(随用户走)
/home/cc/ros2 工作区。colcon build 必须在这条 ASCII 路径下,不要在中文目录里编

用户名不是 cc 时,至少要改 scripts/run_real.sh 里的 conda 路径,并在启动前 export RDK_PYTHON=$HOME/rdk_py310/bin/python。否则真机入口会去找 /home/cc。

建议磁盘空闲 40GB 以上(两个 conda 环境加下载缓存)。


3. 系统包与显卡

sudo apt update
sudo apt install -y \
  build-essential git curl wget \
  python3.10 python3-pip \
  v4l-utils usbutils \
  dkms linux-headers-$(uname -r)
sudo usermod -aG dialout "$USER"

dialout 给夹爪的 USB–RS485(/dev/ttyUSB*)。加完组要重新登录。

显卡驱动装到能让 nvidia-smi 跑起来即可。本机是 595.91.07。驱动只要够跑 CUDA 12.4(远低于 595 的驱动也可以),PyTorch 的 12.4 wheel 就能用。不要再装一套系统级 CUDA toolkit,避免和 wheel 里的 libcudart 抢。

Orisys 视触觉相机会被 USB 自动休眠卡死。本机规则文件是 /etc/udev/rules.d/99-orisys-uvc.rules:

# Orisys 视触觉相机 (1bcf:2281):禁止 USB 自动休眠(autosuspend 会把 UVC 相机搞到内核态卡死)
ACTION=="add|bind", SUBSYSTEM=="usb", ATTR{idVendor}=="1bcf", ATTR{idProduct}=="2281", ATTR{power/control}="on", ATTR{power/autosuspend}="-1"

写好后 sudo udevadm control --reload-rules && sudo udevadm trigger。


4. Anaconda

装到 $HOME/anaconda3(安装器里选 Just Me、路径填这个)。不要装成 ~/miniconda3 或其他目录:run_real.sh 写死了 /home/cc/anaconda3/etc/profile.d/conda.sh。

本机 conda 版本是 25.11.1。装完新开一个终端:

source "$HOME/anaconda3/etc/profile.d/conda.sh"
conda --version

频道不要写进 ~/.condarc 当成全局默认。本机 ~/.condarc 只有 defaults,RoboStack 的频道是每次安装命令显式带上的:-c robostack-staging -c conda-forge。


5. 真机环境 ros_flexiv

下面三条 conda 命令来自本机 ~/anaconda3/envs/ros_flexiv/conda-meta/history(2026-08-21 创建,2026-08-25 装 ROS)。pip 那一段是按同日 conda list 里的 pypi 版本还原的;当初的 pip install 原文没有留在 conda 历史里。

source "$HOME/anaconda3/etc/profile.d/conda.sh"

conda create -n ros_flexiv python=3.11 pip -y

conda install -y -n ros_flexiv -c robostack-staging -c conda-forge \
  ros-humble-ros-base \
  ros-humble-robot-state-publisher \
  ros-humble-xacro \
  ros-humble-tf2-ros \
  ros-humble-joint-state-publisher \
  compilers cmake make pkg-config catkin_pkg empy lark-parser numpy \
  colcon-common-extensions

conda install -y -n ros_flexiv -c robostack-staging -c conda-forge \
  ros-humble-rviz2

conda install -y -n ros_flexiv -c robostack-staging -c conda-forge \
  ros-humble-moveit \
  ros-humble-moveit-configs-utils \
  ros-humble-control-msgs \
  ros-humble-controller-manager \
  ros-humble-joint-trajectory-controller \
  ros-humble-ros2-control \
  ros-humble-ros2-controllers

然后钉住本机正在用的 pip 包。Humble 的 rosidl 要 empy 3.x(conda 有时会给 4.x,构建消息包时会报 AttributeError: NoneType object has no attribute shutdown)。TensorRT 装 tensorrt-cu12,不要装元包 tensorrt。

conda activate ros_flexiv

python -m pip install \
  'empy==3.3.4' \
  'lark==1.3.1' \
  'numpy==2.4.6' \
  'opencv-python-headless==4.10.0.84' \
  'pyrealsense2==2.58.3.10794' \
  'pyserial==3.5' \
  'minimalmodbus==2.1.1' \
  'onnx==1.22.0' \
  'onnxruntime==1.30.0' \
  'onnxruntime-gpu==1.29.0' \
  'tensorrt-cu12==10.13.3.9' \
  'ultralytics==8.4.123'

python -m pip install \
  'torch==2.6.0+cu124' \
  'torchvision==0.21.0+cu124' \
  --index-url https://download.pytorch.org/whl/cu124

相机走 pyrealsense2,本机没有装 ros-humble-realsense2-camera。夹爪 Modbus 走 pyserial + minimalmodbus。

Orisys SDK 不在 git 里。把本机这个 wheel 拷过去再装(--no-deps,避免它改写上面的 torch / numpy):

# 源文件:~/sensor_ws/0.4.2/orisys-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
conda activate ros_flexiv
python -m pip install --no-deps \
  "$HOME/sensor_ws/0.4.2/orisys-0.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"

本机这个环境里还有 Jupyter、PySide6、flexiv-assembly 等包,本仓库脚本不用它们,新机器不必装。

激活后应看到:

conda activate ros_flexiv
python -c 'import sys; print(sys.version)'          # 3.11.x
echo "ROS_DISTRO=$ROS_DISTRO"                        # humble
python -c 'import rclpy, cv2, pyrealsense2, torch; import tensorrt as trt; print("torch", torch.__version__); print("tensorrt", trt.__version__); print("cuda", torch.cuda.is_available())'

本机对应输出:torch 2.6.0+cu124,tensorrt 10.13.3.9,torch.cuda.is_available() 为真。


6. Flexiv RDK(与 conda 分开)

运行中的库是 1.9.1。仓库里的 src/flexiv_rdk 工程版本是 2.1(project(flexiv_rdk VERSION 2.1 ...))。scripts/build_flexiv_rdk.sh 编的是这份当前源码,产物和本机 ~/flexiv_install 不是同一个版本。

新机器要对齐正在跑的这套,把本机这两个目录原样拷过去:

# 在新机器上,从本机拉(把 user@old-host 换成这台工控机)
rsync -a user@old-host:~/flexiv_install/  ~/flexiv_install/
rsync -a user@old-host:~/rdk_py310/       ~/rdk_py310/

拷完核对:

grep 'set(PACKAGE_VERSION' ~/flexiv_install/lib/cmake/flexiv_rdk/flexiv_rdk-config-version.cmake
# 应有 set(PACKAGE_VERSION "1.9.1")

~/rdk_py310/bin/python -c 'import flexivrdk; print(flexivrdk.__version__)'
# 1.9.1

~/rdk_py310/bin/python 是一个壳:清掉 PYTHONHOME(避免 conda 污染),再用系统 Python 3.10 加上自己的 site-packages。flexivrdk 1.9.1 的 ABI 是 cp310,不要装进 ros_flexiv(那是 Python 3.11)。

壳脚本内容(拷目录时已经带上;若要手写,注意把路径改成新机器的家目录):

#!/bin/bash
export PYTHONPATH="${HOME}/rdk_py310/lib/python3.10/site-packages${PYTHONPATH:+:$PYTHONPATH}"
unset PYTHONHOME
exec /usr/bin/python3.10 "$@"

7. 仿真环境 ros_gz_sim

用仓库脚本,可重复执行:

bash ~/ros2/scripts/install_sim_env.sh
bash ~/ros2/scripts/install_sim_env.sh --verify

脚本会创建 ros_gz_sim(Python 3.11),从 robostack-staging + conda-forge 安装 ros-humble-ros-base、ros-humble-ros-gz、ros-humble-gz-ros2-control、ros2_control / ros2_controllers、controller_manager、xacro、tf2_ros、camera-info-manager、image-transport-plugins,并把 empy 钉在 3.3.4。

本机 --verify 能通过时的关键版本:

包 版本
Gazebo Sim(ign gazebo --version) 6.16.0
libignition-gazebo6 6.16.0
ros-humble-ros-gz 0.244.20
ros-humble-gz-ros2-control 0.7.15
empy 3.3.4(conda-forge)
numpy 1.26.4(conda-forge)

Humble 配的是 Gazebo Fortress,命令是 ign gazebo,不是 gz sim。

仿真环境里没有真机那套 torch / tensorrt / pyrealsense2 / onnx。本机仿真环境额外有一个 pip 的 onnxruntime==1.30.0。缺 onnx 时部分单测会红,这是现况;不要把真机的 pip 依赖灌进 ros_gz_sim,两个环境是故意隔开的。


8. 工作区、现场配置、编译

git clone <本仓库> ~/ros2
cd ~/ros2
# 若习惯从中文路径进: ln -s ~/ros2 ~/文档/ros2

config/site.yaml、YOLO 权重(.pt / .onnx / .engine)不在 git 里。

cp ~/ros2/config/site.example.yaml ~/ros2/config/site.yaml
# 按新机器填写 robot.sn、robots[].ip、相机序列号、权重路径
# 权重放到 models/<分组>/ ,见 models/README.md

TensorRT 的 .engine 跟 GPU 绑定。换了显卡(哪怕仍是 3090 以外的型号)要在新机器的 ros_flexiv 里重新 bash ~/ros2/scripts/weights.sh convert --to engine。直接拷本机的 .engine 经常加载失败。

手眼结果 handeye/results/ 在 git 里,但是这台机器、这个相机安装位的矩阵。新机器克隆后要重新标定,见 HANDEYE.md。

在 ros_flexiv 里编真机(先确认 conda info --envs 里星号在 ros_flexiv,python 指向 ~/anaconda3/envs/ros_flexiv/bin/python):

cd ~/ros2
conda activate ros_flexiv
bash scripts/build_all.sh
source scripts/env.sh
echo "ROS_DISTRO=$ROS_DISTRO ROS_DOMAIN_ID=$ROS_DOMAIN_ID"
# humble 与 0

编完查 shebang 没有被仿真环境污染(正常应是 0):

grep -l ros_gz_sim install/*/lib/*/* | wc -l

仿真另开一个终端:

cd ~/ros2
bash scripts/build_sim.sh
source scripts/sim_env.sh
# 打印里应有 CONDA=ros_gz_sim  ROS_DISTRO=humble  ROS_DOMAIN_ID=77

9. 装完怎么确认

# 真机环境
source ~/ros2/scripts/env.sh
python -c 'import rclpy, torch, tensorrt, pyrealsense2, cv2, serial, minimalmodbus, onnx'
echo "$ROS_DISTRO $ROS_DOMAIN_ID"          # humble 0
~/rdk_py310/bin/python -c 'import flexivrdk; print(flexivrdk.__version__)'   # 1.9.1

# 仿真环境(新终端)
bash ~/ros2/scripts/install_sim_env.sh --verify

有机器人、示教器已切到 AUTO + Remote Ethernet、并且 config/site.yaml 已填好之后,再跑:

bash ~/ros2/scripts/test_rdk_python.sh
bash ~/ros2/scripts/run_real_preflight.sh --arm 89

这两条会访问真机网络,空机器上失败不代表环境没装上。


10. 本机还有、但本仓库不用的 conda 环境

conda env list 里还有 flexiv、flexiv_rdk_py312、orisys、py311、ros2。scripts/env.sh 和 scripts/sim_env.sh 都不会激活它们。新机器只建 ros_flexiv 和 ros_gz_sim 即可。