> ## Documentation Index
> Fetch the complete documentation index at: https://scaledfoundations-rebrand.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# MultirotorClient

## \_\_init\_\_

<ResponseField name="MultirotorClient.__init__(ip=&#x22;&#x22;, port=41451, timeout_value=3600)">
  No description provided!
</ResponseField>

## takeoffAsync

<ResponseField name="MultirotorClient.takeoffAsync(timeout_sec=20, vehicle_name=&#x22;&#x22;)">
  Takeoff vehicle to 3m above ground. Vehicle should not be moving when this API is used. It also clears any prior collision information by calling simGetCollisionInfo()

  <ResponseField name="Arguments">
    <ParamField query="timeout_sec" type="int, optional">
      Timeout for the vehicle to reach desired altitude
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the vehicle to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## landAsync

<ResponseField name="MultirotorClient.landAsync(timeout_sec=60, vehicle_name=&#x22;&#x22;)">
  Land the vehicle

  <ResponseField name="Arguments">
    <ParamField query="timeout_sec" type="int, optional">
      Timeout for the vehicle to land
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the vehicle to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## goHomeAsync

<ResponseField name="MultirotorClient.goHomeAsync(timeout_sec=3e38, vehicle_name=&#x22;&#x22;)">
  Return vehicle to Home i.e. Launch location

  <ResponseField name="Arguments">
    <ParamField query="timeout_sec" type="int, optional">
      Timeout for the vehicle to reach desired altitude
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the vehicle to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## cancelLastTask

<ResponseField name="MultirotorClient.cancelLastTask(vehicle_name=&#x22;&#x22;)">
  Cancel previous Async task

  <ResponseField name="Arguments">
    <ParamField query="vehicle_name" type="str, optional">
      Name of the vehicle
    </ParamField>
  </ResponseField>
</ResponseField>

## moveByVelocityBodyFrameAsync

<ResponseField
  name="MultirotorClient.moveByVelocityBodyFrameAsync(
vx,
vy,
vz,
duration,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
vehicle_name=&#x22;&#x22;,
)"
>
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="vx" type="float">
      desired velocity in the X axis of the vehicle's local NED frame.
    </ParamField>

    <ParamField query="vy" type="float">
      desired velocity in the Y axis of the vehicle's local NED frame.
    </ParamField>

    <ParamField query="vz" type="float">
      desired velocity in the Z axis of the vehicle's local NED frame.
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="drivetrain" type="DrivetrainType, optional">
      drivetrain
    </ParamField>

    <ParamField query="yaw_mode" type="YawMode, optional">
      yaw\_mode
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByVelocityZBodyFrameAsync

<ResponseField
  name="MultirotorClient.moveByVelocityZBodyFrameAsync(
vx,
vy,
z,
duration,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
vehicle_name=&#x22;&#x22;,
)"
>
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="vx" type="float">
      desired velocity in the X axis of the vehicle's local NED frame
    </ParamField>

    <ParamField query="vy" type="float">
      desired velocity in the Y axis of the vehicle's local NED frame
    </ParamField>

    <ParamField query="z" type="float">
      desired Z value (in local NED frame of the vehicle)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="drivetrain" type="DrivetrainType, optional">
      drivetrain
    </ParamField>

    <ParamField query="yaw_mode" type="YawMode, optional">
      yaw\_mode
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByAngleZAsync

<ResponseField name="MultirotorClient.moveByAngleZAsync(pitch, roll, z, yaw, duration, vehicle_name=&#x22;&#x22;)">
  No description provided!
</ResponseField>

## moveByAngleThrottleAsync

<ResponseField
  name="MultirotorClient.moveByAngleThrottleAsync(
pitch, roll, throttle, yaw_rate, duration, vehicle_name=&#x22;&#x22;
)"
>
  No description provided!
</ResponseField>

## moveByVelocityAsync

<ResponseField
  name="MultirotorClient.moveByVelocityAsync(
vx,
vy,
vz,
duration,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
vehicle_name=&#x22;&#x22;,
)"
>
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="vx" type="float">
      desired velocity in world (NED) X axis
    </ParamField>

    <ParamField query="vy" type="float">
      desired velocity in world (NED) Y axis
    </ParamField>

    <ParamField query="vz" type="float">
      desired velocity in world (NED) Z axis
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="drivetrain" type="DrivetrainType, optional">
      drivetrain
    </ParamField>

    <ParamField query="yaw_mode" type="YawMode, optional">
      yaw\_mode
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByVelocityZAsync

<ResponseField
  name="MultirotorClient.moveByVelocityZAsync(
vx,
vy,
z,
duration,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
vehicle_name=&#x22;&#x22;,
)"
>
  \#todo:  add description

  <ResponseField name="Arguments">
    <ParamField query="vx" type="_type_">
      *description*
    </ParamField>

    <ParamField query="vy" type="_type_">
      *description*
    </ParamField>

    <ParamField query="z" type="_type_">
      *description*
    </ParamField>

    <ParamField query="duration" type="_type_">
      *description*
    </ParamField>

    <ParamField query="drivetrain" type="_type_, optional">
      *description*. Defaults to DrivetrainType.MaxDegreeOfFreedom.
    </ParamField>

    <ParamField query="yaw_mode" type="_type_, optional">
      *description*. Defaults to YawMode().
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      *description*. Defaults to "".
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="_type_" type="_type_">
      *description*
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveOnPathAsync

<ResponseField
  name="MultirotorClient.moveOnPathAsync(
path,
velocity,
timeout_sec=3e38,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
lookahead=-1,
adaptive_lookahead=1,
orientations=[],
vehicle_name=&#x22;&#x22;,
)"
>
  Give a list of 3D points, and the drone will move along that path at the specified velocity

  <ResponseField name="Arguments">
    <ParamField query="path" type="_type_">
      *description*
    </ParamField>

    <ParamField query="velocity" type="_type_">
      *description*
    </ParamField>

    <ParamField query="timeout_sec" type="_type_, optional">
      *description*. Defaults to 3e38.
    </ParamField>

    <ParamField query="drivetrain" type="_type_, optional">
      *description*. Defaults to DrivetrainType.MaxDegreeOfFreedom.
    </ParamField>

    <ParamField query="yaw_mode" type="_type_, optional">
      *description*. Defaults to YawMode().
    </ParamField>

    <ParamField query="lookahead" type="int, optional">
      *description*. Defaults to -1.
    </ParamField>

    <ParamField query="adaptive_lookahead" type="int, optional">
      *description*. Defaults to 1.
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      *description*. Defaults to "".
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="_type_" type="_type_">
      *description*
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveOnGPSPathAsync

<ResponseField
  name="MultirotorClient.moveOnGPSPathAsync(
geopoints,
orientations,
velocity,
timeout_sec=3e38,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
lookahead=-1,
adaptive_lookahead=1,
vehicle_name=&#x22;&#x22;,
)"
>
  Give a list of LLA geopoints, and the drone will move along that path at the specified velocity

  <ResponseField name="Arguments">
    <ParamField query="path" type="_type_">
      *description*
    </ParamField>

    <ParamField query="velocity" type="_type_">
      *description*
    </ParamField>

    <ParamField query="timeout_sec" type="_type_, optional">
      *description*. Defaults to 3e38.
    </ParamField>

    <ParamField query="drivetrain" type="_type_, optional">
      *description*. Defaults to DrivetrainType.MaxDegreeOfFreedom.
    </ParamField>

    <ParamField query="yaw_mode" type="_type_, optional">
      *description*. Defaults to YawMode().
    </ParamField>

    <ParamField query="lookahead" type="int, optional">
      *description*. Defaults to -1.
    </ParamField>

    <ParamField query="adaptive_lookahead" type="int, optional">
      *description*. Defaults to 1.
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      *description*. Defaults to "".
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="_type_" type="_type_">
      *description*
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveToPositionAsync

<ResponseField
  name="MultirotorClient.moveToPositionAsync(
x,
y,
z,
velocity,
timeout_sec=3e38,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
lookahead=-1,
adaptive_lookahead=1,
vehicle_name=&#x22;&#x22;,
)"
>
  move the drone directly towards to a desired position in the world if possible

  <ResponseField name="Arguments">
    <ParamField query="x" type="_type_">
      *description*
    </ParamField>

    <ParamField query="y" type="_type_">
      *description*
    </ParamField>

    <ParamField query="z" type="_type_">
      *description*
    </ParamField>

    <ParamField query="velocity" type="_type_">
      *description*
    </ParamField>

    <ParamField query="timeout_sec" type="_type_, optional">
      *description*. Defaults to 3e38.
    </ParamField>

    <ParamField query="drivetrain" type="_type_, optional">
      *description*. Defaults to DrivetrainType.MaxDegreeOfFreedom.
    </ParamField>

    <ParamField query="yaw_mode" type="_type_, optional">
      *description*. Defaults to YawMode().
    </ParamField>

    <ParamField query="lookahead" type="int, optional">
      *description*. Defaults to -1.
    </ParamField>

    <ParamField query="adaptive_lookahead" type="int, optional">
      *description*. Defaults to 1.
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      *description*. Defaults to "".
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="_type_" type="_type_">
      *description*
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveToGPSAsync

<ResponseField
  name="MultirotorClient.moveToGPSAsync(
lla,
velocity,
timeout_sec=3e38,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
lookahead=-1,
adaptive_lookahead=1,
vehicle_name=&#x22;&#x22;,
)"
>
  No description provided!
</ResponseField>

## moveToZAsync

<ResponseField
  name="MultirotorClient.moveToZAsync(
z,
velocity,
timeout_sec=3e38,
yaw_mode=YawMode(),
lookahead=-1,
adaptive_lookahead=1,
vehicle_name=&#x22;&#x22;,
)"
>
  No description provided!
</ResponseField>

## moveByManualAsync

<ResponseField
  name="MultirotorClient.moveByManualAsync(
