Files
ros_contorl/docs/ENVIRONMENT.md
T

318 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环境安装(按本机快照复现)
本文是 **2026-10-09** 在这台工控机上核对过的软件栈,用来在另一台电脑上装出同一套能跑本仓库的环境。
核对来源:`/etc/os-release`、`conda-meta/history`、`conda list`、`~/flexiv_install` 的 cmake 版本文件、`nvidia-smi`。
日常怎么用已经装好的环境,看 [QUICKSTART.md](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. 新机器先对齐的路径
脚本跟**当前用户的家目录**走,不写死 `/home/cc`。用户名可以不是 `cc`。只支持 Linux。
| 路径 | 谁在用 |
|------|--------|
| `$HOME/anaconda3` 或 `$HOME/miniconda3` | `scripts/lib/dev_tools.sh`。环境名默认 `ros_flexiv`,可用 `REAL_ENV_NAME` 改 |
| `$HOME/rdk_py310/bin/python` | 默认的 RDK 解释器。已经在别的目录时,启动前 `export RDK_PYTHON=...` |
| `$HOME/flexiv_install` | `run_real.sh` / `env.sh` 的 `LD_LIBRARY_PATH` |
| 仓库目录 | 克隆到哪就从哪启动。`colcon build` 必须在 ASCII 路径下,不要在中文目录里编 |
机械臂、相机、夹爪、网卡和 IP 只写在 `config/site.yaml`。臂号是序列号末两位,换一台臂改 SN,不要改程序里的 89/91。工位窗口的显示器跟当前登录会话(`who` 里的 `:0` / `:1`),不写死某一块屏。
建议磁盘空闲 **40GB 以上**(两个 conda 环境加下载缓存)。
---
## 3. 系统包与显卡
```bash
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、路径填这个)。`$HOME/miniconda3` 也能被 `scripts/lib/dev_tools.sh` 找到。不要装到这两个目录以外的路径,除非自己改 `dev_source_conda`。
本机 conda 版本是 25.11.1。装完新开一个终端:
```bash
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 历史里。
```bash
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`。
```bash
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):
```bash
# 源文件:~/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` 等包,**本仓库脚本不用它们**,新机器不必装。
激活后应看到:
```bash
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` 不是同一个版本。
新机器要对齐**正在跑的**这套,把本机这两个目录原样拷过去:
```bash
# 在新机器上,从本机拉(把 user@old-host 换成这台工控机)
rsync -a user@old-host:~/flexiv_install/ ~/flexiv_install/
rsync -a user@old-host:~/rdk_py310/ ~/rdk_py310/
```
拷完核对:
```bash
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)。
壳脚本内容(拷目录时已经带上;若要手写,注意把路径改成新机器的家目录):
```bash
#!/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
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. 工作区、现场配置、编译
```bash
git clone <本仓库> ~/ros2
cd ~/ros2
# 若习惯从中文路径进: ln -s ~/ros2 ~/文档/ros2
```
`config/site.yaml`、YOLO 权重(`.pt` / `.onnx` / `.engine`)不在 git 里。
```bash
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](HANDEYE.md)。
在 **`ros_flexiv`** 里编真机(先确认 `conda info --envs` 里星号在 `ros_flexiv`,python 指向 `~/anaconda3/envs/ros_flexiv/bin/python`):
```bash
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):
```bash
grep -l ros_gz_sim install/*/lib/*/* | wc -l
```
仿真另开一个终端:
```bash
cd ~/ros2
bash scripts/build_sim.sh
source scripts/sim_env.sh
# 打印里应有 CONDA=ros_gz_sim ROS_DISTRO=humble ROS_DOMAIN_ID=77
```
---
## 9. 装完怎么确认
```bash
# 真机环境
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
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` 即可。