AgileX Piper
Technical Specifications
Complete hardware specs, ROS2 topics reference, piper_sdk API summary, and troubleshooting guide.
Mechanical Specifications
| Spec | Value |
|---|---|
| Degrees of Freedom | 6 DOF + optional gripper |
| Reach | ~600 mm |
| Max Payload | ~1.5 kg |
| Repeatability | ±0.1 mm |
| Form Factor | Compact tabletop / desktop |
| Multi-arm | Dual-arm master-slave via separate CAN interfaces |
| Manufacturer | AgileX Robotics |
Electrical & Communication
| Spec | Value |
|---|---|
| Power Supply | 24 V DC |
| Communication | CAN bus — 1,000,000 bps (1 Mbps) |
| Host Interface | USB-to-CAN adapter (e.g., CANable, GS_USB) |
| Linux Interface | SocketCAN (can0, can1, …) |
Software & Control
| Spec | Value |
|---|---|
| Control Modes | Joint position, end-effector pose, gripper |
| Python SDK | pip3 install piper_sdk — agilexrobotics/piper_sdk |
| ROS Package | agilexrobotics/piper_ros (ROS Noetic + MoveIt) |
| Simulation | Gazebo via piper_gazebo.launch |
| URDF | piper_description.urdf (firmware ≥ S-V1.6-3) |
| OS Support | Ubuntu 18.04, 20.04, 22.04 |
| Python Version | Python 3.6+ |
Joint Limits
| Joint | Min (deg) | Max (deg) |
|---|---|---|
| Joint 1 | −175 | +175 |
| Joint 2 | −90 | +135 |
| Joint 3 | −150 | +80 |
| Joint 4 | −175 | +175 |
| Joint 5 | −90 | +90 |
| Joint 6 | −175 | +175 |
ROS Topics & Services
Standard topics and services exposed by piper_ros after launching start_single_piper.launch.
| Topic / Service | Type | Direction | Description |
|---|---|---|---|
/joint_states |
sensor_msgs/JointState | Sub (send commands) | Joint position commands — subscribe to send motion targets to the arm |
/arm_status |
piper_msgs/ArmStatus | Pub (feedback) | Arm state feedback: enabled/disabled, error flags, current joint positions |
/end_pose |
geometry_msgs/Pose | Pub (feedback) | End-effector pose feedback in Cartesian space (position + quaternion) |
/enable_srv |
std_srvs/SetBool | Service | Enable (true) or disable (false) all arm joints |
/go_zero_srv |
std_srvs/Trigger | Service | Command the arm to move to the zero/home position |
/gripper_srv |
piper_msgs/GripperCmd | Service | Set gripper position (0 = open, max = fully closed) |
/stop_srv |
std_srvs/Trigger | Service | Stop all joint motion immediately (emergency stop via ROS) |
/reset_srv |
std_srvs/Trigger | Service | Reset arm errors and re-enable after a fault condition |
piper_sdk API Reference
Key methods on the C_PiperInterface class. Initialize with piper = C_PiperInterface("can0").
| Method | Description |
|---|---|
ConnectPort() |
Open the CAN interface and start the communication thread |
EnableArm(7) |
Enable all 6 joints and gripper (bitmask; 7 = all) |
DisableArm(7) |
Disable all joints — always call when done or before disconnecting |
EmergencyStop() |
Immediately halt all joint motion |
MotionCtrl_2(j1, j2, j3, j4, j5, j6) |
Send a 6-DOF joint position command (angles in degrees) |
GetArmJointMsgs() |
Read current joint positions, velocities, and torques |
GetArmEndPoseMsgs() |
Read current end-effector Cartesian pose |
GripperCtrl(position, speed) |
Set gripper position (0 = open) and speed |
GetArmGripperMsgs() |
Read current gripper state and position feedback |
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
OSError: [Errno 19] No such device |
CAN interface not up | Run sudo ip link set can0 up and verify with ifconfig can0 |
| Arm does not respond to commands | Arm not in slave mode or not enabled | Call piper.EnableArm(7) after connecting. Confirm slave mode jumper is set correctly on the arm. |
| Joint feedback reads all zeros | Bitrate mismatch | Ensure the CAN interface bitrate is exactly 1000000. Re-run ip link set can0 type can bitrate 1000000. |
can.CanError: Failed to transmit |
CAN bus not terminated | Ensure 120-ohm termination resistors are present at both ends of the CAN bus. Enable the Piper's internal terminator via the DIP switch. |
| URDF robot model incorrect in RViz | Firmware mismatch | Firmware < S-V1.6-3: use piper_description_old.urdf. Newer firmware: use piper_description.urdf. |
| Permission denied on can0 | User not in dialout group |
SocketCAN requires root or appropriate permissions. Run commands with sudo or configure udev rules. |
| VR teleop: arm overshoots / hits limits | scaleFactor too high in Unity |
Reduce scaleFactor in the Unity app and re-test incrementally. The Piper workspace is smaller than xArm. |
GitHub Repositories
| Repository | Description |
|---|---|
| agilexrobotics/piper_sdk | Official Python SDK. Install: pip3 install piper_sdk. Includes demos, interface spec (INTERFACE_V2.MD), and dual-arm guide. |
| agilexrobotics/piper_ros | ROS Noetic package with MoveIt, Gazebo simulation, URDF, and standard ROS topics / services. |