您的位置:首页 > 运维架构

CoppeliaSim 官方教程 BØ-based remote API

2020-03-06 16:20 2919 查看

本文为官方教程翻译,如有侵权,请联系删除

BØ-based remote API

基于B0的远程API允许从外部应用程序或远程硬件(例如,真实的机器人,远程计算机等)控制仿真(或仿真器本身)。 基于CoppeliaSim B0的远程API由大约一百个特定函数和一个通用函数组成,可以从C ++应用程序,Python脚本,Java应用程序,Matlab程序或Lua脚本中调用。 基于B0的远程API函数通过BlueZero中间件及其与CoppeliaSim的接口插件与CoppeliaSim进行交互。 所有这些对用户而言都是隐藏的。 远程API可以让一个或几个外部应用程序以同步或异步的方式(默认情况下为异步)与CoppeliaSim进行交互,甚至还支持对仿真器的远程控制(例如,远程加载场景,开始,暂停或停止仿真)。
“同步”一词的含义是每个仿真周期都与远程API应用程序同步运行(即,仿真器将等待来自客户端的触发信号,以在时间t + dt处开始下一个仿真周期)。 阻塞/非阻塞操作与同步/异步不同。 远程API还支持阻塞和非阻塞操作。
基于B0的远程API函数的调用方式与常规API函数的调用方式相似,但是有一个主要区别:

大多数基于B0的远程API函数都需要一个附加参数:用于执行函数调用的话题或通信渠道。该话题可以是以下5个函数之一的返回值:

simxServiceCall: 此话题允许以阻塞模式执行该功能,即命令将传递到服务器(即CoppeliaSim),在服务器上执行,然后将响应返回给客户端。仅当为了从服务器获取命令响应(一次性操作)时才使用此话题(例如simxGetObjectHandle通常使用ServiceCall来执行)。
simxDefaultPublisher: 此话题允许以非阻塞模式执行该功能,即该功能被发送到服务器(即CoppeliaSim),并且控制权立即返回给客户端(即客户端将不等待服务器的答复) 。仅在不希望/不需要服务器响应的服务器上发送命令时才使用此主题(例如,simxSetJointPosition通常将使用DefaultPublisher来执行)。
simxDefaultSubscriber:此话题通知服务器继续执行功能,并将响应连续流式传输到客户端。客户端将在回调函数中接收响应。仅当您希望从服务器端连续执行的同一命令接收响应时,才使用此主题。 (例如simxGetJointForce通常会使用DefaultSubscriber执行)。定义的回调函数通过simxSpinOnce函数调用(当输入缓冲区中有响应时)。
simxCreatePublisher:这与simxDefaultPublisher非常相似,不同之处在于创建了专用的发布者话题,即创建了专用的发布渠道。将特定的功能/命令分配给专用的发布者可能很有用,特别是对于大量数据(例如simxSetVisionSensorImage通常会使用专用的发布者来执行)。
simxCreateSubscriber:这与simxDefaultSubscriber非常相似,不同之处在于,创建了专用的订户主题,即创建了专用的订户频道。将特定的功能/命令分配给专用订户,尤其是处理大量数据(例如,simxGetVisionSensorImage通常将使用专用订户执行),可能会很有用。

默认情况下,基于B0的远程API客户端和服务器(即CoppeliaSim)将异步运行。但是,可以让客户端单独触发每个模拟步骤,以实现同步操作。以下是同步模式的Python示例:

import b0RemoteApi
import time

with b0RemoteApi.RemoteApiClient('b0RemoteApi_pythonClient','b0RemoteApi') as client:
doNextStep=True

def simulationStepStarted(msg):
simTime=msg[1][b'simulationTime'];
print('Simulation step started. Simulation time: ',simTime)

def simulationStepDone(msg):
simTime=msg[1][b'simulationTime'];
print('Simulation step done. Simulation time: ',simTime);
global doNextStep
doNextStep=True

client.simxSynchronous(True)
client.simxGetSimulationStepStarted(client.simxDefaultSubscriber(simulationStepStarted));
client.simxGetSimulationStepDone(client.simxDefaultSubscriber(simulationStepDone));
client.simxStartSimulation(client.simxDefaultPublisher())

