# 从源码构建

## 安装依赖

本教程假设你的系统已安装 ROS2 Humble、Jazzy、Kilted 或更新的版本。请先按照官方 ROS 安装说明安装对应的发行版。

```bash
apt-get update \
   && apt-get -y install --no-install-recommends software-properties-common git libusb-1.0-0-dev wget zsh python3-colcon-common-extensions zip unzip tar
```

> **版本说明**
> 如果你在
> **Humble**
> 或
> **Jazzy**
> 上构建，ROS v3 软件包使用
> `_v3`
> 后缀（例如
> `depthai_ros_driver_v3`
> ）。 从
> **Kilted**
> 开始，v3 成为默认版本，软件包名称不再带后缀。

如果你尚未安装 rosdep 且未初始化，请执行以下步骤：

```bash
sudo apt install python3-rosdep
sudo rosdep init
rosdep update
```

## 设置流程

以下设置流程假设你已安装 cmake 版本 >= 3.10.2 和 OpenCV 版本 >= 4.0.0。我们选择 dai_ws 作为新文件夹的名称，它将作为我们的 depthai ros 工作空间。

```bash
mkdir -p dai_ws/src
cd dai_ws/src
git clone https://github.com/luxonis/depthai-core.git
cd depthai-core && git submodule update --init --recursive && cd ..
git clone https://github.com/luxonis/depthai-ros.git

# checkout the release branch matching your target ROS distro
# Humble: depthai-core -> v3-humble, depthai-ros -> v3-humble
# Jazzy:  depthai-core -> v3-jazzy,  depthai-ros -> v3-jazzy
# Kilted: depthai-core -> main,      depthai-ros -> kilted

cd ..
rosdep install --from-paths src --ignore-src -r -y
source /opt/ros/$ROS_DISTRO/setup.bash
MAKEFLAGS="-j1 -l1" colcon build
source install/setup.bash
```

> 如果你使用的是低端 PC 或 RPi，标准构建可能占用大量内存并导致系统卡顿。为避免这种情况，你可以从工作空间中使用
> `build.sh`
> 命令（它只是对 colcon 命令的封装）：
> ```bash
> ./src/depthai-ros/build.sh
> ```

# Docker

你还可以在本地机器上构建并运行 Docker 镜像。为此，请按照上述步骤添加 USB 规则。

## 构建

克隆仓库并在其中运行（这取决于你当前所在的分支）：

```bash
docker build --build-arg USE_RVIZ=1 -t depthai-ros .
```

如果你发现构建过程中内存不足，还可以设置 BUILD_SEQUENTIAL=1 以逐个构建软件包，这样耗时更长，但内存占用更少。

RUN_RVIZ 参数表示 rviz 将被安装在 Docker 内部。如果你希望运行它，还需要执行以下命令（重启电脑后需要再次执行）：

```bash
xhost +local:docker
```

然后你可以通过以下方式运行镜像：

```bash
docker run -it -v /dev/:/dev/ --privileged -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix depthai-ros
```

这将启动一个交互式 Docker 会话。你也可以尝试：

```bash
docker run -it -v /dev/:/dev/  --privileged -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix depthai-ros [CMD]
```

其中 [CMD] 是容器初始运行时将要执行的命令，例如：

 * bash（允许你浏览文件、修改代码并重新构建）
 * zsh（已安装的另一个 shell，相比 bash 有一些优势）
 * roslaunch depthai_ros_driver camera.launch（这只是一个示例，任何启动文件都可以正常工作） 这里附带说明一下，depthai_ros_driver 中的启动文件有一些通过驱动内 .yaml
   文件设置的默认参数。你可以在容器内直接编辑这些文件，也可以在宿主机上创建一个 .yaml 文件（假设为 /home/你的用户名/params/example_config.yaml），并将其作为参数传递给可执行文件，如下所示：

```bash
docker run -it -v /dev/:/dev/ -v /home/你的用户名/params:/params --network host --privileged -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix depthai-ros ros2 launch depthai_ros_driver driver.launch.py params_file:=/params/example_config.yaml
```

请注意，为了使镜像更紧凑，只安装了部分外部依赖。例如，如果你想在 Docker 中试用 RTABMap 示例，你需要：

 * 以 bash/zsh 模式运行容器，安装它
 * 修改 Dockerfile，使其在构建过程中安装 – 之后你需要重新构建容器
 * 在我们的容器中运行基础相机节点，并在宿主机/另一个容器中单独运行 RTABMap（参见启动文件中关于单独运行时需要更改的参数/主题名称的说明）。
