Staubli SDK documentation
Get started with Python
Staubli Python SDK provides a simple and efficient way to control Staubli robots using Python. No additional installations are required on the robot controller.
🚀 Introduction
✅ 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
📦 Installation
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.
✨ Features
🔌 Connect to Your Controller
from underautomation.staubli.staubli_controller import StaubliControllerfrom underautomation.staubli.connection_parameters import ConnectionParameterscontroller = StaubliController()parameters = ConnectionParameters("192.168.0.1")parameters.soap.enable = Trueparameters.soap.user = "default"parameters.soap.password = "default"controller.connect(parameters)

🔍 Explore System Information
- 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)

📍 Track Positions & Joints
- 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)

🧠 Kinematics Helpers
- 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)

⚙️ Motion Control Lifecycle
- 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 MotionDescfrom underautomation.staubli.soap.data.frame import Framemdesc = MotionDesc()mdesc.velocity = 250frame = Frame()frame.px, frame.py, frame.pz = 300, 0, 450controller.soap.set_power(True)controller.soap.move_l(0, frame, mdesc)

📡 Physical & Logical I/O Management
- 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])

📦 Application & Project Control
- 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()

🔁 Task Supervision
- 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)
✅ Compatibility
- Controllers: CS8, CS9
- Operating Systems: Windows, Linux, macOS
- Python: 3.7+
- Dependency: pythonnet 3.0+
📜 License
⚠️ Commercial license required
🔗 View EULA
Register your license at runtime with:
from underautomation.staubli.staubli_controller import StaubliControllerlicense_info = StaubliController.register_license("Your Company", "XXXX-XXXX")print(license_info.state)
🤝 Contributing
You're welcome to:
- Submit issues & pull requests
- Share feature suggestions
- Help improve documentation & samples