This library provides primitives for dealing with scene and robot geometry
Project description
Overview
geometry.py
provides primitives for dealing with scene and robot geometry.
Main Concepts
Geometrical types
Pose
: The 6D position and orientation of a body. Construction methods:
Pose(position=[x, y, z], quaternion=[w, i, j, k])
Pose.from_hmat(homogeneous_matrix)
Pose.from_poseuler(poseuler=[x,y,z, p,r,w], ordering="XYZ")
Wrench
andWrenchStamped
6D force-torque.Twist
andTwistStamped
6D velocity.Accel
andAccelStamped
6D acceleration.
For debugging and visualization, Pose
and PoseStamped
objects can be
constructed with a name
parameter.
Frames and Stamped types
All quantities here come in plain and 'Stamped' varieties. A stamped quantity
(E.g. TwistStamped
) is always defined as a plain type (E.g. Twist
) with
respect to a frame
. A frame
is something that can be evaluated
to a world-pose -- either a PoseStamped
or a Grounding
. A grounding is
optional (i.e. can use None to indicate world-frame). This library supports
different grounding back-ends, e.g. mujoco-elements or observation-dicts.
For example, the pose of a plug in a robot gripper could be expressed as a
PoseStamped
with a combination of the Pose
of the gripper in world frame
and the pose of the plug with respect to the gripper.
A frame for a stamped quantity can be:
- Another stamped quantity,
- A "grounding" (a user chosen type).
- A user supplied
Physics
instance must be able to provide the worldPose
of a grounding. The library definedMujocoPhysics
does this formjcf.Element
instances. None
, in which case, world frame is assumed.
Therefore in the above example, the first quantity might come from a mujoco model (possibly synchronized with the real world), and the second quantity might be known a priori or estimated by vision.
gripper_in_world = PoseStamped(pose=None, frame=synced_gripper_mjcf_body)
plug_in_gripper = Pose(...) # From vision pose model.
plug_pose = PoseStamped(plug_in_gripper, frame=gripper_in_world)
(A more realistic example would have the pose of the plug in the camera frame then either having the camera in the kinematic tree of the robot (attached to the robot) or having it and the robot in world frame)
Then the pose of the plug in the world frame can be calculated as:
plug_in_world: Pose = plug_pose.get_world_pose()
Immutability
All types in geometry.py
are immutable. You can create modified copies of
existing values with the replace
and with_*
methods. replace
is similar in
spirit to collections.namedtuple._replace
, these methods return new objects.
PoseStamped
This is the stamped version of a Pose.
- Its frame hierarchy can be flattened with
to_world
, which returns aPoseStamped
in world frame. - The
Pose
relative to another frame is returned fromget_relative_pose
. - The
Pose
relative to the world frame is returned fromget_world_pose
.
So, in the case of a gripper in camera frame which is not attached to the robot,
we could to_world()
either the gripper or plug PoseStamped
, giving a new
frame and then calculate thier relative pose (plug relative to robot) with
get_relative_pose
.
HybridPoseStamped
A PoseStamped
where the position or orientation can be overriden. This is
useful to express the idea of (for example) the position of the gripper with
world orientation to allow for more intuitive operator control of the gripper.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for dm_robotics_geometry-0.6.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 38b98a4d29d907d9030e2e422ae21f991f6eb9d2f614e691413a72b3422cdee8 |
|
MD5 | b9aa9666dec080db98a11f071cd99634 |
|
BLAKE2b-256 | 899fd413a4083c9e7290542647d0b752a5e5888b9701b039f06baac88667e0be |