amino
Lightweight Robot Utility Library
|
Amino provides a convenient, human-readable syntax for specifying scene graphs. The scenefile syntax is curly-brace inspired and supports constant definitions, object classes, and include files. Amino's scenegraph compiler `aarxc` translates scenefiles to C code.
C-style block comments (/* COMMENT */
), C++-style line comments (// COMMENT
), and shell-style line comments (# COMMENT
) are supported.
/* This is a block comment. * It can continue over multiple * lines. /* // This is a line comment. # This is also a line comment.
The include statement inserts the contents of the named file into the current file. Include files may be useful to reuse a shared set of constants and class definitions over multiple scenes.
<INCLUDE_STMT> => "include" <STRING>
include "file1.robray"
The definition statement creates a named, numeric constant. The value may be computed as an arithmetic expression.
<DEF_STMT> => "def" <ID> <EXP> ";" <EXP> => <ID> | <FLOAT> | <EXP> <BINOP> <EXP> | "-" <EXP> | "(" <EXP> ")"
The following defines a single constant value:
def my_length 0.1;
The following defines constants for various length units:
def cm 1e-2; def inch 2.54*cm; def foot 12*inch;
The frame statement defines a kinematic frame, i.e., a pose in SE(3).
<FRAME_STMT> => "frame" <ID> "{" <FRAME_ATTRIBUTE_LIST> "}" <FRAME_ATTRIBUTE_LIST> => <FRAME_ATTRIBUTE> | <FRAME_ATTRIBUTE> <FRAME_ATTRIBUTE_LIST> <FRAME_ATTRIBUTE> => <ID> <ATTRIBUTE_VALUE> ";" | "geometry" "{" <GEOMETRY_ATTRIBUTE_LIST> "}" | <FRAME_STMT> <GEOMETRY_ATTRIBUTE_LIST> => <GEOMETRY_ATTRIBUTE> | <GEOMETRY_ATTRIBUTE> <GEOMETRY_ATTRIBUTE_LIST> <GEOMETRY_ATTRIBUTE> => <ID> <ATTRIBUTE_VALUE> ";" <ATTRIBUTE_VALUE> => <EXP> | <ARRAY>
// Define some sizes for objects def table_size 1e-2; // 1 cm def block_size .1; // 10cm // Define a stacking height def table_stack (block_size + table_size)/2 + 1e-3; /* A table at the world origin */ frame front_table { geometry { dimension [.75, .75, table_size]; shape box; color [.6, .3, .6]; } } // This block is placed on the table frame block_a { parent front_table; translation [.25, 0, table_stack]; quaternion [0, 0, 1, 0]; // rotate pi about Z geometry { shape box; color [0, 1, 0]; alpha 0.5; dimension [block_size, block_size, block_size]; } } // This block is placed on the table frame block_b { parent front_table; translation [-.25, 0, table_stack]; rpy [0, 0, pi]; /* also rotate pi about Z, * pi is a float constant in the language */ geometry { shape box; color [0, 1, 0]; alpha 0.5; dimension [block_size, block_size, block_size]; } }
Name | Value Type | Description |
---|---|---|
parent | Identifier | The parent of this frame in the scene graph |
translation | Array [3] | Pose Translation |
quaternion | Array [4] | Pose Rotation Quaternion |
rpy | Array [3] | Pose Rotation Euler-Angle (Roll-Pitch-Yaw) |
type | Identifier | Joint type (fixed, prismatic, or revolute |
axis | Array [3] | Axis of rotation (revolute) or translation (prismatic) |
offset | Float | Value added to configuration variable prismatic/revolute frames |
Name | Value Type | Description |
---|---|---|
isa | Identifier | Class for geometry (multiple isa attributes are allow) |
shape | Identifier | Geometry's shape (box, grid, cylinder, mesh) |
color | Array[3] | RGB color |
alpha | Float | Alpha layer (transparency), 0: clear, 1: opaque |
dimension | Array | Geometry dimensions (for box, grid) |
height | Float | Geometry height (for cylinder, cone) |
radius | Float | Geometry radius (for cylinder, sphere) |
The class statement defines a set of attributes (shape, color, dimensions) which may be applied to multiple geometric objects.
<CLASS_STMT> => "class" <ID> "{" <GEOMETRY_ATTRIBUTE_LIST> "}" <GEOMETRY_ATTRIBUTE_LIST> => <GEOMETRY_ATTRIBUTE> | <GEOMETRY_ATTRIBUTE> <GEOMETRY_ATTRIBUTE_LIST> <GEOMETRY_ATTRIBUTE> => <ID> <ATTRIBUTE_VALUE> ";" <ATTRIBUTE_VALUE> => <EXP> | <ARRAY>
// Define some sizes for objects def table_size 1e-2; // 1 cm def block_size .1; // 10cm // Define a stacking height def table_stack (block_size + table_size)/2 + 1e-3; class block { shape box; color [0, 1, 0]; alpha 0.5; dimension [block_size, block_size, block_size]; } /* A table at the world origin */ frame front_table { geometry { dimension [.75, .75, table_size]; shape box; color [.6, .3, .6]; } } // This block is placed on the table frame block_a { parent front_table; translation [.25, 0, table_stack]; quaternion [0, 0, 1, 0]; // rotate pi about Z geometry { isa block; } } // This block is placed on the table frame block_b { parent front_table; translation [-.25, 0, table_stack]; rpy [0, 0, pi]; /* also rotate pi about Z, * pi is a float constant in the language */ geometry { isa block; } }
The allowed collision statement instructs the collision checker to ignore any potential collisions between two frames.
<ALLOWED_COLLISION_STMT> => "allow_collision" <STRING> <STRING> ";"
The following statement will ignore any collisions between geometry attached to frames "right_arm_forearm" and "right_arm_wrist".
allow_collision "right_arm_forearm" "right_arm_wrist";
<START> => <INCLUDE_STMT> | <DEF_STMT> | <CLASS_STMT> | <FRAME_STMT> | <ALLOWED_COLLISION_STMT> | <COMMENT> <COMMENT> => <LINE_COMMENT> | <BLOCK_COMMENT> <INCLUDE_STMT> => "include" <STRING> <DEF_STMT> => "def" <ID> <EXP> ";" <EXP> => <ID> | <FLOAT> | <EXP> <BINOP> <EXP> | "-" <EXP> | "(" <EXP> ")" <CLASS_STMT> => "class" <ID> "{" <GEOMETRY_ATTRIBUTE_LIST> "}" <FRAME_STMT> => "frame" <ID> "{" <FRAME_ATTRIBUTE_LIST> "}" <FRAME_ATTRIBUTE_LIST> => <FRAME_ATTRIBUTE> | <FRAME_ATTRIBUTE> <FRAME_ATTRIBUTE_LIST> <FRAME_ATTRIBUTE> => <ID> <ATTRIBUTE_VALUE> ";" | "geometry" "{" <GEOMETRY_ATTRIBUTE_LIST> "}" | <FRAME_STMT> <GEOMETRY_ATTRIBUTE_LIST> => <GEOMETRY_ATTRIBUTE> | <GEOMETRY_ATTRIBUTE> <GEOMETRY_ATTRIBUTE_LIST> <GEOMETRY_ATTRIBUTE> => <ID> <ATTRIBUTE_VALUE> ";" <ATTRIBUTE_VALUE> => <EXP> | <ARRAY> <ARRAY> => "[" <ARRAY_ELEMENTS> "]" <ARRAY_ELEMENTS> => <EXP> | <EXP> "," <ARRAY_ELEMENTS> <ALLOWED_COLLISION_STMT> => "allow_collision" <STRING> <STRING> ";"
Description | Terminal Symbol | Examples | Regular Expression |
---|---|---|---|
Identifier | <ID> | foo, foo_bar, bif42 | [a-zA-Z][a-zA-Z0-9_] |
Integer | <INT> | 1, 42 | -?[0-9]+ |
Floating Point Number | <FLOAT> | 3.14159, 1e-2 | -?[0-9]+((\.[0-9]*)?([eds]-?[0-9]+)? |
Binary Operator | <BINOP> | +, -, *, / | [\+\-\*/] |
String | <STRING> | "Hello World!" | \"[^\"]*\" |
Line Comment | <LINE_COMMENT> | // foo, # foo | (#|//).*$ |
Block Comment | <BLOCK_COMMENT> | /* foo */ | /\*.*\*/ |
Amino includes a simple emacs mode for editing scene files. To enable it, add the following to your .emacs
file:
(require 'robray-mode)
Amino includes syntax highlighting for Vim. To enable it, run the following commands (assuming amino was installed under /usr/local):
mkdir -p ~/.vim/syntax ln -s /usr/local/share/amino/vim/syntax/robray.vim ~/.vim/syntax/ mkdir -p ~/.vim/ftdetect ln -s /usr/local/share/amino/vim/ftdetect/robray.vim ~/.vim/ftdetect/
class.robray
// Define some sizes for objects def table_size 1e-2; // 1 cm def block_size .1; // 10cm // Define a stacking height def table_stack (block_size + table_size)/2 + 1e-3; class block { shape box; color [0, 1, 0]; alpha 0.5; dimension [block_size, block_size, block_size]; }
table.robray
include "class.robray" /* A table at the world origin */ frame front_table { geometry { dimension [.75, .75, table_size]; shape box; color [.6, .3, .6]; } } // This block is placed on the table frame block_a { parent front_table; translation [.25, 0, table_stack]; quaternion [0, 0, 1, 0]; // rotate pi about Z geometry { isa block; } } // This block is placed on the table frame block_b { parent front_table; translation [-.25, 0, table_stack]; rpy [0, 0, pi]; /* also rotate pi about Z, * pi is a float constant in the language */ geometry { isa block; } }
aarxc
can load URDF files.