# SDK示例

本文所有SDK及示例代码都在gitee开源仓库上，请自行克隆至WSL子系统中使用：

{% embed url="<https://e.gitee.com/beijing-daxiang-airlines/repos/beijing-daxiang-airlines/sigma-sdk>" %}
SDK及示例代码
{% endembed %}

***

## 一、结构关系及数据流图

SIGMA Free仿真系统为外部程序提供了多种接口，用于订阅飞行器、车辆、障碍物或图传信息以及收发飞行控制消息。而仿真系统中重要模块的结构关系图如下图所示，所涉及的数据流图也一并进行展示。

<figure><img src="/files/rRRvEZdS4bV2yQEby4O1" alt=""><figcaption></figcaption></figure>

其中，UE4（渲染引擎）的绝大部分数据，如飞行器数据、地面车辆数据、障碍物数据基于ZeroMQ接口编写的，可以直接使用SIGMAfree提供的SDK进行读取。而第一视角图像数据采用了Gstreamer的传输策略，可以支持多种编码格式的图传。

此外，PX4（飞行控制）本身可以直接通过mavlink或者ros/ros2等成熟协议进行直接交互，从而实现对飞控代码执行的外部控制，从而实现改变控制模式、调整控制参数、修改控制策略等等功能。

这些数据接口功能如下：

* **飞行器数据：**&#x5B9E;时请求飞行器位姿和舵量及油门数据，较为简洁直观。
* **车辆数据：**&#x53EF;以获取地面车辆信息并且可以通过传递航点方法直接控制车辆移动。
* **障碍物数据：**&#x53EF;以得到摆放障碍物位置和体积，方便建图。
* **第一视角图像数据：**&#x53EF;以低延迟（20ms-100ms）得到渲染第一视角图像数据，从而支持深度学习、SLAM、Nerf、导航及定位等智能算法开发。
* **直接交互数据：**&#x53EF;以全面获取飞行器参数及各项传感器数据，与PX4官网用法一致，支持Mavlink、MAVRos、RTPS等多种协议，使用较为复杂。并且可以将控制量传递给飞控，可基于offboard模式完成深层开发

利用上述SIGMAfree提供的数据接口，我们就可以按照自己面临的科研目标设计并逐步实现完整的代码。例如，我的目标是实现基于已知地图进行路径规划避开障碍物，那么我需要利用SIGMAfree提供的SDK实现障碍物数据读取，然后根据自己设计的路径规划算法计算飞行器需要到达的航点，再通过mavlink协议将计算的航点发送给飞控，实现完整的过程。

显然，SIGMAfree可支持的算法开发有：**静态障碍物路规；强化学习避障；地面动静目标制导；地面车辆跟随；图像数据自动标注；各类深度学习算法开发等。**

## 二、飞行器、车辆和障碍物数据读取

SIGMA Free为了方便大家的学习，将常用基于ZeroMQ读取数据的代码变为SDK上传到了gitee仓库，大家可以自行下载使用\~

该SDK使用ZeroMQ（ZMQ）协议向UE4请求我们所需要的数据，包括飞行器、车辆以及障碍物的信息。ZMQ是一种基于消息队列的多线程网络库，是在对传统的标准socket接口扩展的基础上形成的特色消息通信中间件。它提供了高效的异步消息传递机制，以实现可靠、快速的数据交换。

打开SIGMA Free提供的SDK能够看到，在ZMQ客户端的构造函数中绑定了UE4的IP、端口号和ZMQ请求周期。并且定义了以下函数。

<figure><img src="/files/YzIscUIwIt5bQz0vRgwF" alt=""><figcaption></figcaption></figure>

简单说明一下使用过程，首先在SIGMA Free的场景编辑界面中，使用自定义障碍物和车辆的功能，放置3个障碍物和3辆车，并进入仿真。

<figure><img src="/files/7L3vQr879tuC9zAiIyep" alt=""><figcaption></figcaption></figure>

然后，通过外部程序调用SDK中的request\_num和request\_msg函数，就可以请求到飞行器、车辆或障碍物的相关数据。只要输入请求的消息类型和序号，**就可以得到对应的数据，具体效果如下图所示：**

<figure><img src="/files/CSfy999tC5FeI1dU3dBT" alt=""><figcaption></figcaption></figure>

## 三、车辆控制接口

使用SIGMA Free提供的SDK接口，我们同样可以自己编写外部程序，通过ZMQ协议控制仿真系统中提供的车辆。

```cpp
// XML请求函数
XMLBuilder xmlBuilder("root");
xmlBuilder.addWaypoint("325634880", "1167258752", "0", "1");
xmlBuilder.addWaypoint("325630528", "1167261568", "0", "1");
xmlBuilder.addWaypoint("325624576", "1167248256", "0", "1");
//发送控车指令
xmlBuilder.send_ctr_msg();
```

例如上述代码，我们通过addWaypoint函数向UE4传输期望的纬度、经度、高度和车辆编号，以此来实现对车的控制。该部分控制代码例程也在上述gitee仓库中，请读者自行获取。下面的动图是使用该功能完成的小旋翼跟踪大坦克的效果演示。

\*请注意：MBT90为静态车辆，无法移动，其他车辆类型可以控制。

<figure><img src="/files/duzlGcSWXFDUMk7zrjzh" alt=""><figcaption></figcaption></figure>

## 四、获取飞控的数据

MAVLink是一种非常轻量级的消息传递协议，已被广泛应用于无人机系统。在我们的通信过程中，不论是外部程序获取飞控的数据，还是向飞控发送消息，都是通过MAVLink协议传输的。

SIGMA Free中保留了飞控数据外部读取功能。使用UDP协议向飞控（PX4）的IP和端口号请求飞行器数据，并将收到的MavLink消息进行解码，以此获取到飞行器的位置、姿态、速度等信息。

我们在开源的SDK仓库中也提供了示例代码，同时，大家也可以在PX4官网教程中自行学习!

## 五、Offboard模式下控制飞行器

在Offboard模式下，外部程序可以向飞控发送MAVLink消息来控制飞行器的期望位置、速度、姿态等参数。这种灵活性允许外部程序实时调整飞行器的控制策略，并实现与飞行器的高效通信和协作，从而实现更复杂的飞行任务和应用场景，例如无人机避障、动目标制导等。 SIGMA Free可以非常真实的还原这一控制模式。通过向飞控传输包含位置、速度等数据的MAVLink消息，就可以在仿真系统中控制飞机飞行。以下为固定翼在Offboard控制模式下的第三视角和第一视角的渲染画面。

<figure><img src="/files/Pdh2E0jDUUBMzLeAiHZW" alt=""><figcaption></figcaption></figure>

***

**重点提示，开源的代码将上传到gitee仓库，大家遇到相关问题也可以在gitee上直接和开发者交流\~**


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bit-sigma.gitbook.io/tutorials-for-sigma-free/sigma-free-fang-zhen-xi-tong-jian-jie/jin-jie-gong-neng-shi-yong/sdk-shi-li.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
