一、简介
Gazebo 使用分布式架构,具有用于物理模拟、渲染、用户界面、通信和传感器生成的独立库。此外,gazebo 提供了两个用于运行模拟的可执行程序:
- 1 用于模拟物理、渲染和传感器的服务器 gzserver
- 2 一个客户端 gzclient,它提供了一个图形界面来可视化并与模拟交互
客户端和服务器使用 Gazebo 通信库进行通信。
二、进程间通信
2.1 基础概念
- 序列化:将对象压成字串叫编码,将字串解释成对象叫解码,编解码就是序列化和反序列化。
- RMI :(Remote Method Invocation)远程方法调用,就是stub(client)和sceleton(server)之间得进程调用。
- Protocol Buffers:(简称:ProtoBuf)是一种开源跨平台的序列化资料结构的协议。其对于储存资料或在网络上进行通讯的程式是很有用的。这个方法包含一个接口描述语言,描述一些资料结构,并提供程式工具根据这些描述产生程式码,这些代码将用来生成或解析代表这些数据结构的字节流。
- Boost.Asio:Asio 代表异步输入/输出。这个库使得异步处理数据成为可能。异步是指当启动操作时,启动程序不需要等待操作结束。相反,当操作结束时,Boost.Asio 会通知程序。优点是可以同时执行其他操作。
- RPC:是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。 如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作遠端呼叫或遠端方法呼叫,例:Java RMI。 RPC是一种进程间通信的模式,程序分布在不同的地址空间里。
2.2 Gazebo通信
通信库目前使用开源的 Google Protobuf 进行消息序列化,使用 boost::ASIO 进行传输机制。它支持发布/订阅通信范式。例如,模拟世界发布身体姿势更新,传感器生成和 GUI 将使用这些消息来产生输出。
这种机制允许对正在运行的模拟进行自省,并提供一种方便的机制来控制 Gazebo 的各个方面。
三、系统和成员
3.1 主管理进程(Gazebo Master)
这本质上是一个主题名称服务器。它提供名称查找和主题管理。单个主机可以处理多个物理模拟、传感器生成器和 GUI。
3.2 通信库(Communication Library)
- Dependencies: Protobuf and boost::ASIO
- External API: Support communication with Gazebo nodes over named topics
- Internal API: None
- Advertised Topics: None
- Subscribed Topics: None
几乎所有后续库都使用该库。它充当 Gazebo 的通信和传输机制。它目前仅支持发布/订阅,但可以轻松使用 RPC。
3.3 物理库
- 依赖项:动态引擎(带有内部碰撞检测)
- 外部 API:为物理仿真提供简单通用的接口
- 内部 API:为 3rd 方动态引擎定义物理库的基本接口。
物理库为基本模拟组件(包括刚体、碰撞形状和用于表示关节约束的关节)提供了一个简单而通用的接口。该接口已与四个开源物理引擎集成:
每个物理引擎都可以加载使用 XML 以模拟描述格式 (SDF) 描述的模型。这提供了对不同算法实现和模拟功能的访问。
3.4 渲染库
- 依赖:OGRE
- 外部 API:允许加载、初始化和场景创建
- 内部 API:存储元数据进行可视化,调用 OGRE API 进行渲染。
渲染库使用 OGRE 提供一个简单的界面,用于将 3D 场景渲染到 GUI 和传感器库。它包括照明、纹理和天空模拟。可以为渲染引擎编写插件。
3.5 传感器生成
- 依赖项:渲染库、物理库
- 外部 API:提供初始化和运行一组传感器的功能
- 内部 API:待定
传感器生成库实现了所有各种类型的传感器,监听来自物理模拟器的世界状态更新,并产生由实例化传感器指定的输出。
3.6 图形用户界面
- 依赖项:渲染库,Qt
- 外部 API:无
- 内部 API:无
GUI 库使用 Qt 创建图形小部件,供用户与仿真进行交互。用户可以通过 GUI 小部件暂停或更改时间步长大小来控制时间流。用户还可以通过添加、修改或移除模型来修改场景。此外,还有一些用于可视化和记录模拟传感器数据的工具。
3.7 插件
物理、传感器和渲染库支持插件。这些插件使用户无需使用通信系统即可访问相应的库。