ampcl 0.0.1
A small example package
Requires Python: >=3.7

# PointCloud-PyUsage

提供点云处理的Python实现，本仓库正在进行大幅度地迭代，暂不建议使用

## 安装

### 安装依赖

- ROS1 / ROS2（如需要用到ROS的相关插件）
- Open3D（如果Python版本为`3.10`，需自行安装Open3D@[ref](http://www.open3d.org/docs/latest/getting_started.html)）

```bash
# pip 版本需要大于等于20.3
$ pip3 install -U pip
$ pip3 install --user --pre https://storage.googleapis.com/open3d-releases-master/python-wheels/open3d-0.16.0-cp310-cp310-manylinux_2_27_x86_64.whl"
```

- 构建工具

```bash
$ pip3 install -U build
```

### 构建安装和安装包


```bash
$ git clone https://github.com/Natsu-Akatsuki/PointCloud-PyUsage --depth=1
$ cd PointCloud-PyUsage
# （推荐）非开发模式
$ bash install.sh

# 开发模式
$ pip3 install -e .
```

> **Note**
>
> 非虚拟环境下，使用开发模式可能出现`its build backend is missing the 'build_editable' hook`的报错，则可能是系统级别的`setuptools`的版本覆盖了高版本的`setuptools`。通过如下命令行可查询当前的版本`python3 -c "import setuptools; print(setuptools.__version__)" `

## 程序

|      包名       |                    作用                    |
| :-------------: | :----------------------------------------: |
|      `io`       |             导入和导出点云文件             |
| `visualization` |                 点云可视化                 |
|   `ros-utils`   | 动态调参，ROS消息类型和numpy类型的相互转换 |

### IO

- 支持`npy`，`pcd`，`bin`点云文件的读取
- 目前支持读取的字段包括`xyz`，`xyzi`

```python
# >>> import usage >>>
from pointcloud_utils.io import load_pointcloud

# low-level API
pointcloud = load_npy("../data/pointcloud.npy")
pointcloud = load_txt("../data/pointcloud.txt")
pointcloud = load_pcd("../data/pointcloud_ascii.pcd")
# high-level API（支持npy, pcd, bin文件）
pointcloud = load_pointcloud("pointcloud_utils/data/pointcloud.pcd")

# >>> export usage >>>
save_pointcloud(pointcloud, "pointcloud.pcd")
```

### Visualization

- 可视化激光点云
- 基于强度实现点云伪彩色增强

```python
from pointcloud_utils.io import load_pointcloud
from pointcloud_utils.visualization import o3d_viewer_from_pointcloud
pointcloud = load_pointcloud("pointcloud_utils/data/pointcloud_ascii.pcd")
with print_durations(unit='ms'):
  o3d_viewer_from_pointcloud(pointcloud)
```

## 命令行

### 可视化点云

- 基于`Open3D`的点云可视化，支持`npy`，`pcd`，`bin`点云文件的可视化
- 目前支持的字段包括`xyz`，`xyzi`
- 强度字段使用伪彩色增强

```bash
$ o3d_viewer <pointcloud_file>
# 如遇到KITTI数据集这种将强度进行过归一化的则需要加上-n选项
$ o3d_viewer -n <pointcloud_file>
```

## TODO

- [ ] 用开发模式安装的包无法被`Pycharm`智能识别而不能实现补全（不论是否处于虚拟环境）
- [ ] 使用`github`来构建安装包

## 规范

- 遵从`pep660`（`setuptools`至少需要`v64.0`才支持单个toml下的`develop`模式）（@[ref](https://stackoverflow.com/questions/69711606/how-to-install-a-package-using-pip-in-editable-mode-with-pyproject-toml)）

## 参考资料

|                             仓库                             |                 参考                 |
| :----------------------------------------------------------: | :----------------------------------: |
|    [ros_numpy](https://github.com/eric-wieser/ros_numpy)     | `ROS1` 点云数据和`numpy`数据相互转换 |
|   [ros2_numpy](https://github.com/Box-Robotics/ros2_numpy)   | `ROS1` 点云数据和`numpy`数据相互转换 |
| [ddynamic_reconfigure_python](https://github.com/pal-robotics/ddynamic_reconfigure_python) |           `ROS1` 动态调参            |
|     [OpenPCDet](https://github.com/open-mmlab/OpenPCDet)     |          神经网络算子和标定          |
|       [pykitti](https://github.com/utiasSTARS/pykitti)       |          `KITTI`数据集读取           |
| [livox_mapping](https://github.com/Livox-SDK/livox_mapping)  |          基于强度值的伪彩色          |