The Staubli Communication SDK for Python wraps the native Staubli SOAP stack and exposes a clean, Pythonic API for automation engineers, researchers, and integrators. Use it to supervise industrial robots, orchestrate motion, exchange I/O, and manage VAL 3 applications—all without requiring additional Staubli software licenses.
🔗 More Information: Documentation
🔗 Available also for 🟣 .NET & 🟨 LabVIEW
✅ Install the SDK with pip install UnderAutomation.Staubli
.
✅ Connect to Staubli controllers via the native SOAP protocol.
✅ Control motion, read/write I/O, monitor robots, and manage applications directly from Python.
Highlights:
- ⚡ Real-time SOAP communication through the embedded
UnderAutomation.Staubli.dll
- 🐍 Pythonic wrappers for controllers, parameters, and data objects
- 🔁 Full motion lifecycle & kinematics helpers
- 📡 Access to physical & logical I/Os
- 📦 VAL 3 project and task management
pip install UnderAutomation.Staubli
The package bundles the required .NET assemblies and depends on pythonnet
to bridge Python and .NET. Make sure the target machine has a compatible .NET runtime installed.
from underautomation.staubli.staubli_controller import StaubliController
from underautomation.staubli.connection_parameters import ConnectionParameters
controller = StaubliController()
parameters = ConnectionParameters("192.168.0.1")
parameters.soap.enable = True
parameters.soap.user = "default"
parameters.soap.password = "default"
controller.connect(parameters)
- List robots:
controller.soap.get_robots()
- Inspect controller parameters:
controller.soap.get_controller_parameters()
- Retrieve DH parameters:
controller.soap.get_dh_parameters(robot=0)
robots = controller.soap.get_robots()
controller_params = controller.soap.get_controller_parameters()
dh = controller.soap.get_dh_parameters(robot=0)
- Cartesian pose + joints:
controller.soap.get_current_cartesian_joint_position()
- Joint-only feedback:
controller.soap.get_current_joint_position()
cartesian = controller.soap.get_current_cartesian_joint_position(robot=0)
print(cartesian.joints_position)
- Forward kinematics:
controller.soap.forward_kinematics(robot, joints)
- Inverse kinematics:
controller.soap.reverse_kinematics(robot, joints, target, config, joint_range)
joints = controller.soap.get_current_joint_position(robot=0)
forward = controller.soap.forward_kinematics(0, joints)
joint_range = controller.soap.get_joint_range(robot=0)
reverse = controller.soap.reverse_kinematics(0, joints, forward.position, forward.config, joint_range)
- Power management:
controller.soap.set_power(True)
- Motion primitives:
move_l
,move_jc
,move_jj
,move_c
- Lifecycle control:
stop_motion
,reset_motion
,restart_motion
from underautomation.staubli.soap.data.motion_desc import MotionDesc
from underautomation.staubli.soap.data.frame import Frame
mdesc = MotionDesc()
mdesc.velocity = 250
frame = Frame()
frame.px, frame.py, frame.pz = 300, 0, 450
controller.soap.set_power(True)
controller.soap.move_l(0, frame, mdesc)
- Discover I/Os:
controller.soap.get_all_physical_ios()
- Read states:
controller.soap.read_ios([...])
- Write outputs:
controller.soap.write_ios([...], [...])
physical_ios = controller.soap.get_all_physical_ios()
controller.soap.write_ios(["out1"], [1.0])
- Load projects:
controller.soap.load_project("Disk://project.pjx")
- Inspect VAL apps:
controller.soap.get_val_applications()
- Control lifecycle:
stop_application()
,stop_and_unload_all()
controller.soap.load_project("Disk://project.pjx")
applications = controller.soap.get_val_applications()
controller.soap.stop_and_unload_all()
- List VAL tasks:
controller.soap.get_tasks()
- Control execution:
task_suspend
,task_resume
,task_kill
tasks = controller.soap.get_tasks()
controller.soap.task_kill(tasks[0].name, tasks[0].created_by)
- Controllers: CS8, CS9
- Operating Systems: Windows, Linux, macOS
- Python: 3.7+
- Dependency: pythonnet 3.0+
🔗 View EULA
Register your license at runtime with:
from underautomation.staubli.staubli_controller import StaubliController
license_info = StaubliController.register_license("Your Company", "XXXX-XXXX")
print(license_info.state)
You're welcome to:
- Submit issues & pull requests
- Share feature suggestions
- Help improve documentation & samples