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()
