Skip to content

The AMBF Description Format

Adnan Munawar edited this page Apr 17, 2019 · 8 revisions

The AMBF Description Format uses YAML to specify Bodies, Joints, Lights, Cameras and Sensors. The format has been developed to make it easier for users to develop complex interconnected robots and mechanisms with fully customizable dynamic parameters while keeping the syntax easy and human readable. On one hand, this format has been inspired by URDF (Unified Robot Description Format) and SDF (Simulation Description Format) while on the other it's has been developed to address the key limitations and complexities of both URDF and SDF. The first and foremost goal of the format is the choice or markup language (YAML). In our experience, YAML is much easier to read and modify.

The Anatomy of the AMBF Format

In general, the current version 0.1 of the AMBF Format can specify the following objects

  • Rigid Bodies (Kinematic and Dynamic)
    • Cartesian Controllers for these Bodies
  • Soft Bodies
  • Joints
    • Types of Joints
      • Prismatic or Slider Joints
      • Revolute, Hinge or Continous Joints
      • Point To Point or P2P Constraints
      • Fixed Joints
      • Linear Springs
      • Torsion or Angular Springs
    • Joint Controllers
  • Multiple Cameras as Viewports
  • Lights
  • Sensors
    • Types of Sensors
      • Proximity Sensors (using Ray Tracing)

Delving Deeper into the AMBF Format

We can start by examining a very basic example of a multibody defined by the AMBF Format. This multibody Consists of two Rigid Bodies and a Joint.

bodies: [BodyA, BodyB]
joints: [JointA]
high resolution path: ./high_res/
low resolution path: ./low_res/
namespace: /ambf/env/

BodyA:
  name: base_plate
  mesh: base_plate.STL
  mass: 5.0
  location:
    orientation: {p: -0.0, r: 0.0, y: 0.0}
    position: {x: 1.0, y: 0.0, z: -1.0}
  color: orange_tomato

BodyB:
  name: latch
  mesh: latch.STL
  mass: 0.3
  location:
    orientation: {p: 1.571, r: -0.0, y: 0.0}
    position: {x: 1.0, y: -0.85, z: -1.0}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.0, y: -0.162, z: -0.003}
  color: red_crimson

JointA:
  name: hinge_AB
  parent: BodyA
  child: BodyB
  parent axis: {x: 1.0, y: 0.0, z: 0.0}
  parent pivot: {x: 0.0, y: -0.85, z: 0.0}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  type: revolute

Let's start examining the different subsections of this config file. We can call each section a data-block. Towards this end, this config file can be broken down into four data-blocks which are explained below

  1. Header or Global Data-Block
  2. BodyA Data-Block
  3. BodyB Data-Block
  4. JointA Data-Block

The whole concept of AMBF revolves around the asynchronous concept of data-blocks. The data blocks can potentially be split into different config files and should work independently of each other even though they can be related to each other by constraints. More on this later.

Clone this wiki locally