IsaacSim Unity3D - 与Isaac SDK通讯
IsaacSim Unity3D Core使用Isaac SDK C API和C#绑定在Unity内部创建一个Isaac应用程序,并在Isaac应用程序和Unity脚本组件之间传递消息。
Unity和Isaac之间的通信概述对于一个典型的用例(如上图所示),Unity场景会创建一个navsim.app.json
带有TcpPublisher节点的Isaac应用程序()。在Unity场景中,在每一帧上,附加到Unity相机的CameraSimulator C#脚本(1)都会将RGB图像渲染到屏幕外缓冲区,使用该图像缓冲区创建Isaac ColorCameraProto消息,并将该消息发布到消息分类帐Isaac TcpPublisher节点(2)的地址。在Unity外部运行的单独的Isaac应用程序可以订阅(3)到TcpPublisher,接收模拟的RGB图像,然后对其进行后续计算(4)。
Isaac在Unity中的应用
IsaacApplication脚本采用Isaac应用程序JSON文件名。当start()方法是在此脚本后执行统一开始运行,该脚本创建从指定的应用程序JSON文件的艾萨克应用程序并启动它。在Unity停止运行之前,将停止并销毁Isaac应用程序。
要将IsaacApplication脚本和必要的C / C#API绑定添加到场景,请将Core包> Prefabs> isaac.alice预制件附加到场景。
信息获取时间
自游戏开始以来,团结时间以秒为单位进行度量,并且每帧都提前一次。因此,由IsaacComponent发布的每个Isaac消息在Unity的同一帧中都具有相同的acqtime
。
自应用程序开始以来,Isaac的应用时间以纳秒为单位。由于在Unity模拟之后启动了在Unity中运行的Isaac应用程序,因此Unity时钟和Isaac时钟之间存在偏移。该偏移量在每个Unity帧的开始处进行一次测量,并用该帧中发布/接收的每个Isaac消息进行补偿。
另外,navsim.app.json
在Unity(1)中运行的Isaac应用程序()和接收模拟数据(3)的Isaac导航应用程序也具有不同的时钟。将 Isaac :: Alice :: TimeSynchronizer组件添加到两个应用程序的TcpPublisher和TcpSubscriber节点中,以补偿此偏移量。
讯息转换
Isaac SDK消息基于Cap'n Proto,而C#并没有很好地支持它们。为了绕过此限制,Isaac SDK还支持JSON和Capnp原型之间的转换。IsaacComponent C#脚本以JSON&缓冲区格式生成消息,其中大多数高级数据被格式化为JSON对象,大型数据块(例如图像和张量)存储在字节缓冲区中。在navsim.app.json
通过TCP发布之前,在Unity()中运行的Isaac应用程序会将这些JSON消息转换为相应的Capnp原型消息。
邮件路由
下图概述了消息如何连接IsaacSim Unity3D和不同的Isaac应用程序组件:
Unity3D消息传递工作流程Unity中每个发布或接收Isaac消息的IsaacComponent脚本都必须在Unity中的Isaac应用程序中指定消息通道。消息通道通过节点名称,组件名称和通道标签指定。在上图中,Isaac应用程序(navsim.app.json
)具有一个“ navsim”节点,其节点类型为TcpPublisher(2)。Unity中的CameraSimulator脚本(1)配置为使用通道navsim/output/color
,其中“ color”是通道标签。TcpPublisher(2)将带有相应标签的所有消息发布到同一通道(navsim/output
)。
座标
Isaac SDK使用右手坐标系(x:forward,y:left,z:up),而Unity使用左手坐标系(x:forward,y:up,z:left)。因此,在从Unity发布消息之前,旋转和位置都将在Unity脚本中转换为右手坐标。同样,当在Unity中接收消息时,从以撒收到的姿势将转换为左手坐标。坐标系的这种差异也适用于Isaac和Unity相机镜框。
以撒坐标与Unity坐标左:以撒坐标– 右:统一坐标
艾萨克相机框和Unity相机框左:以撒相机坐标– 右:Unity相机坐标
网友评论