120 lines
3.8 KiB
Markdown
120 lines
3.8 KiB
Markdown
# 灵枢 · 会话式像素→3D 精度测试
|
||
|
||
在电脑上点一下图像,板子自动抓帧、算三维点、跟踪位姿,实时给出目标点的坐标差 Δ。
|
||
不再手动 `scp` 图片、手动回传坐标。
|
||
|
||
## 目录
|
||
|
||
```
|
||
lingshu_session/
|
||
├── agents.md # 给 AI/开发者的项目说明与硬性约定
|
||
├── README.md
|
||
├── client/ # 电脑端(Windows / Linux)
|
||
└── server/ # 板子端(Ubuntu 24.04 + ROS2 Jazzy)
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 板子
|
||
|
||
```bash
|
||
# 1) pynng
|
||
sudo apt install -y python3-venv
|
||
python3 -m venv --system-site-packages ~/pynng_venv
|
||
~/pynng_venv/bin/pip install pynng
|
||
|
||
# 2) 把 server/ 下 5 个文件拷到 ~/Workplace/odin_ws/
|
||
# wire.py calib.py target_math.py session_server_node.py requirements.txt
|
||
|
||
# 3) 启动驱动后,启动会话服务
|
||
source /opt/ros/jazzy/setup.bash
|
||
source ~/Workplace/odin_ws/install/setup.bash
|
||
~/pynng_venv/bin/python session_server_node.py --port 5555
|
||
|
||
# 如果开了防火墙
|
||
sudo ufw allow 5555/tcp
|
||
```
|
||
|
||
### 电脑
|
||
|
||
```bash
|
||
cd client
|
||
python -m pip install -r requirements.txt
|
||
python session_client.py --board 192.168.43.50
|
||
```
|
||
|
||
启动后自动抓帧并显示图像。点一个像素,右侧会显示:
|
||
|
||
```
|
||
p_cam(相机系) : (0.0611, -0.0917, 2.9978)
|
||
p_lidar(雷达系): (3.0167, -0.0277, 0.1125)
|
||
★ p_map(地图系): (3.0167, -0.0277, 0.1125)
|
||
```
|
||
|
||
移动板子,界面每 200 ms 刷新:
|
||
|
||
```
|
||
pos=(+0.9060, -0.0413, +0.0075) yaw=-3.2°
|
||
Δ=(+0.2507, -0.0209, +0.0144)
|
||
```
|
||
|
||
只给坐标,不给距离。
|
||
|
||
## 两种计算模式
|
||
|
||
- **默认 `--compute board`**:板子只回传图像;电脑只发 `(u,v)`;
|
||
板子用本地点云算 `p_cam/p_lidar/p_map` 并记成目标。点云不出板。
|
||
- **`--compute pc`**:板子额外回传同帧点云;电脑本地算,再 `set_target` 回传。
|
||
适合看候选点、平面拟合细节、离线复盘。
|
||
|
||
## 会话
|
||
|
||
- 一次客户端启动 = 一个会话(uuid + `client_ip` + `board_ip`)。
|
||
- 每条请求和应答都带会话信息,板子按会话隔离状态。
|
||
- 界面按钮:**新会话**(换 id 重抓)、**重新抓帧**(同会话重拍)、**清除目标**。
|
||
|
||
## 常用命令
|
||
|
||
```bash
|
||
# 无界面跑一次,看定位结果和 Δ
|
||
python session_client.py --board 192.168.43.50 --no-gui --u 800 --v 648 --watch
|
||
|
||
# 电脑端计算
|
||
python session_client.py --board 192.168.43.50 --compute pc --no-gui --u 800 --v 648
|
||
|
||
# 调候选半径 / 关平面拟合
|
||
python session_client.py --board 192.168.43.50 --radius 15 --no-fit
|
||
```
|
||
|
||
板子端参数:
|
||
|
||
```bash
|
||
--image-topic /odin1/image/compressed # 默认,直接转发,不用编码
|
||
--no-compressed # 原始图,需要 cv2 或 Pillow
|
||
--cloud-topic /odin1/cloud_raw
|
||
--odom-topic /odin1/odometry
|
||
--index-cell 32 # 投影索引格子大小
|
||
--radius 10 # 默认候选半径
|
||
```
|
||
|
||
## 测试(不需要 ROS)
|
||
|
||
```bash
|
||
cd client
|
||
python test_session.py # 协议 / 两种计算模式 / 会话隔离
|
||
python _bench_index.py ..\..\acc.npz # 全量投影 vs 像素索引
|
||
```
|
||
|
||
## 常见问题
|
||
|
||
| 现象 | 处理 |
|
||
|---|---|
|
||
| `capture` 一直失败/超时 | 板子驱动是否在跑;5555 是否放行;`/odin1/cloud_raw` 是否有数据 |
|
||
| 抓到的图像很旧 | `capture` 的 `stamp_delta_ms` 是否很大;改用 `--no-compressed` |
|
||
| 点不到点 | 调大 `--radius`;换平整、点云密的区域;看 `multi_layer` / `plane_used` |
|
||
| `Δ` 一直不为 0 | 先确认站到了目标点;再查 map 原点胶带、抓帧是否属于本次会话 |
|
||
| 板子端报 `target_math.py` 缺失 | `server/` 下的 5 个文件没有拷全 |
|
||
| `pynng` 装不上 | 用 `--system-site-packages` 的 venv;或装 cmake/build-essential 从源码编 |
|
||
|
||
更细的协议、坐标约定、硬性规则见 `agents.md`。
|