> ## 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.

# RemoteRobot

> Live connection to a remote robot, with its methods exposed as Python attributes

```python theme={null}
from grid_nexus_client import RemoteRobot
```

Live connection to a remote robot, with its methods exposed as Python attributes.

Created by `connect()` when no program is provided. The robot is the
root of a recursive component tree discovered at construction time:
robot methods are direct calls (`robot.set_velocity(0.5)`), and every
named subcomponent — sensors, end effector, arms, and their own
children — is a `RemoteComponent` reachable both via the
`subcomponents` mapping and as an attribute
(`robot.left_arm.wrist_cam.getImage()`).

## Fields

<ResponseField name="subcomponents">
  Dict of child name → RemoteComponent for every top-level child of the robot.
</ResponseField>

<ResponseField name="sensors">
  Derived dict of the children whose remote role is sensor.
</ResponseField>

<ResponseField name="end_effector">
  Derived RemoteComponent for the child end effector, or None.
</ResponseField>

<ResponseField name="identity">
  Hardware identity (serial number, model, controller version) of the root node alone — advertised per node, so every component in the tree carries its own and none aggregates its children's. A composite robot whose serial lives on a subcomponent reports `&#123;&#125;` here; walk `subcomponents` and apply your own policy to decide which serial identifies the robot. `&#123;&#125;` also means unknown.
</ResponseField>

## Constructor

```python Signature theme={null}
RemoteRobot(
    handle: RobotHandle,
    client: SignalingClient | None = None,
    signaling_url: str | None = None,
)
```

## Properties

<ResponseField name="end_effector" type="RemoteComponent | None">
  The child end effector, or `None` (derived view).

  Prefers the child named `"end_effector"`, else the first child
  whose remote role is end effector.
</ResponseField>

<ResponseField name="identity" type="dict[str, str]">
  Hardware identity of the physical unit behind this node.

  The manufacturer identity the robot reported when this connection
  introspected it — `serial_number`, `model`,
  `controller_version` — each key present only when the robot
  could read it, so an empty dict means *unknown*. Absence is never
  evidence of difference: two components that both report no serial
  are not thereby the same unit, nor thereby distinct ones.

  Read from the introspection payload at connect time, so it costs
  no round-trip and does not change for the life of the connection;
  call `getIdentity()` on the component for a live read.

  **Per-node, never aggregated.** It reports what this node itself
  advertised and nothing about its children: a composite robot
  whose serial lives on its arm reports `&#123;&#125;` at the root while
  `robot.subcomponents["arm"].identity` carries the serial. A
  caller that wants "the robot's serial" walks `subcomponents`
  and picks by its own policy — which node's serial counts as the
  robot's is a decision this client does not make.
</ResponseField>

<ResponseField name="monitor" type="MonitorClient" />

<ResponseField name="robot_id" type="str" />

<ResponseField name="sensors" type="dict[str, RemoteComponent]">
  Child components whose remote role is sensor (derived view).
</ResponseField>

<ResponseField name="session" type="RobotHandle">
  The underlying low-level robot handle (Zenoh session).
</ResponseField>

<ResponseField name="subcomponents" type="dict[str, RemoteComponent]">
  Named child components of this node (snapshot dict).
</ResponseField>

<ResponseField name="zenoh_session_config" type="str" />

## Methods

### `shutdown()`

```python Signature theme={null}
shutdown()
```

Close this Python handle's local resources and owned signaling session.
