What You Will Accomplish
At the end of this unit you will have a Python virtual environment with the OpenArm SDK installed, and running a 5-line test script will return True from arm.ping(). That confirmation means your Python code has a live communication channel to the arm — which is the foundation everything in Units 3–6 builds on.
The complete SDK installation and configuration documentation is at hardware/openarm/software. This unit frames that process with the context you need and covers the most common failure modes.
Install the SDK
Work through the software setup guide for full SDK installation. The short version:
Installation takes 5–15 minutes depending on your internet connection. The torch and lerobot packages are large but you'll need them in Units 4 and 5, so install them now.
Quick Python Connection Test
With ROS 2 running (from Unit 1) and your virtual environment activated, run this test. It is the fastest way to confirm your full stack is working end-to-end:
If arm.ping() returns True and arm.get_joints() returns the current joint angles, you are done. Move on to the troubleshooting section only if you see errors.
Troubleshooting: The 3 Most Common Connection Errors
Error 1: ConnectionRefusedError or timeout on OpenArm()
ROS 2 is not running or the action server has not started yet. Check that ros2 node list shows /openarm_controller. If not, go back to your ROS 2 terminal and confirm the launch completed without errors. A common sub-cause: you forgot to source your workspace before launching — see Unit 1, critical step 2.
Error 2: can0: Network is down in ROS 2 terminal
The SocketCAN interface dropped. This happens if you unplugged and replugged the USB-CAN adapter without re-running the ip link set command. Run sudo ip link set can0 up type can bitrate 1000000, then restart the ROS 2 launch. Add this command to a startup script so it runs automatically on boot: sudo nano /etc/network/interfaces.d/can0.
Error 3: arm.get_joints() returns all zeros even when arm is not homed
This is not an error — it means the arm is reporting its joint state, but calibration may not be complete. If your arm is physically at the zero pose, zeros are correct. If your arm is at a different angle but still reporting zeros, re-run calibration from the web UI (Unit 1, critical step 4). Joint encoders need the homing sequence to establish absolute position.
Unit 2 Complete When...
arm.ping() returns True in your Python terminal. The test script runs without errors from start to finish. You can see joint angle values change in real-time when you physically move the arm while arm.get_joints() is polled in a loop. You are ready for Unit 3.