Zivid SDK 互操作性

本文介绍如何在同一应用程序中同时使用 Zivid SDK 和 Zivid Motion。未来我们将完善这些集成细节,以提供更流畅的用户体验,但目前,本文主要提供如何有效使用这两个 SDK 的指导。

有关结合 Zivid Motion 和 Zivid SDK 的完整示例应用程序,请参阅 基于 Zivid 点云的障碍物 示例。


单位:毫米 VS 米

注意:

  • Zivid SDK 点云坐标的单位是毫米。

  • Zivid Motion 的几何形状和障碍物坐标以米为单位。

在利用 SDK 点云创建运动障碍物之前,务必将坐标从毫米转换为米。

const Zivid::Matrix4x4 millimetersToMetersTransform{ {
    { 0.001f,    0.f,    0.f, 0.f },
    {    0.f, 0.001f,    0.f, 0.f },
    {    0.f,    0.f, 0.001f, 0.f },
    {    0.f,    0.f,    0.f, 1.f },
} };
frame.pointCloud().transform(millimetersToMetersTransform);
millimeters_to_meters_transform = np.diag([0.001, 0.001, 0.001, 1])
frame.point_cloud().transform(millimeters_to_meters_transform)

C++ 集成细节

应用程序实例化顺序

在同一个 C++ 进程中使用 Zivid SDK 和 Zivid Motion 时,请先创建一个 Zivid::Application ,然后再创建一个 Zivid::Motion::Application ,以避免初始化错误。

请按以下顺序操作:

Zivid::Application zividApp;
Zivid::Motion::Application motionApp;

数据类型转换

即使类型名称看起来很相似,SDK 和 Motion 类型也是不同的 C++ 类型。

例如:

  • Zivid::PointXYZ 是 SDK 点类型。

  • Zivid::Motion::PointXYZ 是一个运动点类型。

从 SDK 点云数据创建运动障碍物时,需要显式转换:

// Ensure that the point cloud is in meters, not millimeters, before copying the XYZ data.
// Also, make sure to use an unorganized point cloud, as Motion always expects unorganized point clouds.
const auto xyzData = unorganizedPointCloud.copyPointsXYZ();
std::vector<Zivid::Motion::PointXYZ> points;
points.reserve(xyzData.size());
for(const auto &p : xyzData)
{
    points.emplace_back(Zivid::Motion::PointXYZ{ p.x, p.y, p.z });
}
planner.setObstacles({ Zivid::Motion::Obstacle::fromPointCloud("point_cloud_obstacle", points) });

Python 集成详情

在Python中,互操作性更容易实现:

  • Zivid SDK 和 Zivid Motion 都能自然地与 NumPy 兼容的数据配合使用。

  • 除了毫米到米的转换之外,不需要任何特殊的数据转换步骤。

  • zivid.Application()zividmotion.Application() 之间没有实例化顺序的限制。