> ## Documentation Index
> Fetch the complete documentation index at: https://docs.generalrobotics.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# RobotClient

## \_\_init\_\_

<ResponseField
  name="RobotClient.__init__(
ip=&#x22;&#x22;,
port=41451,
timeout_value=3600,
run_in_background: bool = False,
)"
>
  Initializes the RobotClient

  <ResponseField name="Arguments">
    <ParamField query="ip" type="str, optional">
      IP address of the server, defaults to localhost
    </ParamField>

    <ParamField query="port" type="int, optional">
      Port number of the server, defaults to 41451
    </ParamField>

    <ParamField query="timeout_value" type="int, optional">
      Timeout value for the connection, defaults to 3600
    </ParamField>

    <ParamField query="run_in_background" type="bool, optional">
      Whether to run the client in background, defaults to False. When true, this client does not print info unless necessary.
    </ParamField>
  </ResponseField>
</ResponseField>

<Note>
  Unless otherwise noted, methods accept an optional `robot_name` argument. If left blank, AirGen targets the first robot defined in the session settings (alphabetical order).
</Note>

## reset

<ResponseField name="RobotClient.reset()">
  Reset the robot to its original starting state

  Note that you must call `enableApiControl` and `armDisarm` again after the call to reset
</ResponseField>

## ping

<ResponseField name="RobotClient.ping()">
  If connection is established then this call will return true otherwise it will be blocked until timeout

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

## getClientVersion

<ResponseField name="RobotClient.getClientVersion()">
  No description provided!
</ResponseField>

## getServerVersion

<ResponseField name="RobotClient.getServerVersion()">
  No description provided!
</ResponseField>

## getMinRequiredServerVersion

<ResponseField name="RobotClient.getMinRequiredServerVersion()">
  No description provided!
</ResponseField>

## getMinRequiredClientVersion

<ResponseField name="RobotClient.getMinRequiredClientVersion()">
  No description provided!
</ResponseField>

## enableApiControl

<ResponseField name="RobotClient.enableApiControl(is_enabled, robot_name=&#x22;&#x22;)">
  Enables or disables API control for robot corresponding to robot\_name

  <ResponseField name="Arguments">
    <ParamField query="is_enabled" type="bool">
      True to enable, False to disable API control
    </ParamField>

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

## isApiControlEnabled

<ResponseField name="RobotClient.isApiControlEnabled(robot_name=&#x22;&#x22;)">
  Returns true if API control is established.

  If false (which is default) then API calls would be ignored. After a successful call to `enableApiControl`, `isApiControlEnabled` should return true.

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

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      If API control is enabled
    </ResponseField>
  </ResponseField>
</ResponseField>

## armDisarm

<ResponseField name="RobotClient.armDisarm(arm, robot_name=&#x22;&#x22;)">
  Arms or disarms robot

  <ResponseField name="Arguments">
    <ParamField query="arm" type="bool">
      True to arm, False to disarm the robot
    </ParamField>

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

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      Success
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPause

<ResponseField name="RobotClient.simPause(is_paused)">
  Pauses simulation

  <ResponseField name="Arguments">
    <ParamField query="is_paused" type="bool">
      True to pause the simulation, False to release
    </ParamField>
  </ResponseField>
</ResponseField>

## simIsPause

<ResponseField name="RobotClient.simIsPause()">
  Returns true if the simulation is paused

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      If the simulation is paused
    </ResponseField>
  </ResponseField>
</ResponseField>

## simContinueForTime

<ResponseField name="RobotClient.simContinueForTime(seconds)">
  Continue the simulation for the specified number of seconds

  <ResponseField name="Arguments">
    <ParamField query="seconds" type="float">
      Time to run the simulation for
    </ParamField>
  </ResponseField>
</ResponseField>

## simContinueForFrames

<ResponseField name="RobotClient.simContinueForFrames(frames)">
  Continue (or resume if paused) the simulation for the specified number of frames, after which the simulation will be paused.

  <ResponseField name="Arguments">
    <ParamField query="frames" type="int">
      Frames to run the simulation for
    </ParamField>
  </ResponseField>
</ResponseField>

## getHomeGeoPoint

<ResponseField name="RobotClient.getHomeGeoPoint(robot_name=&#x22;&#x22;)">
  Get the Home location of the robot

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str, optional">
      Name of robot to get home location of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="GeoPoint" type="GeoPoint">
      Home location of the robot
    </ResponseField>
  </ResponseField>
</ResponseField>

## confirmConnection

<ResponseField name="RobotClient.confirmConnection()">
  Checks state of connection every 1 sec and reports it in Console so user can see the progress for connection.
</ResponseField>

## simSwapTextures

<ResponseField name="RobotClient.simSwapTextures(tags, tex_id=0, component_id=0, material_id=0)">
  Runtime Swap Texture API

  <ResponseField name="Arguments">
    <ParamField query="tags" type="str">
      string of "," or ", " delimited tags to identify on which actors to perform the swap
    </ParamField>

    <ParamField query="tex_id" type="int, optional">
      indexes the array of textures assigned to each actor undergoing a swap
    </ParamField>

    <ParamField query="component_id" type="int, optional">
      component\_id
    </ParamField>

    <ParamField query="material_id" type="int, optional">
      material\_id
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[str]" type="list[str]">
      List of objects which matched the provided tags and had the texture swap perfomed
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectMaterial

<ResponseField name="RobotClient.simSetObjectMaterial(object_name, material_name, component_id=0)">
  Runtime Swap Texture API

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      name of object to set material for
    </ParamField>

    <ParamField query="material_name" type="str">
      name of material to set for object
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if material was set
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectMaterialFromTexture

<ResponseField
  name="RobotClient.simSetObjectMaterialFromTexture(
object_name, texture_path, component_id=0
)"
>
  Runtime Swap Texture API

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      name of object to set material for
    </ParamField>

    <ParamField query="texture_path" type="str">
      path to texture to set for object
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if material was set
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectMaterialFromTextureURL

<ResponseField
  name="RobotClient.simSetObjectMaterialFromTextureURL(
object_name, url, component_id=0
)"
>
  Runtime Swap Texture API

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      name of object to set material for
    </ParamField>

    <ParamField query="url" type="str">
      url for texture to set for object
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if material was set
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetTimeOfDay

<ResponseField
  name="RobotClient.simSetTimeOfDay(
is_enabled,
start_datetime=&#x22;&#x22;,
is_start_datetime_dst=False,
celestial_clock_speed=1,
update_interval_secs=60,
move_sun=True,
)"
>
  Control the position of Sun in the environment

  Sun's position is computed using the coordinates specified in `OriginGeopoint` in settings for the date-time specified in the argument,
  else if the string is empty, current date & time is used

  <ResponseField name="Arguments">
    <ParamField query="is_enabled" type="bool">
      True to enable time-of-day effect, False to reset the position to original
    </ParamField>

    <ParamField query="start_datetime" type="str, optional">
      Date & Time in %Y-%m-%d %H:%M:%S format, e.g. `2018-02-12 15:20:00`
    </ParamField>

    <ParamField query="is_start_datetime_dst" type="bool, optional">
      True to adjust for Daylight Savings Time
    </ParamField>

    <ParamField query="celestial_clock_speed" type="float, optional">
      Run celestial clock faster or slower than simulation clock
    </ParamField>

    <ParamField query="update_interval_secs" type="float, optional">
      Interval to update the Sun's position
    </ParamField>

    <ParamField query="move_sun" type="bool, optional">
      Whether or not to move the Sun
    </ParamField>
  </ResponseField>
</ResponseField>

## simEnableWeather

<ResponseField name="RobotClient.simEnableWeather(enable: bool)">
  Enable/Disable Weather effects.

  <ResponseField name="Arguments">
    <ParamField query="enable" type="bool">
      True to enable, False to disable
    </ParamField>
  </ResponseField>
</ResponseField>

## simResetToAuthoredWeather

<ResponseField name="RobotClient.simResetToAuthoredWeather()">
  Reset all weather parameters to their original values as defined during scene authoring.
</ResponseField>

## simSetWeatherParameter

<ResponseField name="RobotClient.simSetWeatherParameter(param:WeatherParameter, val:float)">
  Set intensity for various weather effects

  <ResponseField name="Arguments">
    <ParamField query="param" type="int">
      The weather effect to control.
    </ParamField>

    <ParamField query="val" type="float">
      Intensity of the effect, Range 0-1
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetImage

<ResponseField name="RobotClient.simGetImage(camera_name, image_type, robot_name=&#x22;&#x22;, external=False, capture_3d=False, cubemap=False)">
  Get a single image

  Returns bytes of png format image which can be dumped into abinary file to create .png image
  `string_to_uint8_array()` can be used to convert into Numpy unit8 array

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="image_type" type="ImageType">
      [ImageType](/simulation/airgen/reference/datatypes#imagetype): Type of image required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot with the camera
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>

    <ParamField query="capture_3d" type="bool, optional">
      Whether to capture 3D images (default: False).
    </ParamField>

    <ParamField query="cubemap" type="bool, optional">
      Whether to capture cubemap images otherwise equirectangular (default: False).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Binary" type="Binary">
      string literal of compressed png image
    </ResponseField>
  </ResponseField>
</ResponseField>

## getImages

<ResponseField
  name="RobotClient.getImages(
camera_name, image_types: List[ImageType], robot_name=&#x22;&#x22;, capture_3d=False, cubemap=False
)"
>
  Get multiple images

  <ResponseField name="Arguments">
    <ParamField query="image_types" type="list[ImageType]">
      list\[[ImageType](/simulation/airgen/reference/datatypes#imagetype)]: Images required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot associated with the camera
    </ParamField>

    <ParamField query="capture_3d" type="bool, optional">
      Whether to capture 3D images (default: False).
    </ParamField>

    <ParamField query="cubemap" type="bool, optional">
      Whether to capture cubemap images otherwise equirectangular (default: False).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[ImageResponse]" type="list[ImageResponse]">
      list\[ImageResponse]
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetImages

<ResponseField
  name="RobotClient.simGetImages(
requests: ImageRequest, robot_name=&#x22;&#x22;, external=False, capture_3d=False, cubemap=False
)"
>
  Get multiple images

  <ResponseField name="Arguments">
    <ParamField query="requests" type="list[ImageRequest]">
      list\[[ImageRequest](/simulation/airgen/reference/datatypes#imagerequest)]: Images required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot associated with the camera
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>

    <ParamField query="capture_3d" type="bool, optional">
      Whether to capture 3D images (default: False).
    </ParamField>

    <ParamField query="cubemap" type="bool, optional">
      Whether to capture cubemap images otherwise equirectangular (default: False).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[ImageResponse]" type="list[ImageResponse]">
      list\[[ImageResponse](/simulation/airgen/reference/datatypes#imageresponse)]
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetImagesAlongTrajectory

<ResponseField
  name="RobotClient.simGetImagesAlongTrajectory(
poses: List[Pose], requests, robot_name=&#x22;&#x22;, external=False, capture_3d=False, cubemap=False
)"
>
  Get images along a trajectory (specified by position and pose) when

  <ResponseField name="Arguments">
    <ParamField query="poses" type="list[Pose]">
      A list of poses of the robot, at which images are to be requested
    </ParamField>

    <ParamField query="requests" type="list[ImageRequest]">
      list\[[ImageRequest](/simulation/airgen/reference/datatypes#imagerequest)]: Images required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot associated with the camera
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera, defaults to False
    </ParamField>

    <ParamField query="capture_3d" type="bool, optional">
      Whether to capture 3d images (default: False).
    </ParamField>

    <ParamField query="cubemap" type="bool, optional">
      Whether to capture cubemap images otherwise equirectangular (default: False).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[ImageResponse]" type="list[ImageResponse]">
      list\[ImageResponse]
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetPresetLensSettings

<ResponseField
  name="RobotClient.simGetPresetLensSettings(
camera_name: str, robot_name: str = &#x22;&#x22;, external: bool = False
)"
>
  Get the preset lens settings for the camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      camera name
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      vechile name. Defaults to "".
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera. Defaults to False.
    </ParamField>
  </ResponseField>

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

## simGetLensSettings

<ResponseField
  name="RobotClient.simGetLensSettings(
camera_name: str, robot_name: str = &#x22;&#x22;, external=False
)"
>
  Get the lens settings for the camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      camera name
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      vechile name. Defaults to "".
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera. Defaults to False.
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetPresetLensSettings

<ResponseField
  name="RobotClient.simSetPresetLensSettings(
preset_lens_settings,
camera_name: str,
robot_name: str = &#x22;&#x22;,
external=False,
)"
>
  No description provided!
</ResponseField>

## simGetPresetFilmbackSettings

<ResponseField
  name="RobotClient.simGetPresetFilmbackSettings(
camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simSetPresetFilmbackSettings

<ResponseField
  name="RobotClient.simSetPresetFilmbackSettings(
preset_filmback_settings, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simGetFilmbackSettings

<ResponseField name="RobotClient.simGetFilmbackSettings(camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simSetFilmbackSettings

<ResponseField
  name="RobotClient.simSetFilmbackSettings(
sensor_width, sensor_height, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simGetFocalLength

<ResponseField name="RobotClient.simGetFocalLength(camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simSetFocalLength

<ResponseField
  name="RobotClient.simSetFocalLength(
focal_length, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simEnableManualFocus

<ResponseField
  name="RobotClient.simEnableManualFocus(
enable, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simGetFocusDistance

<ResponseField name="RobotClient.simGetFocusDistance(camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simSetFocusDistance

<ResponseField
  name="RobotClient.simSetFocusDistance(
focus_distance, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simGetFocusAperture

<ResponseField name="RobotClient.simGetFocusAperture(camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simSetFocusAperture

<ResponseField
  name="RobotClient.simSetFocusAperture(
focus_aperture, camera_name, robot_name=&#x22;&#x22;, external=False
)"
>
  No description provided!
</ResponseField>

## simEnableFocusPlane

<ResponseField name="RobotClient.simEnableFocusPlane(enable, camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simGetCurrentFieldOfView

<ResponseField name="RobotClient.simGetCurrentFieldOfView(camera_name, robot_name=&#x22;&#x22;, external=False)">
  No description provided!
</ResponseField>

## simTestLineOfSightToPoint

<ResponseField name="RobotClient.simTestLineOfSightToPoint(point, robot_name=&#x22;&#x22;)">
  Returns whether the target point is visible from the perspective of the inputted robot

  <ResponseField name="Arguments">
    <ParamField query="point" type="GeoPoint">
      target point
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      Success
    </ResponseField>
  </ResponseField>
</ResponseField>

## simTestLineOfSightBetweenPoints

<ResponseField name="RobotClient.simTestLineOfSightBetweenPoints(point1, point2)">
  Returns whether the target point is visible from the perspective of the source point

  <ResponseField name="Arguments">
    <ParamField query="point1" type="GeoPoint">
      source point
    </ParamField>

    <ParamField query="point2" type="GeoPoint">
      target point
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      Success
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetWorldExtents

<ResponseField name="RobotClient.simGetWorldExtents()">
  Returns a list of GeoPoints representing the minimum and maximum extents of the world

  <ResponseField name="Returns">
    <ResponseField name="list[GeoPoint]" type="list[GeoPoint]">
      list\[GeoPoint]
    </ResponseField>
  </ResponseField>
</ResponseField>

## simRunConsoleCommand

<ResponseField name="RobotClient.simRunConsoleCommand(command)">
  Allows the client to execute a command in Unreal's native console, via an API.
  Affords access to the countless built-in commands such as "stat unit", "stat fps", "open \[map]", adjust any config settings, etc. etc.
  Allows the user to create bespoke APIs very easily, by adding a custom event to the level blueprint, and then calling the console command "ce MyEventName \[args]". No recompilation of airgen needed!

  <ResponseField name="Arguments">
    <ParamField query="command" type="[string]">
      Desired Unreal Engine Console command to run
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      Success
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetMeshPositionVertexBuffers

<ResponseField name="RobotClient.simGetMeshPositionVertexBuffers()">
  Returns the static meshes that make up the scene

  <ResponseField name="Returns">
    <ResponseField name="list[MeshPositionVertexBuffersResponse]" type="list[MeshPositionVertexBuffersResponse]">
      list\[MeshPositionVertexBuffersResponse]
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetCollisionInfo

<ResponseField name="RobotClient.simGetCollisionInfo(robot_name=&#x22;&#x22;)">
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str, optional">
      Name of the Robot to get the info of. This call will also reset the collision info (state of the robot) to False.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="CollisionInfo" type="CollisionInfo">
      Data structure containing collision details for the specified robot.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetRobotPose

<ResponseField name="RobotClient.simSetRobotPose(pose:Pose, ignore_collision=True, sweep=False, robot_name=&#x22;&#x22;, bounds_trim=Vector3r(0.05, 0.05, 0.05), world_space=False, on_ground=False, ground_trace_range_up=GROUND_TRACE_RANGE_DEFAULT, ground_trace_range_down=GROUND_TRACE_RANGE_DEFAULT, timeout_sec=10)">
  Set the pose of the robot

  Note:
  When world\_space is False (default), the pose is specified relative to the robot's local coordinate frame,
  established at its initial position.

  <ResponseField name="Arguments">
    <ParamField query="pose" type="Pose">
      Desired Pose of the robot.
    </ParamField>

    <ParamField query="ignore_collision" type="bool, optional">
      Whether to ignore collision at the target pose.
    </ParamField>

    <ParamField query="sweep" type="bool, optional">
      Whether to sweep for collisions from the current pose to the target pose.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot.
    </ParamField>

    <ParamField query="bounds_trim" type="Vector3r, optional">
      Amount to shrink the robot's collision bounds when ignore\_collision is False. Useful for fine-tuning collision detection and avoiding false positives at the edges.
    </ParamField>

    <ParamField query="world_space" type="bool, optional">
      Whether the input pose is in world coordinate frame.
    </ParamField>

    <ParamField query="on_ground" type="bool, optional">
      Whether to set the robot's altitude to ground level while setting its position.
    </ParamField>

    <ParamField query="ground_trace_range_up" type="float, optional">
      From what distance above the Robot's current altitude do we start looking for the ground (default is 13 KM).
    </ParamField>

    <ParamField query="ground_trace_range_down" type="float, optional">
      How much distance below the Robot's current altitude do we stop looking for the ground (default is 13 KM).
    </ParamField>

    <ParamField query="timeout_sec" type="int, optional">
      Timeout to find ground location (if on\_ground is True).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      A future object that resolves to a bool, indicating whether the operation succeeded (True) or failed (False).
    </ResponseField>

    <ResponseField name="Call" type="Call">
      .join() to wait until the operation completes.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetRobotGeoPose

<ResponseField name="RobotClient.simSetRobotGeoPose(geopose:GeoPose, ignore_collision:bool, sweep=False, robot_name=&#x22;&#x22;, bounds_trim=Vector3r(0.05, 0.05, 0.05), on_ground=False, ground_trace_range_up=GROUND_TRACE_RANGE_DEFAULT, ground_trace_range_down=GROUND_TRACE_RANGE_DEFAULT, timeout_sec=10)">
  Set the Geodetic pose of the robot

  <ResponseField name="Arguments">
    <ParamField query="geopose" type="GeoPose">
      Desired Geodetic Pose of the robot
    </ParamField>

    <ParamField query="ignore_collision" type="bool">
      Whether to ignore collision at the target pose
    </ParamField>

    <ParamField query="sweep" type="bool, optional">
      Whether to sweep for collisions from the current pose to the target pose
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot
    </ParamField>

    <ParamField query="bounds_trim" type="Vector3r, optional">
      Amount to shrink the robot's collision bounds when ignore\_collision is False. Useful for fine-tuning collision detection and avoiding false positives at the edges.
    </ParamField>

    <ParamField query="on_ground" type="bool, optional">
      Whether to set the robot's altitude to ground level while setting its position
    </ParamField>

    <ParamField query="ground_trace_range_up" type="float, optional">
      From what distance above the Robot's current altitude do we start looking for the ground (default is 13 KM)
    </ParamField>

    <ParamField query="ground_trace_range_down" type="float, optional">
      How much distance below the Robot's current altitude do we stop looking for the ground (default is 13 KM)
    </ParamField>

    <ParamField query="timeout_sec" type="int, optional">
      Timeout to find ground location (if on\_ground is True)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="msgpackrpc.future.Future" type="msgpackrpc.future.Future">
      A future object that resolves to a bool, indicating whether the operation succeeded (True) or failed (False).
    </ResponseField>

    <ResponseField name="Call" type="Call">
      .join() to wait until the operation completes.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetGeoReference

<ResponseField name="RobotClient.simSetGeoReference(geopoint:GeoPoint)">
  Updates the geo-reference of the simulation world (relevant for Georeferenced scenes only).
  Also updates the home geo-point of all robots in the simulation to match the new geo-reference.

  <ResponseField name="Arguments">
    <ParamField query="geopoint" type="GeoPoint">
      Desired Georeference
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetGeoReference

<ResponseField name="RobotClient.simGetGeoReference()">
  Gets the current geo-reference of the simulation world (relevant for Georeferenced scenes only)

  <ResponseField name="Returns">
    <ResponseField name="geopoint" type="geopoint">
      (GeoPoint): Georeference point
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetRobotPose

<ResponseField name="RobotClient.simGetRobotPose(world_space=False, robot_name=&#x22;&#x22;)">
  Returns the Pose of the robot

  Note:
  When world\_space is False (default), the returned pose is relative to the robot's local coordinate frame,
  established at its initial position.

  <ResponseField name="Arguments">
    <ParamField query="world_space" type="bool, optional">
      Whether to return the pose in world coordinate frame
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot to get the Pose of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Pose" type="Pose">
      pose (position and orientation) of the robot
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetTraceLine

<ResponseField name="RobotClient.simSetTraceLine(color_rgba, thickness=1.0, robot_name=&#x22;&#x22;)">
  Modify the color and thickness of the line when Tracing is enabled

  Tracing can be enabled by pressing T in the Editor or setting `EnableTrace` to `True` in the Settings for the robot

  <ResponseField name="Arguments">
    <ParamField query="color_rgba" type="list">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="thickness" type="float, optional">
      Thickness of the line
    </ParamField>

    <ParamField query="robot_name" type="string, optional">
      Name of the robot to set Trace line values for
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetObjectPose

<ResponseField name="RobotClient.simGetObjectPose(object_name)">
  The position inside the returned Pose is in the world frame

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Object to get the Pose of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Pose" type="Pose">
      pose (position and orientation) of the object
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectPose

<ResponseField name="RobotClient.simSetObjectPose(object_name, pose, teleport=True)">
  Set the pose of the object(actor) in the environment

  The specified actor must have Mobility set to movable, otherwise there will be undefined behaviour.
  See [https://www.unrealengine.com/en-US/blog/moving-physical-objects](https://www.unrealengine.com/en-US/blog/moving-physical-objects) for details on how to set Mobility and the effect of Teleport parameter

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Name of the object(actor) to move
    </ParamField>

    <ParamField query="pose" type="Pose">
      Desired Pose of the object
    </ParamField>

    <ParamField query="teleport" type="bool, optional">
      Whether to move the object immediately without affecting their velocity
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      If the move was successful
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectGeoPose

<ResponseField name="RobotClient.simSetObjectGeoPose(object_name, geopose, teleport=True)">
  Set the pose of the object(actor) in the environment

  The specified actor must have Mobility set to movable, otherwise there will be undefined behaviour.
  See [https://www.unrealengine.com/en-US/blog/moving-physical-objects](https://www.unrealengine.com/en-US/blog/moving-physical-objects) for details on how to set Mobility and the effect of Teleport parameter

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Name of the object(actor) to move
    </ParamField>

    <ParamField query="pose" type="Pose">
      Desired Pose of the object
    </ParamField>

    <ParamField query="teleport" type="bool, optional">
      Whether to move the object immediately without affecting their velocity
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      If the move was successful
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetObjectScale

<ResponseField name="RobotClient.simGetObjectScale(object_name)">
  Gets scale of an object in the world

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Object to get the scale of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="airgen.Vector3r" type="airgen.Vector3r">
      Scale
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetObjectScale

<ResponseField name="RobotClient.simSetObjectScale(object_name, scale_vector)">
  Sets scale of an object in the world

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Object to set the scale of
    </ParamField>

    <ParamField query="scale_vector" type="airgen.Vector3r">
      Desired scale of object
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if scale change was successful
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetObjectDimensions

<ResponseField name="RobotClient.simGetObjectDimensions(object_name)">
  Gets bounds of an object in the world

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Object to get the bounds of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="airgen.Vector3r" type="airgen.Vector3r">
      Extents in X, Y, Z
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetObjectCenter

<ResponseField name="RobotClient.simGetObjectCenter(object_name)">
  Gets the center of an object in the world

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Object to get the center of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="airgen.Vector3r" type="airgen.Vector3r">
      Center position
    </ResponseField>
  </ResponseField>
</ResponseField>

## simListSceneObjects

<ResponseField name="RobotClient.simListSceneObjects(name_regex=&#x22;.*&#x22;)">
  Lists the objects present in the simulation environment

  Note:
  Default behaviour is to list all objects, regex can be used to return smaller list of matching objects.
  Will return an empty list, if name\_regex is empty.

  <ResponseField name="Arguments">
    <ParamField query="name_regex" type="str, optional">
      String to match object names against, e.g. "Cylinder.\*"
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[str]" type="list[str]">
      List containing all the object names matching the regex
    </ResponseField>
  </ResponseField>
</ResponseField>

## simListSceneObjectsByTag

<ResponseField name="RobotClient.simListSceneObjectsByTag(tag_regex=&#x22;.*&#x22;)">
  Lists the objects present in the environment matching the input tag regex

  Note:
  Default behaviour is to list all objects with atleast one tag, regex can be used to return a specific list of objects with matching tags.
  Will return an empty list, if tag\_regex is empty.

  <ResponseField name="Arguments">
    <ParamField query="tag_regex" type="str">
      Tag to match object tags against, e.g. "ShinyRedBall" or ".\*Ball" or ".*Red.*"
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[str]" type="list[str]">
      List containing names of all objects with matching tags
    </ResponseField>
  </ResponseField>
</ResponseField>

## simLoadLevel

<ResponseField name="RobotClient.simLoadLevel(level_name)">
  Loads a level specified by its name

  <ResponseField name="Arguments">
    <ParamField query="level_name" type="str">
      Name of the level to load
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if the level was successfully loaded
    </ResponseField>
  </ResponseField>
</ResponseField>

## simListAssets

<ResponseField name="RobotClient.simListAssets(filter=&#x22;.*&#x22;)">
  Retrieves a list of asset names from the Asset Registry, optionally filtered by a regex pattern.

  Note:
  Default behaviour is to list all assets, regex can be used to return smaller list of matching assets.
  Will return an empty list, if filter is empty.

  <ResponseField name="Arguments">
    <ParamField query="filter" type="str, optional">
      Regex string to match asset names against, e.g. "Cylinder.\*"
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[str]" type="list[str]">
      Names of all the assets
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSpawnObject

<ResponseField
  name="RobotClient.simSpawnObject(
object_name,
asset_name,
object_tags=[],
pose:Pose = Pose.ZERO,
scale:Vector3r = Vector3r.ONE,
physics_enabled:bool = False,
)"
>
  Spawns an object in the world using an existing asset

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Desired name of new object
    </ParamField>

    <ParamField query="asset_name" type="str">
      Name of asset(mesh) in the project database
    </ParamField>

    <ParamField query="object_tags" type="list[String], optional">
      List of tags to assign the object
    </ParamField>

    <ParamField query="pose" type="airgen.Pose, optional">
      Desired pose of object in world space
    </ParamField>

    <ParamField query="scale" type="airgen.Vector3r, optional">
      Desired scale of object
    </ParamField>

    <ParamField query="physics_enabled" type="bool, optional">
      Whether to enable physics for the object (default is False)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      Name of spawned object if Success, empty string on Failure
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSpawnObjectFromPath

<ResponseField
  name="RobotClient.simSpawnObjectFromPath(object_name,
path, 
object_tags=[],
pose:Pose = Pose.ZERO,
scale:Vector3r = Vector3r.ONE,
is_unlit:bool = False,
physics_enabled:bool = False,
complex_collision:bool = False,
nav_enabled:bool = False
)"
>
  Spawns an object in the sim using a glTF/glb file path

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Desired name of new object
    </ParamField>

    <ParamField query="path" type="str">
      Path to the desired glTF or glb asset
    </ParamField>

    <ParamField query="object_tags" type="list[String], optional">
      List of tags to assign the object
    </ParamField>

    <ParamField query="pose" type="airgen.Pose, optional">
      Desired pose of object in world space
    </ParamField>

    <ParamField query="scale" type="airgen.Vector3r, optional">
      Desired scale of object
    </ParamField>

    <ParamField query="is_unlit" type="bool, optional">
      Whether the object should be unlit (default is False)
    </ParamField>

    <ParamField query="physics_enabled" type="bool, optional">
      Whether to enable physics for the object (default is False)
    </ParamField>

    <ParamField query="complex_collision" type="bool, optional">
      Whether to use the mesh polygons for collision detection (default is False)
    </ParamField>

    <ParamField query="nav_enabled" type="bool, optional">
      Whether the object should have navigation enabled (default is False)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      Name of spawned object if Success, empty string on Failure
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSpawnObjectFromURL

<ResponseField
  name="RobotClient.simSpawnObjectFromURL(object_name,
url,
object_tags=[],
pose:Pose = Pose.ZERO,
scale:Vector3r = Vector3r.ONE,
is_unlit:bool = False,
physics_enabled:bool = False,
complex_collision:bool = False,
nav_enabled:bool = False
)"
>
  Spawns an object in the sim using a glb asset url

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Desired name of new object
    </ParamField>

    <ParamField query="url" type="str">
      URL address of the desired glb asset
    </ParamField>

    <ParamField query="object_tags" type="list[String], optional">
      List of tags to assign the object
    </ParamField>

    <ParamField query="pose" type="airgen.Pose, optional">
      Desired pose of object in world space
    </ParamField>

    <ParamField query="scale" type="airgen.Vector3r, optional">
      Desired scale of object
    </ParamField>

    <ParamField query="is_unlit" type="bool, optional">
      Whether the object should be unlit (default is False)
    </ParamField>

    <ParamField query="physics_enabled" type="bool, optional">
      Whether to enable physics for the object (default is False)
    </ParamField>

    <ParamField query="complex_collision" type="bool, optional">
      Whether to use the mesh polygons for collision detection (default is False)
    </ParamField>

    <ParamField query="nav_enabled" type="bool, optional">
      Whether the object should have navigation enabled (default is False)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      Name of spawned object if Success, empty string on Failure
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSpawnLight

<ResponseField
  name="RobotClient.simSpawnLight(
name,
properties:LightProperties,
mobility=RenderingMobility.Dynamic_Stationary,
tags=[],
pose:Pose = Pose.ZERO,
)"
>
  Spawns a light in the world with the specified properties

  <ResponseField name="Arguments">
    <ParamField query="name" type="str">
      Desired name of the new light object
    </ParamField>

    <ParamField query="properties" type="LightProperties">
      Light properties to set (see LightProperties)
    </ParamField>

    <ParamField query="mobility" type="int, optional">
      Rendering mobility type (default is Dynamic\_Stationary, see RenderingMobility)
    </ParamField>

    <ParamField query="tags" type="list[str], optional">
      List of tags to assign the object
    </ParamField>

    <ParamField query="pose" type="airgen.Pose, optional">
      Desired pose of light in world space
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      Name of spawned light if Success, empty string on Failure
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetLightProperties

<ResponseField name="RobotClient.simSetLightProperties(light_name, properties:LightProperties)">
  Change properties of named light

  <ResponseField name="Arguments">
    <ParamField query="light_name" type="str">
      Name of light to change
    </ParamField>

    <ParamField query="properties" type="LightProperties">
      New LightProperties to apply to the light
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if successful, otherwise False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetLightEnabled

<ResponseField name="RobotClient.simSetLightEnabled(light_name, value:bool)">
  Enable or disable the specified light

  <ResponseField name="Arguments">
    <ParamField query="light_name" type="str">
      Name of light to enable/disable
    </ParamField>

    <ParamField query="value" type="bool">
      True to enable, False to disable
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if successful, otherwise False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetLightIntensity

<ResponseField name="RobotClient.simSetLightIntensity(light_name, value, unit:LightIntensityUnit = LightIntensityUnit.NoChange, indirect_scaling=-1.0)">
  Change ONLY the intensity value of the named light

  <ResponseField name="Arguments">
    <ParamField query="light_name" type="str">
      Name of light to change
    </ParamField>

    <ParamField query="value" type="float">
      New intensity value
    </ParamField>

    <ParamField query="unit" type="LightIntensityUnit, optional">
      Intensity unit. Defaults to LightIntensityUnit.NoChange.
    </ParamField>

    <ParamField query="indirect_scaling" type="float, optional">
      Scale factor for indirect lighting contribution. Defaults to -1.0.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if successful, otherwise False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simDestroyObject