startTime=time.time()
while time.time()<startTime+5:
if doNextStep:
doNextStep=False
client.simxSynchronousTrigger()
client.simxSpinOnce()
client.simxStopSimulation(client.simxDefaultPublisher()

基于B0的远程API功能来自两个单独的部分,它们通过BlueZero框架进行交互:

客户端(即您的应用程序):
客户端上基于B0的远程API可用于许多不同的编程语言。 当前支持以下语言:C ++,Python,Java,Matlab和Lua。 您可以轻松地创建其他语言的绑定。
服务器端(即CoppeliaSim):
服务器端基于B0的远程API是通过CoppeliaSim插件和Lua脚本(lua / b0RemoteApiServer.lua)实现的。 该插件应在启动时由CoppeliaSim加载:simExtBlueZero.dll,libsimExtBlueZero.dylib或libsimExtBlueZero.so。

客户端

API的所有单位均以米,千克,秒和弧度或它们的组合为单位(除非另有明确说明)。

要在 C ++应用程序 中使用基于B0的远程API功能,只需在项目中包括以下文件:

  1. programming/remoteApiBindings/b0Based/cpp/b0RemoteApi.h
  2. programming/remoteApiBindings/b0Based/cpp/b0RemoteApi.h
  3. 包括路径 programming/remoteApiBindings/b0Based/cpp/msgpack-c/include
  4. 包括路径 programming/blueZero/include/b0/bindings
  5. 链接blueZero库(例如b0.dll),并且不要忘记blueZero库本身具有依赖项(例如libzmq,boost_chrono,boost_system,boost_thread等)。

请查看programming / remoteApiBindings / b0Based / cpp / simpleTest项目文件,以及相应的基于B0的演示场景RemoteApiDemo.ttt,以了解更多详细信息。

要在Python脚本中使用基于B0的远程API功能,需要执行以下操作:

  1. 为Python安装MessagePack: pip install msgpack
  2. programming/remoteApiBindings/b0Based/python/b0RemoteApi.py
  3. programming/remoteApiBindings/b0Based/python/b0.py
  4. 链接blueZero库(例如b0.dll),并且不要忘记blueZero库本身具有依赖项(例如libzmq,boost_chrono,boost_system,boost_thread等)。

有关其他详细信息,请参阅programming / remoteApiBindings / b0Based / python / simpleTest.py程序,以及基于B0的演示场景RemoteApiDemo.ttt。

要在Matlab程序中使用基于B0的远程API功能,需要执行以下操作:

  1. programming/remoteApiBindings/b0Based/matlab/b0RemoteApiProto.m
  2. programming/remoteApiBindings/b0Based/matlab/b0RemoteApi.m
  3. 文件夹 programming/remoteApiBindings/b0Based/matlab/msgpack-matlab
  4. blueZero库(例如b0.dll),并且不要忘记blueZero库本身具有依赖项(例如libzmq,boost_chrono,boost_system,boost_thread等)。

请查看programming / remoteApiBindings / b0Based / matlab / simpleTest.m程序,以及相应的基于B0的演示场景RemoteApiDemo.ttt,以了解更多详细信息。

服务端

基于B0的远程API服务器端基于Lua脚本:lua / b0RemoteApiServer.lua。该脚本大量使用了BlueZero界面及其功能,已在Models / tools / B0远程Api server.ttm模型的自定义脚本以及附加脚本simAddOnScript-b0RemoteApiServer.lua中使用。如果您错过某个特定功能,则可以自己在远程API框架中实现它。

要在服务器端(即CoppeliaSim端)启用基于B0的远程API,请确保BlueZero插件已在CoppeliaSim启动时成功加载(simExtBlueZero.dll,libsimExtBlueZero.dylib或libsimExtBlueZero.so)(您可以检查控制台窗口,以获取有关插件加载的信息。)

最后,使用基于B0的远程API有两种方法:

  1. 启动附加脚本simAddOnScript-b0RemoteApiServer.lua:您可以在菜单栏 [Add-ons --> b0RemoteApiServer]中手动启动它,也可以在CoppeliaSim启动时自动启动它(在这种情况下,将附加组件重命名为simAddOnScript_b0RemoteApiServer.lua)。附加脚本为所有场景提供了基于B0的远程API功能,而不会中断。
  2. 将模型Models / tools / B0远程Api server.ttm拖放到特定场景中:这样,基于B0的远程API功能将仅适用于该特定场景
  • 点赞
  • 收藏
  • 分享
  • 文章举报
qq_29696095 发布了5 篇原创文章 · 获赞 0 · 访问量 537 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: