Motion - Blueye SDK

Skip to content


# Module blueye.sdk.motion

View Source

    class Motion:

        """Control the motion of the Pioneer, and set automatic control modes

        Motion can be set one degree of freedom at a time by using the 4 motion properties

        (surge, sway, heave and yaw) or for all 4 degrees of freedom in one go through the

        `send_thruster_setpoint` method.

        The current thruster setpoint state is stored in the `current_thruster_setpoints`

        variable, this is done because the Pioneer does not report back its current thruster

        setpoint.

        """

        def __init__(self, parent_drone):

            self._parent_drone = parent_drone

            self._tcp_client = parent_drone._tcp_client

            self._state_watcher = parent_drone._state_watcher

            self.current_thruster_setpoints = {"surge": 0, "sway": 0, "heave": 0, "yaw": 0}

        @property

        def surge(self) -> float:

            """ Set force reference for the surge direction

            Arguments:

            * **surge** (float): Force set point in the surge direction in range <-1, 1>,

                                 a positive set point makes the drone move forward

            """

            return self.current_thruster_setpoints["surge"]

        @surge.setter

        def surge(self, surge_value: float):

            self.current_thruster_setpoints["surge"] = surge_value

            self.update_setpoint()

        @property

        def sway(self) -> float:

            """ Set force reference for the sway direction

            Arguments:

            * **sway** (float): Force set point in the sway direction in range <-1, 1>,

                                a positive set point makes the drone move to the right

            """

            return self.current_thruster_setpoints["sway"]

        @sway.setter

        def sway(self, sway_value: float):

            self.current_thruster_setpoints["sway"] = sway_value

            self.update_setpoint()

        @property

        def heave(self) -> float:

            """ Set force reference for the heave direction

            Arguments:

            * **heave** (float): Force set point in the heave direction in range <-1, 1>,

                                 a positive set point makes the drone move downwards

            """

            return self.current_thruster_setpoints["heave"]

        @heave.setter

        def heave(self, heave_value: float):

            self.current_thruster_setpoints["heave"] = heave_value

            self.update_setpoint()

        @property

        def yaw(self) -> float:

            """ Set force reference for the yaw direction

            Arguments:

            * **yaw** (float): Moment set point in the sway direction in range <-1, 1>,

                               a positive set point makes the drone rotate clockwise.

            """

            return self.current_thruster_setpoints["yaw"]

        @yaw.setter

        def yaw(self, yaw_value: float):

            self.current_thruster_setpoints["yaw"] = yaw_value

            self.update_setpoint()

        def update_setpoint(self):

            self.send_thruster_setpoint(*self.current_thruster_setpoints.values())

        def send_thruster_setpoint(self, surge, sway, heave, yaw):

            """Control the thrusters of the pioneer

            Set reference values between -1 and 1 for each controllable degree of freedom on the Pioneer.

            The reference values are mapped linearly to a thruster force, a set point of -1 correspons

            to maximum negative force and a set point of 1 corresponds to maximum positive force. For the

            yaw direction the reference is a moment not a force, as the yaw direction is rotational not

            translational.

            Arguments:

            * **surge** (float): Force set point in the surge direction in range <-1, 1>,

                                 a positive set point makes the drone move forward

            * **sway** (float): Force set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone move to the right

            * **heave** (float): Force set point in the heave direction in range <-1, 1>,

                                 a positive set point makes the drone move down.

            * **yaw** (float): Moment set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone rotate clockwise.

            """

            self.current_thruster_setpoints["surge"] = surge

            self.current_thruster_setpoints["sway"] = sway

            self.current_thruster_setpoints["heave"] = heave

            self.current_thruster_setpoints["yaw"] = yaw

            self._tcp_client.motion_input(surge, sway, heave, yaw, 0, 0)

        @property

        def auto_depth_active(self) -> bool:

            """Enable or disable the auto depth control mode

            When auto depth is active, input for the heave direction to the thruster_setpoint function

            specifies a speed set point instead of a force set point. A control loop on the Pioneer will

            then attempt to maintain the wanted speed in the heave direction as long as auto depth is

            active.

            *Arguments*:

            * active (bool): Activate auto depth mode if active is true, de-activate if false

            *Returns*:

            * active (bool): Returns true if auto depth is active, false if it is not active

            """

            AUTO_DEPTH_MODE = 3

            AUTO_HEADING_AND_AUTO_DEPTH_MODE = 9

            state = self._state_watcher.general_state

            if (

                state["control_mode"] is AUTO_DEPTH_MODE

                or state["control_mode"] is AUTO_HEADING_AND_AUTO_DEPTH_MODE

            ):

                return True

            else:

                return False

        @auto_depth_active.setter

        def auto_depth_active(self, active: bool):

            if active:

                self._tcp_client.auto_depth_on()

            else:

                self._tcp_client.auto_depth_off()

        @property

        def auto_heading_active(self) -> bool:

            """Enable or disable the auto heading control mode

            When auto heading is active, input for the yaw direction to the thruster_setpoint function

            specifies a angular speed set point instead of a moment set point. A control loop on the

            Pioneer will then attempt to maintain the wanted angular velocity in the yaw direction as

            long as auto heading is active.

            *Arguments*:

            * active (bool): Activate auto heading mode if active is true, de-activate if false

            *Returns*:

            * active (bool): Returns true if auto heading mode is active, false if it is not active

            """

            AUTO_HEADING_MODE = 7

            AUTO_HEADING_AND_AUTO_DEPTH_MODE = 9

            state = self._state_watcher.general_state

            if (

                state["control_mode"] is AUTO_HEADING_MODE

                or state["control_mode"] is AUTO_HEADING_AND_AUTO_DEPTH_MODE

            ):

                return True

            else:

                return False

        @auto_heading_active.setter

        def auto_heading_active(self, active: bool):

            if active:

                self._tcp_client.auto_heading_on()

            else:

                self._tcp_client.auto_heading_off()

