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

# So101Follower

## So101Follower

Inherits from: `FeetechMotorsBus`, [`Arm`](/robot-api/reference/base/robot/arm/Arm)

*No class docstring.*

### Inherited methods

* From [`Arm`](/robot-api/reference/base/robot/arm/Arm): `setNamedPose`, `removeNamedPose`, `getNamedPose`
* From [`Robot`](/robot-api/reference/base/robot/robot/Robot): `addSensor`, `getImage`, `cleanup`

### **init**

```python theme={null}
So101Follower.__init__(port: str = '/dev/ttyACM1')
```

*No docstring provided.*

<ResponseField name="Arguments">
  <ParamField query="port (str)" type="str">
    *No description provided.*
  </ParamField>
</ResponseField>

### getJointAngles

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

Get the joint angles in radians.

<ResponseField name="Returns">
  <ResponseField name="returns" type="list[float]" />
</ResponseField>

### setJointAngles

```python theme={null}
So101Follower.setJointAngles(angles: list, blocking = True, moving_time = 0.0, accel_time = None)
```

Set the joint angles in radians.

<ResponseField name="Arguments">
  <ParamField query="angles (list)" type="list" required>
    *No description provided.*
  </ParamField>

  <ParamField query="blocking" type="">
    *No description provided.*
  </ParamField>

  <ParamField query="moving_time" type="">
    *No description provided.*
  </ParamField>

  <ParamField query="accel_time" type="">
    *No description provided.*
  </ParamField>
</ResponseField>

### moveToNamedPose

```python theme={null}
So101Follower.moveToNamedPose(pose_name: str, moving_time = 2.0)
```

Move the robot to a named pose.

<ResponseField name="Arguments">
  <ParamField query="pose_name (str)" type="str" required>
    *No description provided.*
  </ParamField>

  <ParamField query="moving_time" type="">
    *No description provided.*
  </ParamField>
</ResponseField>

### grasp

```python theme={null}
So101Follower.grasp()
```

Close the gripper to grasp an object.

### release

```python theme={null}
So101Follower.release()
```

Open the gripper to release an object.

### stop

```python theme={null}
So101Follower.stop()
```

Soft e-stop the robot.

### shutdown

```python theme={null}
So101Follower.shutdown()
```

Turn off motor torques and disconnect from the robot.

### getState

```python theme={null}
So101Follower.getState() -> dict
```

Get the state of the robot

<ResponseField name="Returns">
  <ResponseField name="dict" type="dict">
    state of the robot
  </ResponseField>
</ResponseField>

### getPosition

```python theme={null}
So101Follower.getPosition() -> Position | None
```

Get the position of the robot in the world frame, in meters

<ResponseField name="Returns">
  <ResponseField name="Position" type="Position | None">
    position of the robot
  </ResponseField>
</ResponseField>

### getOrientation

```python theme={null}
So101Follower.getOrientation() -> Orientation | None
```

Get the orientation of the robot in the world frame

<ResponseField name="Returns">
  <ResponseField name="Orientation" type="Orientation | None">
    orientation of the robot
  </ResponseField>
</ResponseField>

### moveByVelocity

```python theme={null}
So101Follower.moveByVelocity(linear_velocity: Velocity, angular_velocity: Velocity, frame: str = 'body') -> None
```

Move the robot by a given velocity in m/s.

Due to different form factors for robots, there is no guarantee that
the robot will exactly move at the given velocity. Hence, it is recommended
to use feedback and state data to ensure that the robot is moving as expected.
We also recommend referring to the robot specific documentation for more
information on how to use this method.

<ResponseField name="Arguments">
  <ParamField query="linear_velocity (Velocity)" type="Velocity" required>
    linear velocity
  </ParamField>

  <ParamField query="angular_velocity (Velocity)" type="Velocity" required>
    angular velocity
  </ParamField>

  <ParamField query="frame (str)" type="str">
    frame to move in (body or world)
  </ParamField>
</ResponseField>

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