<ResponseField name="RobotClient.simDestroyObject(object_name)">
  Removes selected object from the world

  <ResponseField name="Arguments">
    <ParamField query="object_name" type="str">
      Name of object to be removed
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if object is queued up for removal
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetSegmentationObjectID

<ResponseField name="RobotClient.simSetSegmentationObjectID(mesh_name, object_id, is_name_regex=False)">
  Set segmentation ID for specific objects

  <ResponseField name="Arguments">
    <ParamField query="mesh_name" type="str">
      Name of the mesh to set the ID of (supports regex)
    </ParamField>

    <ParamField query="object_id" type="int">
      Object ID to be set, range 0-255.
    </ParamField>

    <ParamField query="is_name_regex" type="bool, optional">
      Whether the mesh name is a regex. If True, all meshes matching the regex will be set to the same ID
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      If the mesh was found
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetSegmentationInstanceID

<ResponseField name="RobotClient.simSetSegmentationInstanceID(mesh_name, instance_id, is_name_regex=False)">
  Set segmentation ID for specific instances

  <ResponseField name="Arguments">
    <ParamField query="mesh_name" type="str">
      Name of the mesh to set the ID of (supports regex)
    </ParamField>

    <ParamField query="instance_id" type="int">
      start of instance ID to be set, range 0-255. Gets incremented each time for each instance (mesh)
    </ParamField>

    <ParamField query="is_name_regex" type="bool, optional">
      Whether the mesh name is a regex
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="int" type="int">
      number of instances (meshes) matched with mesh\_id updated
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetSegmentationObjectID

<ResponseField name="RobotClient.simGetSegmentationObjectID(mesh_name)">
  Returns Object ID for the given mesh name (case-sensitive)

  <ResponseField name="Arguments">
    <ParamField query="mesh_name" type="str">
      Name of the mesh to get the ID of
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="int" type="int">
      Object ID of the mesh
    </ResponseField>
  </ResponseField>
</ResponseField>

## simAddDetectionFilterMeshName

<ResponseField
  name="RobotClient.simAddDetectionFilterMeshName(
camera_name, image_type, mesh_name, robot_name=&#x22;&#x22;, external=False
)"
>
  Add mesh name to detect in wild card format

  For example: simAddDetectionFilterMeshName("Car\_*") will detect all instance named "Car\_*"

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="image_type" type="ImageType">
      [ImageType](/simulation/airgen/reference/datatypes#imagetype): Type of image required
    </ParamField>

    <ParamField query="mesh_name" type="str">
      mesh name in wild card format
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetDetectionFilterRadius

<ResponseField
  name="RobotClient.simSetDetectionFilterRadius(
camera_name, image_type, radius_cm, robot_name=&#x22;&#x22;, external=False
)"
>
  Set detection radius for all cameras

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="image_type" type="ImageType">
      [ImageType](/simulation/airgen/reference/datatypes#imagetype): Type of image required
    </ParamField>

    <ParamField query="radius_cm" type="int">
      Radius in \[cm]
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simClearDetectionMeshNames

<ResponseField
  name="RobotClient.simClearDetectionMeshNames(
camera_name, image_type, robot_name=&#x22;&#x22;, external=False
)"
>
  Clear all mesh names from detection filter

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="image_type" type="ImageType">
      [ImageType](/simulation/airgen/reference/datatypes#imagetype): Type of image required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetDetections

<ResponseField
  name="RobotClient.simGetDetections(
camera_name, image_type, robot_name=&#x22;&#x22;, external=False
)"
>
  Get current detections

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="image_type" type="ImageType">
      [ImageType](/simulation/airgen/reference/datatypes#imagetype): Type of image required
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[DetectionInfo]" type="list[DetectionInfo]">
      List of detections
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPrintLogMessage

<ResponseField name="RobotClient.simPrintLogMessage(message, message_param=&#x22;&#x22;, severity=0)">
  Prints the specified message in the simulator's window.

  If message\_param is supplied, then it's printed next to the message and in that case if this API is called with same message value
  but different message\_param again then previous line is overwritten with new line (instead of API creating new line on display).

  For example, `simPrintLogMessage("Iteration: ", to_string(i))` keeps updating same line on display when API is called with different values of i.
  The valid values of severity parameter is 0 to 3 inclusive that corresponds to different colors.

  <ResponseField name="Arguments">
    <ParamField query="message" type="str">
      Message to be printed
    </ParamField>

    <ParamField query="message_param" type="str, optional">
      Parameter to be printed next to the message
    </ParamField>

    <ParamField query="severity" type="int, optional">
      Range 0-3, inclusive, corresponding to the severity of the message
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetCameraInfo

<ResponseField name="RobotClient.simGetCameraInfo(camera_name, robot_name=&#x22;&#x22;, external=False)">
  Get details about the camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="CameraInfo" type="CameraInfo">
      camera info
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetDistortionParams

<ResponseField name="RobotClient.simGetDistortionParams(camera_name, robot_name=&#x22;&#x22;, external=False)">
  Get camera distortion parameters

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="List" type="List">
      (float): List of distortion parameter values corresponding to K1, K2, K3, P1, P2 respectively.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetDistortionParams

<ResponseField
  name="RobotClient.simSetDistortionParams(
camera_name, distortion_params, robot_name=&#x22;&#x22;, external=False
)"
>
  Set camera distortion parameters

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="distortion_params" type="dict">
      Dictionary of distortion param names and corresponding values
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetDistortionParam

<ResponseField
  name="RobotClient.simSetDistortionParam(
camera_name, param_name, value, robot_name=&#x22;&#x22;, external=False
)"
>
  Set single camera distortion parameter

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera, for backwards compatibility, ID numbers such as 0,1,etc. can also be used
    </ParamField>

    <ParamField query="param_name" type="str">
      Name of distortion parameter
    </ParamField>

    <ParamField query="value" type="float">
      Value of distortion parameter
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Robot which the camera is associated with
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetCameraPose

<ResponseField name="RobotClient.simSetCameraPose(camera_name, pose, robot_name=&#x22;&#x22;, external=False)">
  * Control the pose of a selected camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera to be controlled
    </ParamField>

    <ParamField query="pose" type="Pose">
      Pose representing the desired position and orientation of the camera
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot which the camera corresponds to
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetCameraFov

<ResponseField
  name="RobotClient.simSetCameraFov(
camera_name, fov_degrees, robot_name=&#x22;&#x22;, external=False
)"
>
  * Control the field of view of a selected camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera to be controlled
    </ParamField>

    <ParamField query="fov_degrees" type="float">
      Value of field of view in degrees
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot which the camera corresponds to
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simCameraLookAt

<ResponseField name="RobotClient.simCameraLookAt(camera_name, pose, robot_name=&#x22;&#x22;)">
  * Control the pose of a selected camera

  <ResponseField name="Arguments">
    <ParamField query="camera_name" type="str">
      Name of the camera to be controlled
    </ParamField>

    <ParamField query="pose" type="Pose">
      Pose representing the desired position the camera has to observe
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot which the camera corresponds to
    </ParamField>

    <ParamField query="external" type="bool, optional">
      Whether the camera is an External Camera
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetGroundTruthKinematics

<ResponseField name="RobotClient.simGetGroundTruthKinematics(robot_name=&#x22;&#x22;)">
  Get Ground truth kinematics of the robot

  The position inside the returned KinematicsState is in the frame of the robot's starting point

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

  <ResponseField name="Returns">
    <ResponseField name="KinematicsState" type="KinematicsState">
      Ground truth of the robot
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetKinematics

<ResponseField name="RobotClient.simSetKinematics(state, ignore_collision, robot_name=&#x22;&#x22;)">
  Set the kinematics state of the robot

  If you don't want to change position (or orientation) then just set components of position (or orientation) to floating point nan values

  <ResponseField name="Arguments">
    <ParamField query="state" type="KinematicsState">
      Desired Kinematics State
    </ParamField>

    <ParamField query="ignore_collision" type="bool">
      Whether to ignore any collision or not
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetGroundTruthEnvironment

<ResponseField name="RobotClient.simGetGroundTruthEnvironment(robot_name=&#x22;&#x22;)">
  Get ground truth environment state

  The position inside the returned EnvironmentState is in the frame of the robot's starting point

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

  <ResponseField name="Returns">
    <ResponseField name="EnvironmentState" type="EnvironmentState">
      Ground truth environment state
    </ResponseField>
  </ResponseField>
</ResponseField>

## getImuData

<ResponseField name="RobotClient.getImuData(imu_name=&#x22;&#x22;, robot_name=&#x22;&#x22;)">
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="imu_name" type="str, optional">
      Name of IMU to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="ImuData" type="ImuData">
      IMU data
    </ResponseField>
  </ResponseField>
</ResponseField>

## getBarometerData

<ResponseField name="RobotClient.getBarometerData(barometer_name=&#x22;&#x22;, robot_name=&#x22;&#x22;)">
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="barometer_name" type="str, optional">
      Name of Barometer to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="BarometerData" type="BarometerData">
      Barometer data
    </ResponseField>
  </ResponseField>
</ResponseField>

## getMagnetometerData

<ResponseField
  name="RobotClient.getMagnetometerData(
magnetometer_name=&#x22;&#x22;, robot_name=&#x22;&#x22;
)"
>
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="magnetometer_name" type="str, optional">
      Name of Magnetometer to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="MagnetometerData" type="MagnetometerData">
      Magnetometer data
    </ResponseField>
  </ResponseField>
</ResponseField>

## getGpsData

<ResponseField name="RobotClient.getGpsData(gps_name=&#x22;&#x22;, robot_name=&#x22;&#x22;)">
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="gps_name" type="str, optional">
      Name of GPS to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="GpsData" type="GpsData">
      GPS data
    </ResponseField>
  </ResponseField>
</ResponseField>

## getDistanceSensorData

<ResponseField
  name="RobotClient.getDistanceSensorData(
distance_sensor_name=&#x22;&#x22;, robot_name=&#x22;&#x22;
)"
>
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="distance_sensor_name" type="str, optional">
      Name of Distance Sensor to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="DistanceSensorData" type="DistanceSensorData">
      Distance sensor data
    </ResponseField>
  </ResponseField>
</ResponseField>

## getLidarData

<ResponseField name="RobotClient.getLidarData(lidar_name=&#x22;&#x22;, robot_name=&#x22;&#x22;)">
  No description provided!

  <ResponseField name="Arguments">
    <ParamField query="lidar_name" type="str, optional">
      Name of Lidar to get data from, specified in settings.json
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of robot to which the sensor corresponds to
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="LidarData" type="LidarData">
      LiDAR data
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetLidarSegmentation

<ResponseField name="RobotClient.simGetLidarSegmentation(lidar_name=&#x22;&#x22;, robot_name=&#x22;&#x22;)">
  NOTE: Deprecated API, use `getLidarData()` API instead
  Returns Segmentation ID of each point's collided object in the last Lidar update

  <ResponseField name="Arguments">
    <ParamField query="lidar_name" type="str, optional">
      Name of Lidar sensor
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot wth the sensor
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[int]" type="list[int]">
      Segmentation IDs of the objects
    </ResponseField>
  </ResponseField>
</ResponseField>

## simFlushPersistentMarkers

<ResponseField name="RobotClient.simFlushPersistentMarkers()">
  Clear any persistent markers - those plotted with setting `is_persistent=True` in the APIs below
</ResponseField>

## simPlotPoints

<ResponseField
  name="RobotClient.simPlotPoints(
points,
color_rgba=[1.0, 0.0, 0.0, 1.0],
size=10.0,
duration=-1.0,
is_persistent=False,
)"
>
  Plot a list of 3D points in World NED frame

  <ResponseField name="Arguments">
    <ParamField query="points" type="list[Vector3r]">
      List of Vector3r objects
    </ParamField>

    <ParamField query="color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="size" type="float, optional">
      Size of plotted point
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>

    <ParamField query="is_persistent" type="bool, optional">
      If set to True, the desired object will be plotted for infinite time.
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotLineStrip

<ResponseField
  name="RobotClient.simPlotLineStrip(
points,
color_rgba=[1.0, 0.0, 0.0, 1.0],
thickness=5.0,
duration=-1.0,
is_persistent=False,
)"
>
  Plots a line strip in World NED frame, defined from points\[0] to points\[1], points\[1] to points\[2], ... , points\[n-2] to points\[n-1]

  <ResponseField name="Arguments">
    <ParamField query="points" type="list[Vector3r]">
      List of 3D locations of line start and end points, specified as Vector3r objects
    </ParamField>

    <ParamField query="color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="thickness" type="float, optional">
      Thickness of line
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>

    <ParamField query="is_persistent" type="bool, optional">
      If set to True, the desired object will be plotted for infinite time.
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotLineList

<ResponseField
  name="RobotClient.simPlotLineList(
points,
color_rgba=[1.0, 0.0, 0.0, 1.0],
thickness=5.0,
duration=-1.0,
is_persistent=False,
)"
>
  Plots a line strip in World NED frame, defined from points\[0] to points\[1], points\[2] to points\[3], ... , points\[n-2] to points\[n-1]

  <ResponseField name="Arguments">
    <ParamField query="points" type="list[Vector3r]">
      List of 3D locations of line start and end points, specified as Vector3r objects. Must be even
    </ParamField>

    <ParamField query="color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="thickness" type="float, optional">
      Thickness of line
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>

    <ParamField query="is_persistent" type="bool, optional">
      If set to True, the desired object will be plotted for infinite time.
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotArrows

<ResponseField
  name="RobotClient.simPlotArrows(
points_start,
points_end,
color_rgba=[1.0, 0.0, 0.0, 1.0],
thickness=5.0,
arrow_size=2.0,
duration=-1.0,
is_persistent=False,
)"
>
  Plots a list of arrows in World NED frame, defined from points\_start\[0] to points\_end\[0], points\_start\[1] to points\_end\[1], ... , points\_start\[n-1] to points\_end\[n-1]

  <ResponseField name="Arguments">
    <ParamField query="points_start" type="list[Vector3r]">
      List of 3D start positions of arrow start positions, specified as Vector3r objects
    </ParamField>

    <ParamField query="points_end" type="list[Vector3r]">
      List of 3D end positions of arrow start positions, specified as Vector3r objects
    </ParamField>

    <ParamField query="color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="thickness" type="float, optional">
      Thickness of line
    </ParamField>

    <ParamField query="arrow_size" type="float, optional">
      Size of arrow head
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>

    <ParamField query="is_persistent" type="bool, optional">
      If set to True, the desired object will be plotted for infinite time.
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotStrings

<ResponseField
  name="RobotClient.simPlotStrings(
strings,
positions,
scale=5,
color_rgba=[1.0, 0.0, 0.0, 1.0],
duration=-1.0,
)"
>
  Plots a list of strings at desired positions in World NED frame.

  <ResponseField name="Arguments">
    <ParamField query="strings" type="list[String], optional">
      List of strings to plot
    </ParamField>

    <ParamField query="positions" type="list[Vector3r]">
      List of positions where the strings should be plotted. Should be in one-to-one correspondence with the strings' list
    </ParamField>

    <ParamField query="scale" type="float, optional">
      Font scale of transform name
    </ParamField>

    <ParamField query="color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotTransforms

<ResponseField
  name="RobotClient.simPlotTransforms(
poses, scale=5.0, thickness=5.0, duration=-1.0, is_persistent=False
)"
>
  Plots a list of transforms in World NED frame.

  <ResponseField name="Arguments">
    <ParamField query="poses" type="list[Pose]">
      List of Pose objects representing the transforms to plot
    </ParamField>

    <ParamField query="scale" type="float, optional">
      Length of transforms' axes
    </ParamField>

    <ParamField query="thickness" type="float, optional">
      Thickness of transforms' axes
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>

    <ParamField query="is_persistent" type="bool, optional">
      If set to True, the desired object will be plotted for infinite time.
    </ParamField>
  </ResponseField>
</ResponseField>

## simPlotTransformsWithNames

<ResponseField
  name="RobotClient.simPlotTransformsWithNames(
poses,
names,
tf_scale=5.0,
tf_thickness=5.0,
text_scale=10.0,
text_color_rgba=[1.0, 0.0, 0.0, 1.0],
duration=-1.0,
)"
>
  Plots a list of transforms with their names in World NED frame.

  <ResponseField name="Arguments">
    <ParamField query="poses" type="list[Pose]">
      List of Pose objects representing the transforms to plot
    </ParamField>

    <ParamField query="names" type="list[string]">
      List of strings with one-to-one correspondence to list of poses
    </ParamField>

    <ParamField query="tf_scale" type="float, optional">
      Length of transforms' axes
    </ParamField>

    <ParamField query="tf_thickness" type="float, optional">
      Thickness of transforms' axes
    </ParamField>

    <ParamField query="text_scale" type="float, optional">
      Font scale of transform name
    </ParamField>

    <ParamField query="text_color_rgba" type="list, optional">
      desired RGBA values from 0.0 to 1.0 for the transform name
    </ParamField>

    <ParamField query="duration" type="float, optional">
      Duration (seconds) to plot for
    </ParamField>
  </ResponseField>
</ResponseField>

## startRecording

<ResponseField name="RobotClient.startRecording()">
  Start Recording

  Recording will be done according to the settings
</ResponseField>

## stopRecording

<ResponseField name="RobotClient.stopRecording()">
  Stop Recording
</ResponseField>

## isRecording

<ResponseField name="RobotClient.isRecording()">
  Whether Recording is running or not

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if Recording, else False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetWind

<ResponseField name="RobotClient.simSetWind(wind)">
  Set simulated wind, in World frame, NED direction, m/s

  <ResponseField name="Arguments">
    <ParamField query="wind" type="Vector3r">
      Wind, in World frame, NED direction, in m/s
    </ParamField>
  </ResponseField>
</ResponseField>

## simCreateVoxelGrid

<ResponseField name="RobotClient.simCreateVoxelGrid(position, x, y, z, res, of)">
  Construct and save a binvox-formatted voxel grid of environment

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Position around which voxel grid is centered in m
    </ParamField>

    <ParamField query="res" type="float">
      Resolution of voxel grid in m
    </ParamField>

    <ParamField query="of" type="str">
      Name of output file to save voxel grid as
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if output written to file successfully, else False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simBuildSDF

<ResponseField name="RobotClient.simBuildSDF(position, x, y, z, res)">
  Construct a signed distance field of the environment centered at position,
  and with dimensions (x, y, z). Internally, the SDF is stored as a special
  case of a voxel grid with floating point distances instead of boolean occupancy.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position around which field is centered in m
    </ParamField>

    <ParamField query="res" type="float">
      Resolution of distance field in m
    </ParamField>
  </ResponseField>
</ResponseField>

## simCheckOccupancy

<ResponseField name="RobotClient.simCheckOccupancy(position)">
  Check and return occupancy of a point. Requires signed distance field to be
  built beforehand.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position at which occupancy is to be checked (m)
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetSignedDistance

<ResponseField name="RobotClient.simGetSignedDistance(position)">
  Get signed distance of a point (distance to the closest 'object surface')
  in the environment. Requires signed distance field to be built beforehand.

  Distance is positive if the point is in free space, and negative if the point is
  inside an object.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position at which distance is to be computed (m)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="dist" type="dist">
      (float): Signed distance at the position
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetSignedDistances

<ResponseField name="RobotClient.simGetSignedDistances(positions)">
  Get signed distance of a list of points (distance to the closest 'object surface')
  in the environment. Requires signed distance field to be built beforehand.

  Distance is positive if the point is in free space, and negative if the point is
  inside an object.

  <ResponseField name="Arguments">
    <ParamField query="positions" type="list">
      List of global positions at which distance is to be computed (m)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="dists" type="dists">
      (list\[float]): Signed distances at the positions
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetSDFGradient

<ResponseField name="RobotClient.simGetSDFGradient(position)">
  Get the SDF gradient at a point (vector pointing away from the closest
  'object surface') in the environment. Requires signed distance field to be built
  beforehand.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position at which gradient is to be computed (m)
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="gradient" type="gradient">
      (Vector3r): SDF gradient at the position
    </ResponseField>
  </ResponseField>
</ResponseField>

## simCheckInVolume

<ResponseField name="RobotClient.simCheckInVolume(position, volume_object_name)">
  Check if a point is inside a volume.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position at which volume is to be checked (m)
    </ParamField>

    <ParamField query="volume_object_name" type="str">
      Name of the volume object
    </ParamField>
  </ResponseField>
</ResponseField>

## simProjectToFreeSpace

<ResponseField name="RobotClient.simProjectToFreeSpace(position, mindist)">
  Project a given point into free space using the SDF, with a specified minimum clearance
  from existing objects. Returns the same point if the point is already free, else follows
  the SDF gradient to find a free point that satisfies the minimum distance constraint.

  <ResponseField name="Arguments">
    <ParamField query="position" type="Vector3r">
      Global position to project (m)
    </ParamField>

    <ParamField query="mindist" type="float">
      Minimum distance from objects to satisfy when finding the free point
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="free_pt" type="free_pt">
      (Vector3r): Projected position in free space
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSaveSDF

<ResponseField name="RobotClient.simSaveSDF(filepath)">
  Save the constructed signed distance field to a file.

  <ResponseField name="Arguments">
    <ParamField query="filepath" type="str">
      Filename to save the SDF to
    </ParamField>
  </ResponseField>
</ResponseField>

## simLoadSDF

<ResponseField name="RobotClient.simLoadSDF(filepath)">
  Load a saved signed distance field.

  <ResponseField name="Arguments">
    <ParamField query="filepath" type="str">
      Filename to load the SDF from
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetRandomFreePoint

<ResponseField name="RobotClient.simGetRandomFreePoint(search_radius, robot_name=&#x22;&#x22;)">
  Return a random free (unoccupied) point (local space) within a radius around the robot.

  <ResponseField name="Arguments">
    <ParamField query="search_radius" type="float">
      Radius around the robot to search for a free point in m
    </ParamField>

    <ParamField query="robot_name" type="str">
      Name of the robot
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Vector3r" type="Vector3r">
      /None: Free/unoccupied point (local NED) coordinates if successful, else None
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPlanPathToRandomFreePoint

<ResponseField name="RobotClient.simPlanPathToRandomFreePoint(search_radius:float, smooth_path:bool = False, draw_path:bool = False, robot_name:str =&#x22;&#x22;)">
  Plan a collision-free path to a random point within a radius around the robot and return the intermediate waypoints (local space).

  <ResponseField name="Arguments">
    <ParamField query="search_radius" type="float">
      Radius around the robot to search for a free point (meters)
    </ParamField>

    <ParamField query="smooth_path" type="bool, optional">
      Returns a smooth spline if True, else returns a list of coarse waypoints
    </ParamField>

    <ParamField query="draw_path" type="bool, optional">
      Draws the path in the simulation environment if True
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[Vector3r]" type="list[Vector3r]">
      List of waypoints (local NED) if successful, else empty list
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPlanPathToRandomizeGoal

<ResponseField
  name="RobotClient.simPlanPathToRandomizeGoal(
start: Vector3r,
goal: Vector3r,
search_radius: float,
num_trials: int,
smooth_path: bool = False,
draw_path: bool = False,
start_is_local: bool = True,
goal_is_local: bool = True,
robot_name: str = &#x22;&#x22;
)"
>
  Plans a collision-free path from the specified start position to a randomly selected free point within a given radius around the goal position.
  The function attempts up to `num_trials` random samples to find a valid, collision-free goal, and returns the intermediate waypoints (local space) of the planned path.

  <ResponseField name="Arguments">
    <ParamField query="start" type="Vector3r">
      Start position.
    </ParamField>

    <ParamField query="goal" type="Vector3r">
      Center position around which to randomize the goal.
    </ParamField>

    <ParamField query="search_radius" type="float">
      Radius (in meters) around the goal to search for a free point.
    </ParamField>

    <ParamField query="num_trials" type="int">
      Number of random samples to attempt for finding a free goal point.
    </ParamField>

    <ParamField query="smooth_path" type="bool, optional">
      If True, returns a smooth spline path; otherwise, returns a list of coarse waypoints. Defaults to False.
    </ParamField>

    <ParamField query="draw_path" type="bool, optional">
      If True, visualizes the path in the environment. Defaults to False.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot. Defaults to "".
    </ParamField>

    <ParamField query="start_is_local" type="bool, optional">
      If True, the start position is in the robot's local frame; otherwise, in the world/global frame. Defaults to True.
    </ParamField>

    <ParamField query="goal_is_local" type="bool, optional">
      If True, the goal position is in the robot's local frame; otherwise, in the world/global frame. Defaults to True.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[Vector3r]" type="list[Vector3r]">
      List of waypoints (local NED) representing the planned path if successful; otherwise, an empty list.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPlanPath

<ResponseField
  name="RobotClient.simPlanPath(
start: Vector3r,
goal: Vector3r,
smooth_path: bool = False,
draw_path: bool = False,
start_is_local: bool = True,
goal_is_local: bool = True,
robot_name: str = &#x22;&#x22;
)"
>
  Plans a collision-free path between the specified start and goal points, returning the intermediate waypoints (local space).

  <ResponseField name="Arguments">
    <ParamField query="start" type="Vector3r">
      Start position
    </ParamField>

    <ParamField query="goal" type="Vector3r">
      Goal position
    </ParamField>

    <ParamField query="smooth_path" type="bool, optional">
      If True, returns a smooth spline; otherwise, returns a list of coarse waypoints. Defaults to False.
    </ParamField>

    <ParamField query="draw_path" type="bool, optional">
      If True, draws the path. Defaults to False.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot. Defaults to "".
    </ParamField>

    <ParamField query="start_is_local" type="bool, optional">
      If True, start position is in the robot's local frame; if False, in world/global frame. Defaults to True.
    </ParamField>

    <ParamField query="goal_is_local" type="bool, optional">
      If True, goal position is in the robot's local frame; if False, in world/global frame. Defaults to True.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[Vector3r]" type="list[Vector3r]">
      List of waypoints (local NED) if successful; otherwise, an empty list.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simPlanPathGeo

<ResponseField
  name="RobotClient.simPlanPathGeo(
start: GeoPoint,
goal: GeoPoint,
smooth_path: bool = False,
draw_path: bool = False,
robot_name: str = &#x22;&#x22;
)"
>
  Plans a collision-free path between the specified start and goal geodetic locations (LLA), returning the intermediate waypoints (local NED).

  <ResponseField name="Arguments">
    <ParamField query="start" type="GeoPoint">
      Start Geodetic Location (LLA)
    </ParamField>

    <ParamField query="goal" type="GeoPoint">
      Goal Geodetic Location (LLA)
    </ParamField>

    <ParamField query="smooth_path" type="bool, optional">
      If True, returns a smooth spline; otherwise, returns a list of coarse waypoints. Defaults to False.
    </ParamField>

    <ParamField query="draw_path" type="bool, optional">
      If True, draws the path. Defaults to False.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot. Defaults to "".
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[Vector3r]" type="list[Vector3r]">
      List of waypoints (local NED) if successful; otherwise, an empty list.
    </ResponseField>
  </ResponseField>
</ResponseField>

## getNavMeshInfo

<ResponseField name="RobotClient.getNavMeshInfo(robot_name=&#x22;&#x22;)">
  Get NavMesh information, as an array of XYZ center, min and max values in global NED coordinates

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str">
      Name of the robot
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list[Vector3r]" type="list[Vector3r]">
      List of values if successful, else empty list
    </ResponseField>
  </ResponseField>
</ResponseField>

## isPointInCollision

<ResponseField name="RobotClient.isPointInCollision(point)">
  Get Collision information about a point. Returns True if point is in collision, else False

  <ResponseField name="Arguments">
    <ParamField query="point" type="Vector3r">
      Point to be checked in World coordinates
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if point is in collision, else False
    </ResponseField>
  </ResponseField>
</ResponseField>

## isAnyPointInCollisionBatch

<ResponseField name="RobotClient.isAnyPointInCollisionBatch(points)">
  Get Collision information about an array of points. Returns True if any of the points is in collision, else False

  <ResponseField name="Arguments">
    <ParamField query="points" type="list[Vector3r]">
      List of points to be checked in World coordinates
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if any of the points is in collision, else False
    </ResponseField>
  </ResponseField>
</ResponseField>

## simAddRobot

<ResponseField name="RobotClient.simAddRobot(robot_name, robot_type, robot_model, pose, radius_override=-1, height_override=-1)">
  Add a robot to the simulation with the specified name, type, model, and initial pose.

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str">
      Unique name for the robot (e.g., "Drone5").
    </ParamField>

    <ParamField query="robot_type" type="str">
      Type of robot to add (e.g., "simpleflight", "cvmover").
    </ParamField>

    <ParamField query="robot_model" type="str">
      Model name of the robot (e.g., "astro", "ghostv60").
    </ParamField>

    <ParamField query="pose" type="Pose">
      The initial pose (position and orientation) of the robot in world coordinates.
    </ParamField>

    <ParamField query="radius_override" type="float, optional">
      If > 0, overrides the robot's default collision radius (meters). Defaults to -1 (no override).
    </ParamField>

    <ParamField query="height_override" type="float, optional">
      If > 0, overrides the robot's default collision height (meters). Defaults to -1 (no override).
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="bool" type="bool">
      True if the robot was added successfully, False otherwise.
    </ResponseField>
  </ResponseField>
</ResponseField>

## listRobots

<ResponseField name="RobotClient.listRobots()">
  Lists the names of all the robots in the simulation world

  <ResponseField name="Returns">
    <ResponseField name="list[str]" type="list[str]">
      List containing names of all the robots
    </ResponseField>
  </ResponseField>
</ResponseField>

## getSettingsString

<ResponseField name="RobotClient.getSettingsString()">
  Fetch the settings text being used by airgen

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      Settings text in JSON format
    </ResponseField>
  </ResponseField>
</ResponseField>

## simCreateWaypoint

<ResponseField name="RobotClient.simCreateWaypoint(context = &#x22;&#x22;, robot_name = &#x22;&#x22;)">
  Creates a waypoint using the robot transform.
  The created waypoint will be associated with the specified waypoints-context.

  If context isn't specified, it'll default to the last-used context.
  If there's no context present and context isn't specified, a context named 'defaultWaypoints' will be auto created.

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

    <ParamField query="context" type="str, optional">
      Name of the associated waypoints-context
    </ParamField>
  </ResponseField>
</ResponseField>

## simCreateWaypointFromPose

<ResponseField name="RobotClient.simCreateWaypointFromPose(pose, context = &#x22;&#x22;)">
  Creates a waypoint using the robot transform.
  The created waypoint will be associated with the specified waypoints-context.

  If context isn't specified, it'll default to the last-used context.
  If there's no context present and context isn't specified, a context named 'defaultWaypoints' will be auto created.

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

    <ParamField query="context" type="str, optional">
      Name of the associated waypoints-context
    </ParamField>
  </ResponseField>
</ResponseField>

## simDeleteWaypoints

<ResponseField name="RobotClient.simDeleteWaypoints(context = &#x22;&#x22;, only_recent = True, keep_context_alive = True)">
  Deletes waypoints for a specified context

  If 'only\_recent' is True, it'll delete the youngest waypoint of the specified waypoints-context.
  If 'only\_recent' is False, it'll delete all waypoints for the specified context.

  If context isn't specified, it'll default to the last-used context.
  If context isn't specified and there's no last-used context, it'll throw an error.

  <ResponseField name="Arguments">
    <ParamField query="context" type="str, optional">
      Name of the associated waypoints-context
    </ParamField>

    <ParamField query="only_recent" type="bool, optional">
      Whether to delete only the youngest waypoint or all of them, for a context
    </ParamField>

    <ParamField query="keep_context_alive" type="bool, optional">
      If this is False, the context and all its associated waypoints will be deleted
    </ParamField>
  </ResponseField>
</ResponseField>

## simDeleteAllWaypoints

<ResponseField name="RobotClient.simDeleteAllWaypoints()">
  Deletes all waypoints and all waypoint-contexts
</ResponseField>

## simGetWaypointDataAsCsv

<ResponseField name="RobotClient.simGetWaypointDataAsCsv(context = &#x22;&#x22;)">
  Get the waypoints data of a waypoints-context as a CSV formatted string.
  If context isn't specified, it'll default to the last-used context.
  If context isn't specified and there's no last-used context, it'll throw an error.

  <ResponseField name="Arguments">
    <ParamField query="context" type="str, optional">
      Name of the waypoints-context
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="waypoint_data" type="waypoint_data">
      (str): Waypoint data as a CSV formatted string
    </ResponseField>
  </ResponseField>
</ResponseField>

## simGetWaypointDataAsJson

<ResponseField name="RobotClient.simGetWaypointDataAsJson(context = &#x22;&#x22;)">
  Get the waypoints data of a waypoints-context as a JSON string.
  If context isn't specified, it'll default to the last-used context.
  If context isn't specified and there's no last-used context, it'll throw an error.

  <ResponseField name="Arguments">
    <ParamField query="context" type="str, optional">
      Name of the waypoints-context
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="waypoint_data" type="waypoint_data">
      (str): Waypoint data as a JSON formatted string
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetWaypointColor

<ResponseField name="RobotClient.simSetWaypointColor(color_rgb, index, context = &#x22;&#x22;)">
  Changes the color of a given waypoint.
  If context isn't specified, it'll default to the last-used context.
  If context isn't specified and there's no last-used context, it'll throw an error.

  <ResponseField name="Arguments">
    <ParamField query="color_rgb" type="list">
      desired RGB values from 0.0 to 1.0. e.g. \[1, 1, 1]
    </ParamField>

    <ParamField query="index" type="int">
      The index of the Waypoint. The index of the first waypoint is 0.
    </ParamField>

    <ParamField query="context" type="str, optional">
      Name of the waypoints-context.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="success" type="success">
      (bool): True if the color change was a success, false otherwise.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simResetWaypointColor

<ResponseField name="RobotClient.simResetWaypointColor(index, context = &#x22;&#x22;)">
  Resets the color of a given waypoint to the original.
  If context isn't specified, it'll default to the last-used context.
  If context isn't specified and there's no last-used context, it'll throw an error.

  <ResponseField name="Arguments">
    <ParamField query="index" type="int">
      The index of the Waypoint. The index of the first waypoint is 0.
    </ParamField>

    <ParamField query="context" type="str, optional">
      Name of the waypoints-context.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="success" type="success">
      (bool): True if the color reset was a success, false otherwise.
    </ResponseField>
  </ResponseField>
</ResponseField>

## cancelLastTask

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

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

## simSetGroundTraceParams

<ResponseField name="RobotClient.simSetGroundTraceParams(enabled, range_up=GROUND_TRACE_RANGE_DEFAULT, range_down=GROUND_TRACE_RANGE_DEFAULT)">
  Sets the various Ground Trace parameters.
  This affects the "reset" behavior, and the "simAddRobot" behavior.

  <ResponseField name="Arguments">
    <ParamField query="enabled" type="bool">
      Enable or Disable Ground Trace.
    </ParamField>

    <ParamField query="range_up" type="float, optional">
      From what distance above the robot's current altitude do we start looking for the ground (default is 13 KM)
    </ParamField>

    <ParamField query="range_down" type="float, optional">
      How much distance below the robot's current altitude do we stop looking for the ground (default is 13 KM)
    </ParamField>
  </ResponseField>
</ResponseField>

## simGetAllPhysicsControlNames

<ResponseField name="RobotClient.simGetAllPhysicsControlNames(robot_name=&#x22;&#x22;)">
  Retrieves the names of all the available physics controls for a robot.

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str">
      Name of the robot.
    </ParamField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="list" type="list">
      List of strings representing the names of Physics Controls.
    </ResponseField>
  </ResponseField>
</ResponseField>

## simSetPhysicsControlTargetPose

<ResponseField name="RobotClient.simSetPhysicsControlTargetPose(name, pose, velocity_delta_time=0.0, robot_name=&#x22;&#x22;)">
  Sets the target pose for a specific physics control of a robot.

  <ResponseField name="Arguments">
    <ParamField query="name" type="str">
      Name of the Physics Control.
    </ParamField>

    <ParamField query="pose" type="Pose">
      Target Pose.
    </ParamField>

    <ParamField query="velocity_delta_time" type="float, optional">
      If this is non-zero, the target velocity will be calculated using the current target position. But if this is zero, the target velocity will be set to zero.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot.
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetPhysicsControlTargetPoses

<ResponseField name="RobotClient.simSetPhysicsControlTargetPoses(names, poses, velocity_delta_time=0.0, robot_name=&#x22;&#x22;)">
  Sets the target poses for multiple physics controls of a robot.
  The length of 'poses' and 'names' must be the same.

  <ResponseField name="Arguments">
    <ParamField query="names" type="list">
      List of Physics Control names.
    </ParamField>

    <ParamField query="poses" type="list">
      List of Target Poses.
    </ParamField>

    <ParamField query="velocity_delta_time" type="float, optional">
      If this is non-zero, the target velocity will be calculated using the current target position. But if this is zero, the target velocity will be set to zero.
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot.
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetPhysicsControlMultiplier

<ResponseField
  name="RobotClient.simSetPhysicsControlMultiplier(
name,
linear_strength=Vector3r.one(),
linear_damping_ratio=Vector3r.one(),
linear_extra_damping=Vector3r.one(),
max_force=Vector3r.one(),
angular_strength=1.0,
angular_damping_ratio=1.0,
angular_extra_damping=1.0,
max_torque=1.0,
robot_name=&#x22;&#x22;
)"
>
  Multiplies a physics control's properties with the input scaling factors

  <ResponseField name="Arguments">
    <ParamField query="name" type="str">
      Name of the physics control
    </ParamField>

    <ParamField query="linear_strength" type="Vector3r, optional">
      Scaling factor for linear strength (default: Vector3r(1, 1, 1)).
    </ParamField>

    <ParamField query="linear_damping_ratio" type="Vector3r, optional">
      Scaling factor for linear damping ratio (default: Vector3r(1, 1, 1)).
    </ParamField>

    <ParamField query="linear_extra_damping" type="Vector3r, optional">
      Scaling factor for linear extra damping (default: Vector3r(1, 1, 1)).
    </ParamField>

    <ParamField query="max_force" type="Vector3r, optional">
      Scaling factor for maximum force (default: Vector3r(1, 1, 1)).
    </ParamField>

    <ParamField query="angular_strength" type="float, optional">
      Scaling factor for angular strength (default: 1.0).
    </ParamField>

    <ParamField query="angular_damping_ratio" type="float, optional">
      Scaling factor for angular damping ratio (default: 1.0).
    </ParamField>

    <ParamField query="angular_extra_damping" type="float, optional">
      Scaling factor for angular extra damping (default: 1.0).
    </ParamField>

    <ParamField query="max_torque" type="float, optional">
      Scaling factor for maximum torque (default: 1.0).
    </ParamField>

    <ParamField query="robot_name" type="str, optional">
      Name of the robot
    </ParamField>
  </ResponseField>
</ResponseField>

## simSetHero

<ResponseField name="RobotClient.simSetHero(robot_name=&#x22;&#x22;)">
  Sets the specified robot as the 'hero' in the simulation.

  <ResponseField name="Arguments">
    <ParamField query="robot_name" type="str, optional">
      Name of the robot to set as hero. If not specified, the default robot is used.
    </ParamField>
  </ResponseField>
</ResponseField>

## simApplyGravityScaling

<ResponseField name="RobotClient.simApplyGravityScaling(scale)">
  Applies a scaling factor to the gravity in the simulation.

  <ResponseField name="Arguments">
    <ParamField query="scale" type="float">
      The scaling factor to apply to gravity.
    </ParamField>
  </ResponseField>
</ResponseField>
