Libtraci

Libtraci#

与正在运行的仿真进行交互的主要方式是 TraCI,它提供了完全的灵活性,可以进行跨平台、跨语言的网络交互,其中 sumo 充当服务器。 为了与客户端代码耦合,必须为每种客户端语言提供绑定。从历史上看,这导致了大量的客户端实现,其 API 完整性水平各不相同,并且只有 Python 客户端由核心 SUMO 开发团队保持最新。

为了避免这个问题,Libtraci 被提供为一个 SWIG 兼容的 C++ 客户端库,它与 Libsumo 完全兼容。它甚至使用与 Libsumo 相同的头文件。

  • 基于静态函数和少量用于结果的简单包装类的 C++ 接口,可以直接链接到客户端代码
  • 为 Java 和 Python 预构建的语言绑定(使用 SWIG
  • 未来通过 SWIG 支持其他编程语言

与 Libsumo 不同,Libtraci 允许

  • 多个客户端
  • sumo-gui 一起运行

限制#

以下内容目前不工作(或与 TraCI Python 客户端的工作方式不同):

  • 需要额外参数的订阅(除了 vehicle.getLeader
  • 更严格的类型检查
    • 纯 Python TraCI 客户端有时接受任何可迭代对象,而 Libtraci 需要一个列表
    • 纯 Python 可能接受任何对象,而 Libtraci 需要一个布尔值或字符串
  • 没有清理/等待已启动的子进程(sumo)

构建和安装#

二进制 Windows 发行版已经包含了为 C++ 和 Java 预先编译好的 libtraci。对于 Python,您应该更倾向于使用纯 Python 实现(pip install traci),但如果必须,您可以通过 pip install libtraci 安装它。只有当您的平台或语言不受支持时,才请遵循以下步骤。

如果安装了 swig 和目标语言(例如 Python 或 Java)的开发者包,构建应该默认启用。 对于 Python 绑定,您将在 SUMO_HOME/tools/libtraci 中得到一个 libtraci.py 和一个 _libtraci.so(在 Windows 上为 .pyd)。 对于 Java,jar 和 .so(或 .dlls)被放置在 bin 目录中。 请将 bin 或 tools 目录添加到您相关的搜索路径中。 如果您想启用实验性的 C# 支持,请确保在您的 cmake 配置中设置了 ENABLE_CS_BINDINGS

使用 libtraci#

Python#

Note

使用 libtraci 相比标准的 python traci 库没有任何优势。下面的方法主要用于测试 libtraci。

import libtraci
libtraci.start(["sumo", "-c", "test.sumocfg"])
libtraci.simulationStep()
libtraci.close()

现有的 traci 脚本大多可以通过以下调用重用

import libtraci as traci

如果您有很多脚本,也可以将环境变量 LIBTRACI_AS_TRACI 设置为非空值,这将触发如上所述的导入。

C++#

示例代码 (test.cpp)#

该示例假设您在当前工作目录中有名为 sumocfg 的文件,并且 SUMO bin 目录已包含在 PATH 环境变量中。否则,您需要提供完整的文件路径。

#include <iostream>
#include <libsumo/libtraci.h>

using namespace libtraci;

int main(int argc, char* argv[]) {
    Simulation::start({"sumo", "-n", "net.net.xml"});
    for (int i = 0; i < 5; i++) {
        Simulation::step();
    }
    Simulation::close();
}

在 Linux 上编译(确保已设置 SUMO_HOME 并已构建 sumo)#

g++ -o test -std=c++11 -I$SUMO_HOME/src test.cpp -L$SUMO_HOME/bin -ltracicpp

在 Linux 上运行#

LD_LIBRARY_PATH=$SUMO_HOME/bin ./test

Java#

您可能想使用可用的 Maven 包

示例代码 (APITest.java)#

import org.eclipse.sumo.libtraci.*;

public class APITest {
    public static void main(String[] args) {
        Simulation.preloadLibraries();
        Simulation.start(new StringVector(new String[] {"sumo", "-n", "net.net.xml"}));
        for (int i = 0; i < 5; i++) {
            Simulation.step();
        }
        Simulation.close();
    }
}

另请参阅有关 转换订阅结果 的信息。

在 Linux 上编译#

确保已设置 SUMO_HOME 并且 jar / so / dll 文件可用

javac -cp $SUMO_HOME/bin/libtraci-1.8.0-SNAPSHOT.jar APITest.java

在 Linux 上运行#

java -Djava.library.path=$SUMO_HOME/bin -cp $SUMO_HOME/bin/libtraci-1.8.0-SNAPSHOT.jar:. APITest

Matlab#

请使用 pip install traci 安装 Python 包。然后,您可以在 Matlab 脚本中通过添加 py. 前缀来使用所有命令,就像在 Python 中一样。(请注意,这实际上不是在使用 libtraci,而是纯 Python TraCI 实现。)

py.traci.start(["sumo", "-c", "test.sumocfg"])
py.traci.simulationStep()