PAYATHON 2026

Pollen Robotics 的 RustyPot 伺服控制器有现成的 C/C++ 接口吗?

技术老齐

结论

目前尚未找到可直接使用、覆盖 RustyPot High-Level API 的现成 C/C++ 接口。官方文档提供了 Rust API 和通过 PyO3 生成的 Python bindings,没有列出对应的 C/C++ SDK。已有 Python bindings,并不意味着 C/C++ 可以直接链接调用。RustyPot 官方仓库

第三方实现可能存在,但在找到可核实的项目之前,不宜将其视为现成的接入方案。

如果已经有能用的 Python 控制代码,又不熟悉 Rust,最容易落地的方式是在 C/C++ 中嵌入 Python,继续调用现有 bindings。如果必须去掉 Python 运行时依赖,就需要编写 Rust 到 C 的封装层。

为什么不能直接链接 Python bindings?

Python bindings 面向 Python 解释器,负责把 Python 对象和调用转换为 Rust 操作,并未提供供 C/C++ 直接调用的普通函数接口。

RustyPot 的构建配置包含 cdylib,说明它可以生成动态库。C/C++ 要使用其高层功能,还需要导出的 C ABI 函数、明确的参数类型和配套头文件。仅有 .so、.dylib 或 .dll 文件,不能替代这些接口。RustyPot 构建配置、Rust 链接文档

不写 Rust:从 C/C++ 嵌入 Python

接入步骤如下:

  1. 保留已经能正常工作的 Python 控制逻辑。
  2. 在 C/C++ 程序中初始化 Python 解释器。
  3. 导入 rustypot,调用对应型号的 Controller。
  4. 需要将结果交给 C/C++ 时,通过 Python/C API 转换返回值。

Python 官方支持这种嵌入方式,C 和 C++ 程序都可以使用。Python 嵌入文档

下面的 C++ 最小示例假设使用 STS3215,且当前安装的 RustyPot 提供 Sts3215PyController。串口、波特率和电机 ID 需要按实际设备修改。类名和读取方法来自官方示例。RustyPot 使用说明

#define PY_SSIZE_T_CLEAN
#include <Python.h>

int main()
{
    Py_Initialize();

    const int status = PyRun_SimpleString(R"PY(
from rustypot import Sts3215PyController

controller = Sts3215PyController(
    serial_port="/dev/ttyUSB0",
    baudrate=1_000_000,
    timeout=0.1,
)

print(controller.read_present_position(1))
)PY");

    if (Py_FinalizeEx() < 0) {
        return 120;
    }

    return status == 0 ? 0 : 1;
}

在具备 Python 开发头文件、嵌入库和 python3-config 的类 Unix 环境中,可以参考以下命令编译:

c++ -std=c++11 read_position.cpp -o read_position \
  $(python3-config --cflags) \
  $(python3-config --ldflags --embed)

编译时使用的 Python 安装必须与运行时环境匹配,嵌入的解释器也必须能导入 rustypot。如果使用虚拟环境,还需要确认解释器和模块搜索路径。Python 编译与链接说明

这个示例只打印读取结果。若要在 C/C++ 中使用结果进行后续计算,需要通过 Python/C API 获取返回对象、检查异常并转换数值。

必须去掉 Python:封装 C ABI

要去掉 Python 运行时依赖,需要编写一层 Rust 包装代码,在内部调用 RustyPot,向外提供 C 函数。可以先封装实际需要的操作,例如打开连接、读取位置、写入目标位置和关闭连接。

封装时需要处理以下问题:

  • 用不透明句柄保存 Controller,明确创建和释放方式。
  • 将 Rust 的错误转换成错误码,并提供错误信息。
  • 约定位置单位、数组长度以及内存由谁分配和释放。
  • 避免 Rust panic 或 C++ 异常越过接口边界。

实现这些跨语言接口时,需要遵守相应的 FFI 约束。Rust FFI 文档

cbindgen 可以辅助生成头文件,前提是 Rust 代码已经暴露了公共 C API。它不会自动把 RustyPot 的整个 High-Level API 转换成可直接使用的 C/C++ 库。cbindgen 项目说明

接入时需要注意什么?

RustyPot 是与舵机通信的软件库,具体可用操作取决于舵机型号、协议和所用版本。迁移时,应从已经验证过的 Python 调用入手,先确认参数和单位。

同一串口的访问需要统一管理。如果保留 Python 控制进程,由 C/C++ 通过进程间通信发送请求,就应让该进程负责串口操作,避免多个程序交错收发数据。

嵌入 Python 可以复用现有代码,同时仍需部署 Python 和 RustyPot。如果项目对控制周期有严格要求,应在目标机器上测量调用延迟和抖动。以上示例不构成实时性或硬件测试结果。

备注:内容仅供参考。