# ZWO ASI Camera SDK 在树莓派 4B 上的安装与 Python 开发

SDK 版本：ASI_linux_mac_SDK_V1.41

## 1. 选择库版本（armv6 / armv7 / armv8）

库版本取决于树莓派系统是 32 位还是 64 位，跟板子型号关系不大：

| 系统 | 架构 | 选择 |
|---|---|---|
| 64 位 Raspberry Pi OS / Ubuntu arm64 | aarch64 / arm64 | `armv8` |
| 32 位 Raspberry Pi OS | armhf | `armv7` |
| （Pi 1 / Pi Zero 才用） | armv6 | `armv6` |

确认方法：

```bash
dpkg --print-architecture   # arm64 → armv8；armhf → armv7
getconf LONG_BIT            # 64 或 32
```

> 注意：不要只看 `uname -m`。新版 32 位 Pi OS 在 4B 上默认运行 64 位内核，`uname -m` 会显示 `aarch64`，但用户空间仍是 32 位，这时应选 armv7。

本机为 64 位系统，选用 **armv8**。

## 2. 安装 SDK

```bash
cd ASI_linux_mac_SDK_V1.41/lib
sudo cp armv8/libASICamera2.so* /usr/local/lib/
sudo cp ../include/ASICamera2.h /usr/local/include/
sudo ldconfig

# udev 规则，让普通用户能访问相机
sudo cp asi.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
```

### 调大 USB 缓冲

默认只有 16MB，高分辨率或高帧率时容易丢帧：

```bash
echo 200 | sudo tee /sys/module/usbcore/parameters/usbfs_memory_mb
```

这个设置重启后失效。永久生效的方法：在 `/boot/firmware/cmdline.txt`（旧系统为 `/boot/cmdline.txt`）那一行末尾加上：

```
usbcore.usbfs_memory_mb=200
```

### 验证

重新插拔相机，执行 `lsusb`，能看到 ZWO 设备（厂商 ID `03c3`）即识别正常。

## 3. Python 调用 SDK

常用 `zwoasi` 封装库。它通过 ctypes 调用 `libASICamera2.so`，接口与 C SDK 基本一一对应。

### 安装

```bash
pip install zwoasi numpy pillow
# 新版 Pi OS (Bookworm) 限制全局 pip，建议用虚拟环境：
# python3 -m venv ~/asi-env && source ~/asi-env/bin/activate
```

### 最小示例：拍一张图存为 PNG

```python
import zwoasi as asi

# 指向上一步拷贝的 armv8 库
asi.init('/usr/local/lib/libASICamera2.so')

n = asi.get_num_cameras()
if n == 0:
    raise SystemExit('未检测到相机')

print(asi.list_cameras())
cam = asi.Camera(0)
info = cam.get_camera_property()
print(info['Name'], info['MaxWidth'], 'x', info['MaxHeight'])

# 基本参数
cam.set_control_value(asi.ASI_BANDWIDTHOVERLOAD, cam.get_controls()['BandWidth']['MinValue'])
cam.set_control_value(asi.ASI_GAIN, 100)
cam.set_control_value(asi.ASI_EXPOSURE, 30000)   # 单位微秒，30ms
cam.set_image_type(asi.ASI_IMG_RAW8)             # 可选 RAW8/RAW16/RGB24

cam.capture(filename='test.png')
print('已保存 test.png')
cam.close()
```

### 注意事项

- `asi.init()` 必须传入 .so 的路径，库不会自动查找。
- 带宽（BandWidth）在树莓派上建议从较低值开始。USB 3.0 口虽能跑满，但带宽设太高容易超时或丢帧。
- 连续采集（视频模式）使用 `cam.start_video_capture()` + `cam.capture_video_frame()`，返回 numpy 数组，便于接 OpenCV / astropy 处理。
- 需要保存 RAW16 或 FITS，可拿到数组后用 `astropy.io.fits` 写文件。
- zwoasi 的 PyPI 版本更新较慢，但它只是 ctypes 封装，配合 V1.41 库一般可用（未在 V1.41 上实测）。若遇到函数缺失等报错，可从 GitHub（python-zwoasi）安装最新源码，或直接用 ctypes 调用 `ASICamera2.h` 中的接口。