vx_max,
vy_max,
z_min,
duration,
drivetrain=DrivetrainType.MaxDegreeOfFreedom,
yaw_mode=YawMode(),
vehicle_name=&#x22;&#x22;,
)"
>
  * Read current RC state and use it to control the vehicles.

    Parameters sets up the constraints on velocity and minimum altitude while flying. If RC state is detected to violate these constraints
    then that RC state would be ignored.

  <ResponseField name="Arguments">
    <ParamField query="vx_max" type="float">
      max velocity allowed in x direction
    </ParamField>

    <ParamField query="vy_max" type="float">
      max velocity allowed in y direction
    </ParamField>

    <ParamField query="vz_max" type="float">
      max velocity allowed in z direction
    </ParamField>

    <ParamField query="z_min" type="float">
      min z allowed for vehicle position
    </ParamField>

    <ParamField query="duration" type="float">
      after this duration vehicle would switch back to non-manual mode
    </ParamField>

    <ParamField query="drivetrain" type="DrivetrainType">
      ([DrivetrainType](/simulation/airgen/reference/datatypes#drivetraintype)): when ForwardOnly, vehicle rotates itself so that its front is always facing the direction of travel. If MaxDegreeOfFreedom then it doesn't do that (crab-like movement)
    </ParamField>

    <ParamField query="yaw_mode" type="YawMode">
      ([YawMode](/simulation/airgen/reference/datatypes#yawmode)): Specifies if vehicle should face at given angle (is\_rate=False) or should be rotating around its axis at given rate (is\_rate=True)
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## rotateToYawAsync

<ResponseField name="MultirotorClient.rotateToYawAsync(yaw, timeout_sec=3e38, margin=5, vehicle_name=&#x22;&#x22;)">
  No description provided!
</ResponseField>

## rotateByYawRateAsync

<ResponseField name="MultirotorClient.rotateByYawRateAsync(yaw_rate, duration, vehicle_name=&#x22;&#x22;)">
  No description provided!
</ResponseField>

## hoverAsync

<ResponseField name="MultirotorClient.hoverAsync(vehicle_name=&#x22;&#x22;)">
  No description provided!
</ResponseField>

## moveByRC

<ResponseField name="MultirotorClient.moveByRC(rcdata=RCData(), vehicle_name=&#x22;&#x22;)">
  No description provided!
</ResponseField>

## moveByMotorPWMsAsync

<ResponseField
  name="MultirotorClient.moveByMotorPWMsAsync(
front_right_pwm,
rear_left_pwm,
front_left_pwm,
rear_right_pwm,
duration,
vehicle_name=&#x22;&#x22;,
)"
>
  * Directly control the motors using PWM values

  <ResponseField name="Arguments">
    <ParamField query="front_right_pwm" type="float">
      PWM value for the front right motor (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="rear_left_pwm" type="float">
      PWM value for the rear left motor (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="front_left_pwm" type="float">
      PWM value for the front left motor (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="rear_right_pwm" type="float">
      PWM value for the rear right motor (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByRollPitchYawZAsync

<ResponseField name="MultirotorClient.moveByRollPitchYawZAsync(roll, pitch, yaw, z, duration, vehicle_name=&#x22;&#x22;)">
  * z is given in local NED frame of the vehicle.
    * Roll angle, pitch angle, and yaw angle set points are given in **radians**, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll" type="float">
      Desired roll angle, in radians.
    </ParamField>

    <ParamField query="pitch" type="float">
      Desired pitch angle, in radians.
    </ParamField>

    <ParamField query="yaw" type="float">
      Desired yaw angle, in radians.
    </ParamField>

    <ParamField query="z" type="float">
      Desired Z value (in local NED frame of the vehicle)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByRollPitchYawThrottleAsync

<ResponseField
  name="MultirotorClient.moveByRollPitchYawThrottleAsync(
roll, pitch, yaw, throttle, duration, vehicle_name=&#x22;&#x22;
)"
>
  * Desired throttle is between 0.0 to 1.0
    * Roll angle, pitch angle, and yaw angle are given in **degrees** when using PX4 and in **radians** when using SimpleFlight, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll" type="float">
      Desired roll angle.
    </ParamField>

    <ParamField query="pitch" type="float">
      Desired pitch angle.
    </ParamField>

    <ParamField query="yaw" type="float">
      Desired yaw angle.
    </ParamField>

    <ParamField query="throttle" type="float">
      Desired throttle (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByRollPitchYawrateThrottleAsync

<ResponseField
  name="MultirotorClient.moveByRollPitchYawrateThrottleAsync(
roll, pitch, yaw_rate, throttle, duration, vehicle_name=&#x22;&#x22;
)"
>
  * Desired throttle is between 0.0 to 1.0
    * Roll angle, pitch angle, and yaw rate set points are given in **radians**, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll" type="float">
      Desired roll angle, in radians.
    </ParamField>

    <ParamField query="pitch" type="float">
      Desired pitch angle, in radians.
    </ParamField>

    <ParamField query="yaw_rate" type="float">
      Desired yaw rate, in radian per second.
    </ParamField>

    <ParamField query="throttle" type="float">
      Desired throttle (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByRollPitchYawrateZAsync

<ResponseField
  name="MultirotorClient.moveByRollPitchYawrateZAsync(
roll, pitch, yaw_rate, z, duration, vehicle_name=&#x22;&#x22;
)"
>
  * z is given in local NED frame of the vehicle.
    * Roll angle, pitch angle, and yaw rate set points are given in **radians**, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll" type="float">
      Desired roll angle, in radians.
    </ParamField>

    <ParamField query="pitch" type="float">
      Desired pitch angle, in radians.
    </ParamField>

    <ParamField query="yaw_rate" type="float">
      Desired yaw rate, in radian per second.
    </ParamField>

    <ParamField query="z" type="float">
      Desired Z value (in local NED frame of the vehicle)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByAngleRatesZAsync

<ResponseField
  name="MultirotorClient.moveByAngleRatesZAsync(
roll_rate, pitch_rate, yaw_rate, z, duration, vehicle_name=&#x22;&#x22;
)"
>
  * z is given in local NED frame of the vehicle.
    * Roll rate, pitch rate, and yaw rate set points are given in **radians**, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll_rate" type="float">
      Desired roll rate, in radians / second
    </ParamField>

    <ParamField query="pitch_rate" type="float">
      Desired pitch rate, in radians / second
    </ParamField>

    <ParamField query="yaw_rate" type="float">
      Desired yaw rate, in radians / second
    </ParamField>

    <ParamField query="z" type="float">
      Desired Z value (in local NED frame of the vehicle)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## moveByAngleRatesThrottleAsync

<ResponseField
  name="MultirotorClient.moveByAngleRatesThrottleAsync(
roll_rate, pitch_rate, yaw_rate, throttle, duration, vehicle_name=&#x22;&#x22;
)"
>
  * Desired throttle is between 0.0 to 1.0
    * Roll rate, pitch rate, and yaw rate set points are given in **radians**, in the body frame.

    * The body frame follows the Front Left Up (FLU) convention, and right-handedness.

    * Frame Convention:

      * X axis is along the **Front** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **roll** angle.
      \| Hence, rolling with a positive angle is equivalent to translating in the **right** direction, w\.r.t. our FLU body frame.

      * Y axis is along the **Left** direction of the quadrotor.

      \| Clockwise rotation about this axis defines a positive **pitch** angle.
      \| Hence, pitching with a positive angle is equivalent to translating in the **front** direction, w\.r.t. our FLU body frame.

      * Z axis is along the **Up** direction.

      \| Clockwise rotation about this axis defines a positive **yaw** angle.
      \| Hence, yawing with a positive angle is equivalent to rotated towards the **left** direction wrt our FLU body frame. Or in an anticlockwise fashion in the body XY / FL plane.

  <ResponseField name="Arguments">
    <ParamField query="roll_rate" type="float">
      Desired roll rate, in radians / second
    </ParamField>

    <ParamField query="pitch_rate" type="float">
      Desired pitch rate, in radians / second
    </ParamField>

    <ParamField query="yaw_rate" type="float">
      Desired yaw rate, in radians / second
    </ParamField>

    <ParamField query="throttle" type="float">
      Desired throttle (between 0.0 to 1.0)
    </ParamField>

    <ParamField query="duration" type="float">
      Desired amount of time (seconds), to send this command for
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      future. call .join() to wait for method to finish.
    </ResponseField>
  </ResponseField>
</ResponseField>

## setNacellesRotation

<ResponseField name="MultirotorClient.setNacellesRotation(pitch, rate, sweep=False, vehicle_name=&#x22;&#x22;)">
  Set the rotation of all the Nacelles

  <ResponseField name="Arguments">
    <ParamField query="pitch" type="float">
      Pitch angle in degrees.
    </ParamField>

    <ParamField query="rate" type="float">
      Speed at which the angles update.
    </ParamField>

    <ParamField query="sweep" type="bool, optional">
      Whether we sweep to the target rotation, and stopping short of the target if blocked by something.
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Vehicle to get the state of.
    </ParamField>
  </ResponseField>
</ResponseField>

## setAngleRateControllerGains

<ResponseField
  name="MultirotorClient.setAngleRateControllerGains(
angle_rate_gains=AngleRateControllerGains(), vehicle_name=&#x22;&#x22;
)"
>
  * Modifying these gains will have an affect on *ALL* move\*() APIs.
    This is because any velocity setpoint is converted to an angle level setpoint which is tracked with an angle level controllers.
    That angle level setpoint is itself tracked with and angle rate controller.
    * This function should only be called if the default angle rate control PID gains need to be modified.

  <ResponseField name="Arguments">
    <ParamField query="angle_rate_gains" type="AngleRateControllerGains">
      ([AngleRateControllerGains](/simulation/airgen/reference/datatypes#angleratecontrollergains)): angle\_rate\_gains
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>
</ResponseField>

## setAngleLevelControllerGains

<ResponseField
  name="MultirotorClient.setAngleLevelControllerGains(
angle_level_gains=AngleLevelControllerGains(), vehicle_name=&#x22;&#x22;
)"
>
  * Sets angle level controller gains (used by any API setting angle references - for ex: moveByRollPitchYawZAsync(), moveByRollPitchYawThrottleAsync(), etc)
    * Modifying these gains will also affect the behaviour of moveByVelocityAsync() API.
      This is because the airgen flight controller will track velocity setpoints by converting them to angle set points.
    * This function should only be called if the default angle level control PID gains need to be modified.
    * Passing AngleLevelControllerGains() sets gains to default airgen values.

  <ResponseField name="Arguments">
    <ParamField query="angle_level_gains" type="AngleLevelControllerGains">
      ([AngleLevelControllerGains](/simulation/airgen/reference/datatypes#anglelevelcontrollergains)): angle\_level\_gains
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>
</ResponseField>

## setVelocityControllerGains

<ResponseField
  name="MultirotorClient.setVelocityControllerGains(
velocity_gains=VelocityControllerGains(), vehicle_name=&#x22;&#x22;
)"
>
  * Sets velocity controller gains for moveByVelocityAsync().
    * This function should only be called if the default velocity control PID gains need to be modified.
    * Passing VelocityControllerGains() sets gains to default airgen values.

  <ResponseField name="Arguments">
    <ParamField query="velocity_gains" type="VelocityControllerGains">
      ([VelocityControllerGains](/simulation/airgen/reference/datatypes#velocitycontrollergains)): velocity\_gains
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>
</ResponseField>

## setPositionControllerGains

<ResponseField
  name="MultirotorClient.setPositionControllerGains(
position_gains=PositionControllerGains(), vehicle_name=&#x22;&#x22;
)"
>
  Sets position controller gains for moveByPositionAsync.
  This function should only be called if the default position control PID gains need to be modified.

  <ResponseField name="Arguments">
    <ParamField query="position_gains" type="PositionControllerGains">
      ([PositionControllerGains](/simulation/airgen/reference/datatypes#positioncontrollergains)): position\_gains
    </ParamField>

    <ParamField query="vehicle_name" type="str, optional">
      Name of the multirotor to send this command to
    </ParamField>
  </ResponseField>
</ResponseField>

## getMultirotorState

<ResponseField name="MultirotorClient.getMultirotorState(vehicle_name=&#x22;&#x22;)">
  The position inside the returned MultirotorState is in the frame of the vehicle's starting point

  <ResponseField name="Arguments">
    <ParamField query="vehicle_name" type="str, optional">
      Vehicle to get the state of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="MultirotorState" type="MultirotorState">
      MultirotorState
    </ResponseField>
  </ResponseField>
</ResponseField>

## getRotorStates

<ResponseField name="MultirotorClient.getRotorStates(vehicle_name=&#x22;&#x22;)">
  Used to obtain the current state of all a multirotor's rotors. The state includes the speeds,
  thrusts and torques for all rotors.

  <ResponseField name="Arguments">
    <ParamField query="vehicle_name" type="str, optional">
      Vehicle to get the rotor state of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="RotorStates" type="RotorStates">
      Containing a timestamp and the speed, thrust and torque of all rotors.
    </ResponseField>
  </ResponseField>
</ResponseField>