## Classes

### Motion

    class Motion(
        parent_drone
    )

Control the motion of the Pioneer, and set automatic control modes

Motion can be set one degree of freedom at a time by using the 4 motion properties (surge, sway, heave and yaw) or for all 4 degrees of freedom in one go through the `send_thruster_setpoint` method. The current thruster setpoint state is stored in the `current_thruster_setpoints` variable, this is done because the Pioneer does not report back its current thruster setpoint.

View Source

    class Motion:

        """Control the motion of the Pioneer, and set automatic control modes

        Motion can be set one degree of freedom at a time by using the 4 motion properties

        (surge, sway, heave and yaw) or for all 4 degrees of freedom in one go through the

        `send_thruster_setpoint` method.

        The current thruster setpoint state is stored in the `current_thruster_setpoints`

        variable, this is done because the Pioneer does not report back its current thruster

        setpoint.

        """

        def __init__(self, parent_drone):

            self._parent_drone = parent_drone

            self._tcp_client = parent_drone._tcp_client

            self._state_watcher = parent_drone._state_watcher

            self.current_thruster_setpoints = {"surge": 0, "sway": 0, "heave": 0, "yaw": 0}

        @property

        def surge(self) -> float:

            """ Set force reference for the surge direction

            Arguments:

            * **surge** (float): Force set point in the surge direction in range <-1, 1>,

                                 a positive set point makes the drone move forward

            """

            return self.current_thruster_setpoints["surge"]

        @surge.setter

        def surge(self, surge_value: float):

            self.current_thruster_setpoints["surge"] = surge_value

            self.update_setpoint()

        @property

        def sway(self) -> float:

            """ Set force reference for the sway direction

            Arguments:

            * **sway** (float): Force set point in the sway direction in range <-1, 1>,

                                a positive set point makes the drone move to the right

            """

            return self.current_thruster_setpoints["sway"]

        @sway.setter

        def sway(self, sway_value: float):

            self.current_thruster_setpoints["sway"] = sway_value

            self.update_setpoint()

        @property

        def heave(self) -> float:

            """ Set force reference for the heave direction

            Arguments:

            * **heave** (float): Force set point in the heave direction in range <-1, 1>,

                                 a positive set point makes the drone move downwards

            """

            return self.current_thruster_setpoints["heave"]

        @heave.setter

        def heave(self, heave_value: float):

            self.current_thruster_setpoints["heave"] = heave_value

            self.update_setpoint()

        @property

        def yaw(self) -> float:

            """ Set force reference for the yaw direction

            Arguments:

            * **yaw** (float): Moment set point in the sway direction in range <-1, 1>,

                               a positive set point makes the drone rotate clockwise.

            """

            return self.current_thruster_setpoints["yaw"]

        @yaw.setter

        def yaw(self, yaw_value: float):

            self.current_thruster_setpoints["yaw"] = yaw_value

            self.update_setpoint()

        def update_setpoint(self):

            self.send_thruster_setpoint(*self.current_thruster_setpoints.values())

        def send_thruster_setpoint(self, surge, sway, heave, yaw):

            """Control the thrusters of the pioneer

            Set reference values between -1 and 1 for each controllable degree of freedom on the Pioneer.

            The reference values are mapped linearly to a thruster force, a set point of -1 correspons

            to maximum negative force and a set point of 1 corresponds to maximum positive force. For the

            yaw direction the reference is a moment not a force, as the yaw direction is rotational not

            translational.

            Arguments:

            * **surge** (float): Force set point in the surge direction in range <-1, 1>,

                                 a positive set point makes the drone move forward

            * **sway** (float): Force set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone move to the right

            * **heave** (float): Force set point in the heave direction in range <-1, 1>,

                                 a positive set point makes the drone move down.

            * **yaw** (float): Moment set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone rotate clockwise.

            """

            self.current_thruster_setpoints["surge"] = surge

            self.current_thruster_setpoints["sway"] = sway

            self.current_thruster_setpoints["heave"] = heave

            self.current_thruster_setpoints["yaw"] = yaw

            self._tcp_client.motion_input(surge, sway, heave, yaw, 0, 0)

        @property

        def auto_depth_active(self) -> bool:

            """Enable or disable the auto depth control mode

            When auto depth is active, input for the heave direction to the thruster_setpoint function

            specifies a speed set point instead of a force set point. A control loop on the Pioneer will

            then attempt to maintain the wanted speed in the heave direction as long as auto depth is

            active.

            *Arguments*:

            * active (bool): Activate auto depth mode if active is true, de-activate if false

            *Returns*:

            * active (bool): Returns true if auto depth is active, false if it is not active

            """

            AUTO_DEPTH_MODE = 3

            AUTO_HEADING_AND_AUTO_DEPTH_MODE = 9

            state = self._state_watcher.general_state

            if (

                state["control_mode"] is AUTO_DEPTH_MODE

                or state["control_mode"] is AUTO_HEADING_AND_AUTO_DEPTH_MODE

            ):

                return True

            else:

                return False

        @auto_depth_active.setter

        def auto_depth_active(self, active: bool):

            if active:

                self._tcp_client.auto_depth_on()

            else:

                self._tcp_client.auto_depth_off()

        @property

        def auto_heading_active(self) -> bool:

            """Enable or disable the auto heading control mode

            When auto heading is active, input for the yaw direction to the thruster_setpoint function

            specifies a angular speed set point instead of a moment set point. A control loop on the

            Pioneer will then attempt to maintain the wanted angular velocity in the yaw direction as

            long as auto heading is active.

            *Arguments*:

            * active (bool): Activate auto heading mode if active is true, de-activate if false

            *Returns*:

            * active (bool): Returns true if auto heading mode is active, false if it is not active

            """

            AUTO_HEADING_MODE = 7

            AUTO_HEADING_AND_AUTO_DEPTH_MODE = 9

            state = self._state_watcher.general_state

            if (

                state["control_mode"] is AUTO_HEADING_MODE

                or state["control_mode"] is AUTO_HEADING_AND_AUTO_DEPTH_MODE

            ):

                return True

            else:

                return False

        @auto_heading_active.setter

        def auto_heading_active(self, active: bool):

            if active:

                self._tcp_client.auto_heading_on()

            else:

                self._tcp_client.auto_heading_off()

