An open API service indexing awesome lists of open source software.

https://github.com/mgross21/armctl

Agnostic Robotic Manipulation Controller (armctl). A unified Python interface for controlling a variety of industrial and hobbyist robots from different manufacturers.
https://github.com/mgross21/armctl

agnostic cli cli-tool controller dobot elephant-robotics fanuc jaka plc python robotics robots serial socket tcp-ip templete universal-robots ur vention

Last synced: 4 months ago
JSON representation

Agnostic Robotic Manipulation Controller (armctl). A unified Python interface for controlling a variety of industrial and hobbyist robots from different manufacturers.

Awesome Lists containing this project

README

          


armctl




Python Version
License
Downloads

A unified Python interface for controlling a variety of industrial and hobbyist robots from different manufacturers.

## Supported Manufacturers & Robot Series

The `armctl` library currently supports the following manufacturers and robot models:



Universal Robots


Vention


Elephant Robotics




UR3, UR5, UR5e, UR10, UR16


7th Axis Plate


myCobot Pro600




UR5


Vention Plate


Elephant myCobot Pro600

> **Want to see your robot supported?**
> [Open an issue](https://github.com/MGross21/armctl/issues) or contribute a pull request!

## Quick Start

### Installation

*From PyPI:*

```bash
pip install armctl
```

*From GitHub:*

```bash
pip install git+https://github.com/MGross21/armctl.git
```

### Importing the Library

```python
from armctl import *
```

> **Note:**
> For improved runtime performance and clarity, you may import specific manufacturers and robot series directly.

### Simple Example with Manufacturer Defaults

```python
with Manufacturer("ROBOT_IP_ADDRESS") as robot:
robot.move_joints([...])
robot.get_joint_positions()
robot.move_cartesian([...])
robot.get_cartesian_position(...)
robot.sleep(...)
robot.get_robot_state()
```

### Simple Example with Specific Robot Series

```python
with RobotSeries("ROBOT_IP_ADDRESS") as robot:
robot.home()
robot.move_joints([...])
robot.get_joint_positions()
robot.move_cartesian([...])
robot.get_cartesian_position()
robot.sleep(...)
robot.get_robot_state()
```

### Multi-Robot Control

UR5 on Vention Plate

```python
with (
Robot1("ROBOT1_IP_ADDRESS") as r1,
Robot2("ROBOT2_IP_ADDRESS") as r2,
):
r1.home()
r2.home()

r1.move_joints([...])
r2.move_joints([...])
```

> **Tip:**
> For more precise and synchronous control of two or more robots, it is recommended to manage each robot within its own thread or process.

#### Multithread Control

Replicating the prior example,

```python
import threading

def control_robot(robot, ip):
with robot(ip) as r:
r.home()
r.move_joints([0] * r.DOF)

threads = [
threading.Thread(target=control_robot, args=(Robot1, "ROBOT1_IP")),
threading.Thread(target=control_robot, args=(Robot2, "ROBOT2_IP"))
]

for t in threads:
t.start()
for t in threads:
t.join()
```

## API Reference

> **Note:**
> The API has been designed for maximum compatibility across supported robots. Additional commands, such as gripper controls and other advanced features, are planned for future releases to further expand functionality.

### Control Template

The following methods are available to users of the library to control various supported robots.

| Method Name | Description |
|------------------------------|-----------------------------------------------------------------------------|
| `move_joints(pos)` | Move the robot to specified joint positions. |
| `get_joint_positions()` | Retrieve the current joint positions of the robot. |
| `move_cartesian(pose)` | Move the robot to a specified Cartesian pose. |
| `get_cartesian_position()` | Retrieve the current Cartesian position of the robot. |
| `stop_motion()` | Stop all robot motion immediately. |
| `get_robot_state()` | Retrieve the current state of the robot. |
| `sleep(seconds)` | Pause execution for a specified number of seconds. |
| `home()` *(Available only for specific robot series, not for generic manufacturer control)* | Move the robot to its home position. |

Robot Homing Behavior

The "home" position refers to a predefined, manufacturer-specific pose that is safe and repeatable for initialization and calibration.

```txt⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⢠⢰⢡⢣⢢⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⡶⣿⣺⢜⡜⡜⡜⡜⡜⡔⡄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠈⢯⣯⡿⣗⣕⡗⡵⡱⡱⡱⡱⡱⡱⡠⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣻⢾⣿⠱⣲⢫⢞⢵⣳⡵⡱⣱⣵⣻⣟⣿⢶⡤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢽⣟⣿⢘⣯⣿⡕⢹⢺⡽⡕⣯⣿⢷⢿⣽⣟⡿⡳⡠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣻⣽⢿⢨⣷⢿⡇⠀⠀⠈⠣⢟⡷⡽⢽⡾⣅⢇⢇⢇⢇⢇⢆⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣺⡿⣿⠰⣿⣻⡇⠀⠀⠀⠀⠀⠉⠛⢟⠿⣻⣯⡾⣜⢜⢜⢜⢜⢜⢔⢄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣺⣟⣿⠸⣯⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠈⠛⠿⣷⢷⣕⣕⡵⣵⣟⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣺⡿⣯⢎⢭⢓⢇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢙⣿⣾⣻⢷⢿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢠⣟⣿⣿⢸⢸⢸⢸⢸⢰⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣿⣽⣳⢣⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣤⡾⣯⣻⡾⣏⡮⣪⢪⢪⢪⢪⢲⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣯⣟⡷⣿⣽⣦⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢸⣷⢿⣽⢽⡻⡣⣣⢷⡣⡇⡇⡇⣇⡿⡇⠀⠀⠀⠀⠀⠀⠀⢀⣿⢾⣽⡿⢛⣷⢿⡇⠀⠀⠀⠀
⠀⠀⠀⠀⢸⣾⢿⡽⣯⡿⣵⢧⡫⡕⣇⣧⣗⣿⣻⡇⠀⠀⠀⠀⠀⠀⠀⣞⣯⣿⠁⠀⢐⣟⣿⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣹⢿⣻⣯⡿⣯⣟⣯⣿⣽⡷⣿⣽⡫⠀⠀⠀⠀⠀⠀⠀⠀⣯⣟⣾⠀⠀⠀⠋⠻⠃⠀⠀⠀⠀
⠀⠀⠀⠀⢠⢮⢺⡱⡫⡟⡯⣻⢝⢗⡟⣝⢝⢼⢸⡄⠀⠀⠀⠀⠀⠀⠀⢯⣿⣽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢸⣗⡵⡣⡏⣞⢜⡕⡗⣝⢼⢪⡺⣱⢽⡇⠀⠀⠀⠀⠀⠀⠀⠈⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠘⢯⡿⣾⣳⢵⣝⣼⣱⣣⢯⣞⣾⣽⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠉⠻⠻⢿⢾⡷⣿⣽⢟⠿⠓⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
```

#### Standard Units

All inputs and outputs use these standard units:

| Type | Unit |
| ---------------------- | ------------------------ |
| **Joint Angle** | radians |
| **Cartesian Position** | meters (`[x, y, z]`) |
| **Cartesian Rotation** | radians (`[rx, ry, rz]`) |

### Connection Template

The following methods facilitate explicit connection management and low-level command execution. These are primarily intended for advanced scenarios, such as when not using Python's `with/as` context manager or when sending custom commands outside the standard API. *Use with caution*.

| Method Name | Description |
|------------------------------|------------------------------------------------------------------|
| `connect()` | Establish a connection to the robot controller. |
| `disconnect()` | Close the connection to the robot controller. |
| `send_command(cmd)` | Send a low-level command to the robot controller. |

### Properties Template

The properties template exposes key robot class attributes as variables, allowing you to query important specifications programmatically. These include:

| Property Name | Description |
|--------------------------|--------------------------------------------------|
| `JOINT_RANGES` | List of allowed ranges for each joint (radians). |
| `DOF` | Number of degrees of freedom (joints). |
| `MAX_JOINT_VELOCITY` | Maximum joint velocity (radians/second). |
| `MAX_JOINT_ACCELERATION` | Maximum joint acceleration (radians/second²). |
| `HOME_POSITION` *(Available only for specific robot series, not for generic manufacturer control)* | Joint positions of robot home position (radians) |

### Graphical Overview

Below is a high-level diagram illustrating the architecture of the `armctl` library. This design emphasizes the careful templatization of connection and control APIs, ensuring a consistent and extensible interface across different manufacturers and robot series.


Template Overview

### System Logging

By default, the library will show the outgoing commands and incoming data. An example can be seen below:

```console
2025-02-12 13:18:11,350 - INFO - Connected to ElephantRobotics(192.168.1.159:5001)(SEND/RECV)
2025-02-12 13:18:11,351 - SEND - Sending command: power_on()
2025-02-12 13:18:11,954 - RECV - Received response: [ok]
2025-02-12 13:18:11,954 - SEND - Sending command: state_on()
2025-02-12 13:18:12,647 - RECV - Received response: [ok]
2025-02-12 13:18:12,647 - SEND - Sending command: get_angles()
2025-02-12 13:18:12,663 - RECV - Received response: get_angles:[0.290562,-95.891321,-74.804509,-162.949219,1.845703,12.041016]
2025-02-12 13:18:12,663 - SEND - Sending command: task_stop()
2025-02-12 13:18:13,466 - RECV - Received response: [ok]
2025-02-12 13:18:13,466 - SEND - Sending command: state_off()
2025-02-12 13:18:14,176 - RECV - Received response: [ok]
2025-02-12 13:18:14,176 - SEND - Sending command: power_off()
2025-02-12 13:18:14,176 - RECV - Received response: [ok]
2025-02-12 13:18:14,176 - INFO - Disconnected from ElephantRobotics
```

#### Disabling Logging

To disable logging in your Python code:

```python
from armctl import Logger
Logger.disable()
```

Or, set the environment variable before running your script:

```bash
export ARMCTL_LOG=0
```

#### Re-Enabling Logging

To re-enable logging in your code:

```python
Logger.enable()
```

Or, remove the environment variable in your shell:

```bash
unset ARMCTL_LOG
```

### CLI Tooling

To get started with the command-line interface, run:

```bash
armctl --help
```

## Under Development

- [JAKA](https://www.jaka.com/en)
- **Models:** Zu 5
- [Dobot](https://www.dobot-robots.com)
- **Models:** Magician Lite

## Future Development

- [FANUC](https://www.fanucamerica.com)
- **Models:** LR Mate 200iD Series
- **More manufacturers and robot series will be supported in future releases.**

## Contributing

Please feel free to submit a pull request or open an issue for any enhancements or bug fixes. See [CONTRIBUTING](https://github.com/MGross21/armctl/blob/main/CONTRIBUTING.md) for more details.

## License

This project is licensed under the MIT License. See the [LICENSE](https://github.com/MGross21/armctl/blob/main/LICENSE) file for more details.

### Notice

> This package automatically installs the [Universal Robots RTDE Python Client Library](https://github.com/UniversalRobots/RTDE_Python_Client_Library) when needed.
> The RTDE library is provided by Universal Robots and is subject to their licensing terms.