Module qfly.pose

Expand source code
from qfly import utils


class Pose:
    """
    Full pose data with euler angles or rotation matrix.
    """

    def __init__(self, x, y, z, roll=None, pitch=None, yaw=None, rotmatrix=None):
        self.x = x
        self.y = y
        self.z = z

        self.roll = roll
        self.pitch = pitch
        self.yaw = yaw
        self.rotmatrix = rotmatrix

    @classmethod
    def from_qtm_6d(cls, qtm_6d):
        """
        Constructs Pose from QTM 6D component.

        Parameters
        ----------
        qtm_6d
            6D pose data from QTM component
        """
        qtm_rot = qtm_6d[1].matrix
        rotmatrix = [[qtm_rot[0], qtm_rot[3], qtm_rot[6]],
                     [qtm_rot[1], qtm_rot[4], qtm_rot[7]],
                     [qtm_rot[2], qtm_rot[5], qtm_rot[8]]]
        return cls(qtm_6d[0][0] / 1000,
                   qtm_6d[0][1] / 1000,
                   qtm_6d[0][2] / 1000,
                   rotmatrix=rotmatrix)

    def clamp(self, world):
        """
        Geofences pose within safe airspace
        defined by world parameter.

        Parameters
        ----------
        world : World
            World object defining airspace rules.
        """
        self.x = max(world.origin.x - world.expanse + world.padding,
                     min(self.x, world.origin.x + world.expanse - world.padding))
        self.y = max(world.origin.y - world.expanse + world.padding,
                     min(self.y, world.origin.y + world.expanse - world.padding))
        self.z = max(0,
                     min(self.z, world.origin.z + (2 * world.expanse) - world.padding))

    def distance_to(self, other_pose):
        """
        Returns distance between coordinates
        represented by two Pose objects.

        Parameters
        ----------
        other_pose : Pose
            Target Pose to measure distance between.
        """
        return utils.sqrt(
            (self.x - other_pose.x) ** 2 +
            (self.y - other_pose.y) ** 2 +
            (self.z - other_pose.z) ** 2)

    def is_valid(self):
        """
        Checks if any of the coodinates are NaN.
        """
        return self.x == self.x and self.y == self.y and self.z == self.z

    def __str__(self):
        # return "x: {:6.2f} y: {:6.2f} z: {:6.2f} Roll: {:6.2f} Pitch: {:6.2f} Yaw: {:6.2f}".format(
        # self.x, self.y, self.z, self.roll, self.pitch, self.yaw)
        return f'x: {self.x} y: {self.y} z: {self.z} yaw: {self.yaw}'

Classes

class Pose (x, y, z, roll=None, pitch=None, yaw=None, rotmatrix=None)

Full pose data with euler angles or rotation matrix.

Expand source code
class Pose:
    """
    Full pose data with euler angles or rotation matrix.
    """

    def __init__(self, x, y, z, roll=None, pitch=None, yaw=None, rotmatrix=None):
        self.x = x
        self.y = y
        self.z = z

        self.roll = roll
        self.pitch = pitch
        self.yaw = yaw
        self.rotmatrix = rotmatrix

    @classmethod
    def from_qtm_6d(cls, qtm_6d):
        """
        Constructs Pose from QTM 6D component.

        Parameters
        ----------
        qtm_6d
            6D pose data from QTM component
        """
        qtm_rot = qtm_6d[1].matrix
        rotmatrix = [[qtm_rot[0], qtm_rot[3], qtm_rot[6]],
                     [qtm_rot[1], qtm_rot[4], qtm_rot[7]],
                     [qtm_rot[2], qtm_rot[5], qtm_rot[8]]]
        return cls(qtm_6d[0][0] / 1000,
                   qtm_6d[0][1] / 1000,
                   qtm_6d[0][2] / 1000,
                   rotmatrix=rotmatrix)

    def clamp(self, world):
        """
        Geofences pose within safe airspace
        defined by world parameter.

        Parameters
        ----------
        world : World
            World object defining airspace rules.
        """
        self.x = max(world.origin.x - world.expanse + world.padding,
                     min(self.x, world.origin.x + world.expanse - world.padding))
        self.y = max(world.origin.y - world.expanse + world.padding,
                     min(self.y, world.origin.y + world.expanse - world.padding))
        self.z = max(0,
                     min(self.z, world.origin.z + (2 * world.expanse) - world.padding))

    def distance_to(self, other_pose):
        """
        Returns distance between coordinates
        represented by two Pose objects.

        Parameters
        ----------
        other_pose : Pose
            Target Pose to measure distance between.
        """
        return utils.sqrt(
            (self.x - other_pose.x) ** 2 +
            (self.y - other_pose.y) ** 2 +
            (self.z - other_pose.z) ** 2)

    def is_valid(self):
        """
        Checks if any of the coodinates are NaN.
        """
        return self.x == self.x and self.y == self.y and self.z == self.z

    def __str__(self):
        # return "x: {:6.2f} y: {:6.2f} z: {:6.2f} Roll: {:6.2f} Pitch: {:6.2f} Yaw: {:6.2f}".format(
        # self.x, self.y, self.z, self.roll, self.pitch, self.yaw)
        return f'x: {self.x} y: {self.y} z: {self.z} yaw: {self.yaw}'

Static methods

def from_qtm_6d(qtm_6d)

Constructs Pose from QTM 6D component.

Parameters

qtm_6d
6D pose data from QTM component
Expand source code
@classmethod
def from_qtm_6d(cls, qtm_6d):
    """
    Constructs Pose from QTM 6D component.

    Parameters
    ----------
    qtm_6d
        6D pose data from QTM component
    """
    qtm_rot = qtm_6d[1].matrix
    rotmatrix = [[qtm_rot[0], qtm_rot[3], qtm_rot[6]],
                 [qtm_rot[1], qtm_rot[4], qtm_rot[7]],
                 [qtm_rot[2], qtm_rot[5], qtm_rot[8]]]
    return cls(qtm_6d[0][0] / 1000,
               qtm_6d[0][1] / 1000,
               qtm_6d[0][2] / 1000,
               rotmatrix=rotmatrix)

Methods

def clamp(self, world)

Geofences pose within safe airspace defined by world parameter.

Parameters

world : World
World object defining airspace rules.
Expand source code
def clamp(self, world):
    """
    Geofences pose within safe airspace
    defined by world parameter.

    Parameters
    ----------
    world : World
        World object defining airspace rules.
    """
    self.x = max(world.origin.x - world.expanse + world.padding,
                 min(self.x, world.origin.x + world.expanse - world.padding))
    self.y = max(world.origin.y - world.expanse + world.padding,
                 min(self.y, world.origin.y + world.expanse - world.padding))
    self.z = max(0,
                 min(self.z, world.origin.z + (2 * world.expanse) - world.padding))
def distance_to(self, other_pose)

Returns distance between coordinates represented by two Pose objects.

Parameters

other_pose : Pose
Target Pose to measure distance between.
Expand source code
def distance_to(self, other_pose):
    """
    Returns distance between coordinates
    represented by two Pose objects.

    Parameters
    ----------
    other_pose : Pose
        Target Pose to measure distance between.
    """
    return utils.sqrt(
        (self.x - other_pose.x) ** 2 +
        (self.y - other_pose.y) ** 2 +
        (self.z - other_pose.z) ** 2)
def is_valid(self)

Checks if any of the coodinates are NaN.

Expand source code
def is_valid(self):
    """
    Checks if any of the coodinates are NaN.
    """
    return self.x == self.x and self.y == self.y and self.z == self.z