#### Instance variables

    auto_depth_active

Enable or disable the auto depth control mode

When auto depth is active, input for the heave direction to the thruster_setpoint function specifies a speed set point instead of a force set point. A control loop on the Pioneer will then attempt to maintain the wanted speed in the heave direction as long as auto depth is active.

Arguments:

- active (bool): Activate auto depth mode if active is true, de-activate if false

Returns:

- active (bool): Returns true if auto depth is active, false if it is not active

    auto_heading_active

Enable or disable the auto heading control mode

When auto heading is active, input for the yaw direction to the thruster_setpoint function specifies a angular speed set point instead of a moment set point. A control loop on the Pioneer will then attempt to maintain the wanted angular velocity in the yaw direction as long as auto heading is active.

Arguments:

- active (bool): Activate auto heading mode if active is true, de-activate if false

Returns:

- active (bool): Returns true if auto heading mode is active, false if it is not active

    heave

Set force reference for the heave direction

Arguments:

- heave (float): Force set point in the heave direction in range <-1, 1>, a positive set point makes the drone move downwards

    surge

Set force reference for the surge direction

Arguments:

- surge (float): Force set point in the surge direction in range <-1, 1>, a positive set point makes the drone move forward

    sway

Set force reference for the sway direction

Arguments:

- sway (float): Force set point in the sway direction in range <-1, 1>, a positive set point makes the drone move to the right

    yaw

