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

# Arm

## Arm

Inherits from: [`Robot`](/robot-api/reference/base/robot/robot/Robot)

Abstract base class defining the interface for robotic arms.

This class extends the base Robot class with additional methods specific to
robotic arm manipulation and control including joint control and gripper operations.

### Inherited methods

* From [`Robot`](/robot-api/reference/base/robot/robot/Robot): `addSensor`, `getImage`, `getState`, `getPosition`, `getOrientation`, `moveByVelocity`, `stop`, `cleanup`

### **init**

```python theme={null}
Arm.__init__(server_port: int = 4774, enable_websocket: bool = True, client_timeout: float = 30.0) -> None
```

Initialize robotic arm.

<ResponseField name="Arguments">
  <ParamField query="server_port (int)" type="int">
    Port for WebSocket server (default 4774)
  </ParamField>

  <ParamField query="enable_websocket (bool)" type="bool">
    Whether to start the WebSocket server (default True)
  </ParamField>

  <ParamField query="client_timeout (float)" type="float">
    Client timeout in seconds (default 30.0)
  </ParamField>
</ResponseField>

<ResponseField name="Returns">
  <ResponseField name="returns" type="None" />
</ResponseField>

### getJointAngles

```python theme={null}
Arm.getJointAngles() -> list[float]
```

Get current joint angles in radians.

<ResponseField name="Returns">
  <ResponseField name="list[float]" type="list[float]">
    Current joint angles in radians, ordered by joint index
  </ResponseField>
</ResponseField>

<ResponseField name="Raises">
  <ParamField query="NotImplementedError" type="">
    Must be implemented by subclasses
  </ParamField>
</ResponseField>

### setJointAngles

```python theme={null}
Arm.setJointAngles(angles: list, blocking: bool = True, moving_time: Optional[float] = None, accel_time: Optional[float] = None) -> None
```

Set joint angles in radians.

Commands the arm to move joints to the specified target angles.
Can be blocking or non-blocking depending on the blocking parameter.

<ResponseField name="Arguments">
  <ParamField query="angles (list)" type="list" required>
    List of target joint angles in radians
  </ParamField>

  <ParamField query="blocking (bool)" type="bool">
    Wait for movement to complete (default True)
  </ParamField>

  <ParamField query="moving_time (Optional[float])" type="Optional[float]">
    Time to complete the movement in seconds
  </ParamField>

  <ParamField query="accel_time (Optional[float])" type="Optional[float]">
    Time to accelerate/decelerate in seconds
  </ParamField>
</ResponseField>

<ResponseField name="Returns">
  <ResponseField name="returns" type="None" />
</ResponseField>

<ResponseField name="Raises">
  <ParamField query="NotImplementedError" type="">
    Must be implemented by subclasses
  </ParamField>
</ResponseField>

### grasp

```python theme={null}
Arm.grasp() -> None
```

Close the gripper to grasp an object.

Closes the gripper to securely hold an object. The gripper will
apply appropriate force based on the object detected.

<ResponseField name="Returns">
  <ResponseField name="returns" type="None" />
</ResponseField>

<ResponseField name="Raises">
  <ParamField query="NotImplementedError" type="">
    Must be implemented by subclasses
  </ParamField>
</ResponseField>

### release

```python theme={null}
Arm.release() -> None
```

Open the gripper to release an object.

Opens the gripper to release any held object. The gripper will
return to its fully open position.

<ResponseField name="Returns">
  <ResponseField name="returns" type="None" />
</ResponseField>

<ResponseField name="Raises">
  <ParamField query="NotImplementedError" type="">
    Must be implemented by subclasses
  </ParamField>
</ResponseField>

### setNamedPose

```python theme={null}
Arm.setNamedPose(pose_name: str, joint_angles: list[float]) -> None
```

Define a pose\_name:joint\_angles pair in the dictionary of named poses (overriding any existing pair).

<ResponseField name="Arguments">
  <ParamField query="pose_name (str)" type="str" required>
    Name of the pose to define
  </ParamField>

  <ParamField query="joint_angles (list[float])" type="list[float]" required>
    List of joint angles in radians
  </ParamField>
</ResponseField>

<ResponseField name="Returns">
  <ResponseField name="returns" type="None" />
</ResponseField>

<ResponseField name="Raises">
  <ParamField query="ValueError" type="">
    If the length of joint\_angles list does match the length of other named poses
  </ParamField>
</ResponseField>

### removeNamedPose

```python theme={null}
Arm.removeNamedPose(pose_name: str) -> Optional[list[float]]
```

Remove a named pose from the dictionary of pose\_name:joint\_angles pairs.

<ResponseField name="Arguments">
  <ParamField query="pose_name (str)" type="str" required>
    Name of the pose to remove (case-insensitive)
  </ParamField>
</ResponseField>

<ResponseField name="Returns">
  <ResponseField name="list" type="Optional[list[float]]">
    Joint angles (radians) of the named pose that was removed, or None if the named pose did not exist
  </ResponseField>
</ResponseField>

### getNamedPose

```python theme={null}
Arm.getNamedPose(pose_name: str) -> Optional[list[float]]
```

Get the list of joint angles corresponding to a named pose.

<ResponseField name="Arguments">
  <ParamField query="pose_name (str)" type="str" required>
    Name of the pose to get (case-insensitive)
  </ParamField>
</ResponseField>

<ResponseField name="Returns">
  <ResponseField name="list" type="Optional[list[float]]">
    Joint angles (radians) of the named pose, or None if the named pose does not exist
  </ResponseField>
</ResponseField>
