C++ / Java / Python API 对比 (参考指南)


目录

1. 类与方法(Classes and Methods)

C++、Java 与 Python 为面向对象语言,Webots 在其上提供了面向对象的 API 层,建立在 C API 之上,包含约 25 个类与 200 个方法。

Webots APIs 概览

  • C++ API:核心面向对象接口
  • SWIG:基于 C++ API 自动生成 Java 与 Python API(名称与参数基本一致)
  • Java/Python API:与 C++ API 方法/类保持一致(不再需要 WbDeviceTag
  • C API:wb_* 函数族(实现于 libcontroller
  • MATLAB APIWebots(二进制接口)
Webots APIs Overview

命名约定:C++/Java/Python 的类与方法名称直接对应 C API。 例如 C 函数 double wb_distance_sensor_get_value(WbDeviceTag tag) 在三种语言中对应类 DistanceSensorgetValue() 方法,且通常移除了 WbDeviceTag 参数。

2. Controller 类

控制器应从 RobotSupervisor 继承:当节点的 supervisor 字段为 TRUE 时使用 Supervisor;否则使用 Robot

继承关系与可用方法
  • Supervisor ⟶ Robot:Supervisor controller 可直接调用 Robot 的方法(如 step()getLED()
  • 反向不可用:Robot controller 不能调用 Supervisor 专属方法(如 worldReload()
开发建议
  • 在自定义控制器类中实现 run() 主循环,并在其中调用 Robot.step()
  • 单实例:不要在同一控制器进程中创建多个派生类实例,否则行为未定义
  • 无需 wb_robot_init/cleanup:C++/Java/Python 的初始化/清理由基类构造/析构自动完成
  • 设备为独立类:通过 getDistanceSensor()getTouchSensor() 等方法获取设备实例;无 WbDeviceTag

3. C++ 示例

🧩 C++
#include <webots/Robot.hpp>
#include <webots/LED.hpp>
#include <webots/DistanceSensor.hpp>

using namespace webots;

int main() {
  Robot robot;

  int timeStep = (int)robot.getBasicTimeStep();
  LED* led = robot.getLED("ledName");
  DistanceSensor* distanceSensor = robot.getDistanceSensor("distanceSensorName");
  distanceSensor->enable(timeStep);

  while (robot.step(timeStep) != -1) {
    double val = distanceSensor->getValue();
    // TODO: 处理传感器数据
    led->set(1);
  }

  return 0;
}

4. Java 示例

🧩 Java
import com.cyberbotics.webots.controller.*;

public class MyController {
  public static void main(String[] args) {
    Robot robot = new Robot();

    int timeStep = (int)Math.round(robot.getBasicTimeStep());
    LED led = robot.getLED("my_led");
    DistanceSensor distanceSensor = robot.getDistanceSensor("my_distance_sensor");
    distanceSensor.enable(timeStep);

    while (robot.step(timeStep) != -1) {
      double val = distanceSensor.getValue();
      // TODO: 处理传感器数据
      led.set(1);
    }
  }
}

5. Python 示例

🧩 Python
from controller import Robot

robot = Robot()

timestep = int(robot.getBasicTimeStep())

led = robot.getDevice('ledName')
distanceSensor = robot.getDevice('distanceSensorName')
distanceSensor.enable(timestep)

while robot.step(timestep) != -1:
  val = distanceSensor.getValue()
  # TODO: 处理传感器数据
  led.set(1)