Set force reference for the yaw direction

Arguments:

- yaw (float): Moment set point in the sway direction in range <-1, 1>, a positive set point makes the drone rotate clockwise.

#### Methods

##### send_thruster_setpoint

    def send_thruster_setpoint(
        self,
        surge,
        sway,
        heave,
        yaw
    )

Control the thrusters of the pioneer

Set reference values between -1 and 1 for each controllable degree of freedom on the Pioneer. The reference values are mapped linearly to a thruster force, a set point of -1 correspons to maximum negative force and a set point of 1 corresponds to maximum positive force. For the yaw direction the reference is a moment not a force, as the yaw direction is rotational not translational.

Arguments:

- surge (float): Force set point in the surge direction in range <-1, 1>, a positive set point makes the drone move forward
- sway (float): Force set point in the sway direction in range <-1, 1>, a positive set point makes the drone move to the right
- heave (float): Force set point in the heave direction in range <-1, 1>, a positive set point makes the drone move down.
- yaw (float): Moment set point in the sway direction in range <-1, 1>, a positive set point makes the drone rotate clockwise.

View Source

        def send_thruster_setpoint(self, surge, sway, heave, yaw):

            """Control the thrusters of the pioneer

            Set reference values between -1 and 1 for each controllable degree of freedom on the Pioneer.

            The reference values are mapped linearly to a thruster force, a set point of -1 correspons

            to maximum negative force and a set point of 1 corresponds to maximum positive force. For the

            yaw direction the reference is a moment not a force, as the yaw direction is rotational not

            translational.

            Arguments:

            * **surge** (float): Force set point in the surge direction in range <-1, 1>,

                                 a positive set point makes the drone move forward

            * **sway** (float): Force set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone move to the right

            * **heave** (float): Force set point in the heave direction in range <-1, 1>,

                                 a positive set point makes the drone move down.

            * **yaw** (float): Moment set point in the sway direction in range <-1, 1>,

                                 a positive set point makes the drone rotate clockwise.

            """

            self.current_thruster_setpoints["surge"] = surge

            self.current_thruster_setpoints["sway"] = sway

            self.current_thruster_setpoints["heave"] = heave

            self.current_thruster_setpoints["yaw"] = yaw

            self._tcp_client.motion_input(surge, sway, heave, yaw, 0, 0)

##### update_setpoint

    def update_setpoint(
        self
    )

View Source

        def update_setpoint(self):

            self.send_thruster_setpoint(*self.current_thruster_setpoints.values())