Desktop arm

Can these hobby servos lift a 500 g payload through this desktop arm's pick and place?

You ask

Can these hobby servos lift a 500 g payload through this desktop arm's pick and place?

Wobbl runs

Terminal
$ wobbl simulate arm "Can these hobby servos lift a 500 g payload through this desktop arm's pick and place?" \  --physics torque --set servo=mg996r --set wrist_servo=mg90s \  --set links=120,120,60 --set link_mass=60,50,30 --set gripper=40g \  --set payload=500g --set pick=200,0,40 --set place=0,200,40 \  --set lift=80 --set move_time=1.2 --set dwell=0.5
The robot arm over its payload, as the run left it at 500 g

Payload 500 g

peak torque against limit

125 %

FAILS

Shoulder torque 1.35 N m, elbow torque 0.722 N m

Passes the 100 % limit at 368 g

Open the full report

Checks, numbers and charts

FAILSThe shoulder servo stalls. Carrying 500 g through this move needs 1.35 N m (13.7 kg cm) almost at rest, where the TowerPro MG996R at 6 V gives 1.07 N m (11 kg cm). The hand hits the table at 0.241 s.

Hardest joint
shoulder
Needs
1.35 N m
Servo gives
1.07 N m
Confidence
high
  • passhand statics
  • passforward run
  • passtime step convergence
  • passenergy account
arm frames, as Wobbl plotted itarm torque speed, as Wobbl plotted itarm usage, as Wobbl plotted it
summary.txt
FAILS. The shoulder servo stalls. Carrying 500 g through this move needs 1.35 N m (13.7 kg cm) almost at rest, where the TowerPro MG996R at 6 V gives 1.07 N m (11 kg cm). The hand hits the table at 0.241 s. Confidence: high. passed hand statics, forward run, time step convergence, energy accounthardest joint: shoulderneeds: 1.35 N mservo gives: 1.07 N mheat: 362% of rated Checks:  [pass] hand statics: at the pick pose the moments of the weights about each joint come to shoulder 1.29 N m, elbow 0.671 N m, wrist 0 N m, and MuJoCo's inverse dynamics needs 1.29, 0.671, 0 N m (1.7e-14% apart)  [pass] forward run: the run with the servos' real limits falls 84.1 degrees behind the move, as the inverse dynamics says it must  [pass] time step convergence: how far the shoulder falls behind 58.8 deg with the normal step and 58.7 deg with half the step (0.031% apart)  [pass] energy account: the work of the forces (drives 0.521 J, constraints -0.826 J) matches the change in kinetic and potential energy, -0.305 J, to 0.13% of the largest energy flow Assumptions:  - Wobbl guessed: servo not named, so Wobbl assumed a TowerPro MG996R at every joint.  - The arm has a TowerPro MG996R at 6 V at the base, shoulder and elbow and a TowerPro MG90S at 6 V at the wrist. Each can carry 33% of its stall torque continuously unless a rating is given.  - The move picks at 200, 0, 40 mm, lifts 80 mm, swings over to 0, 200, 40 mm and lowers, each step in 1.2 s on a minimum jerk profile, then holds 0.5 s. The heating estimate repeats that loaded cycle.  - The servos follow the move by computed torque, as a well tuned controller would, and a hobby servo's own loop lags a little more.  - Each servo's motor, felt through its gearbox, adds the inertia of a 20 ms mechanical time constant, typical of small brushed motors, since servo datasheets do not give it.  - The 500 g payload and the gripper are point masses at the tip, and the base is screwed to the table.  - Bodies are rigid, so links do not bend. A long or thin printed link flexes and rings more than this shows.  - Contacts are stiff springs that let parts sink into each other by the depth the contact check reports.  - Joints and gears have no backlash, and friction acts only where the inputs give it. Suggested fixes:  - Drive the elbow through 2.5:1 and the shoulder through 5:1 with a belt or gear stage: Each servo then sees a fraction of the torque and turns that much faster, with 10% lost in the stage. Solving the move again, the busiest servo uses 44% of its torque at speed and the warmest 85% of its continuous rating.  - Use a DSSERVO DS3218 at the elbow and a ROBOTIS Dynamixel XM430-W350 at the shoulder: Solving the move again with these, the busiest servo uses 39% of its torque at speed and the warmest 98% of its continuous rating.  - Balance the shoulder with a 0.644 N m spring or 660 g on a 100 mm tail: Either carries about half the holding torque. Solving again with the counterweight, the shoulder uses 83% of its torque at speed and 233% of its continuous rating, and the base servo swings the extra mass, where a spring adds none.  - Keep the payload under about 25.1 g: That is the heaviest load these servos carry through the same move over and over without running hot, found by solving the move at each weight. A single move without a stall works up to about 368 g. Images: torque_speed: images/torque_speed.png, usage: images/usage.png, frames: images/frames.pngReport: report.html

About this example

A printed desktop arm stands on a base screwed to the table, with a base servo turning it, a 120 mm upper arm, a 120 mm forearm and a 60 mm hand that keeps its gripper pointing down. The base, shoulder and elbow are TowerPro MG996R servos at 6 V, rated 11 kg cm at stall, and the wrist is an MG90S. The printed links weigh 60, 50 and 30 g and the gripper 40 g. The move picks the payload at 200 mm in front of the base, lifts it 80 mm, swings a quarter turn, lowers it at 200 mm to the side and holds it there, each step taking 1.2 s.

Result Value
Verdict fails, because the shoulder stalls
Shoulder needs 1.35 N m (13.7 kg cm) almost at rest, where the MG996R gives 1.07 N m (11 kg cm)
Elbow needs 0.72 N m at 9 rpm, 76% of what its MG996R gives at that speed
Heat over the repeating cycle the shoulder averages 1.30 N m RMS and the elbow 0.69 N m against about 0.36 N m each can carry continuously
Hand statics the moments of the weights about the shoulder and elbow at the pick point, 1.29 and 0.671 N m, match MuJoCo’s inverse dynamics exactly
What the run shows the shoulder is pinned at its limit from the start, and the hand drops onto the table at 0.24 s
Torque and speed each servo needs against its torque speed line
Torque and speed each servo needs against its torque speed line

The shoulder is short of torque before the arm even moves. Holding 500 g, the 40 g gripper, the wrist servo and the forearm out at 200 mm takes 1.29 N m, about a fifth more than the MG996R’s stall torque, so the arm sags as soon as it is let go. The elbow can just make the move once, but like the shoulder it would cook if the arm repeated it all day, because a hobby servo can carry only about a third of its stall torque for long.

Every fix was checked by solving the whole move again with the change in place.

Fix Result of solving again
A 5:1 belt or gear stage on the shoulder and 2.5:1 on the elbow the busiest servo uses 44% of its torque at speed and the warmest 85% of its continuous rating
A Dynamixel XM430-W350 at the shoulder and a DS3218 at the elbow 39% and 98%
A 0.64 N m spring on the shoulder, or 660 g on a 100 mm tail the shoulder drops to 83% of its torque but still runs hot
A lighter payload these servos make a single move with up to about 368 g, and carry about 25 g all day
Each servo's share of the torque it has at that speed through the move
Each servo's share of the torque it has at that speed through the move

The needs come from MuJoCo’s inverse dynamics along the move, which is exact for rigid links, and a second run with each servo held to its torque speed line shows what really happens. That run falls 83 degrees behind the move and its collapse repeats at half the time step to 0.02%. Its energy account closes to 0.11%. The links are rigid and the servos’ rotors behind their gearboxes are given the inertia of a 20 ms mechanical time constant, since servo datasheets leave it out.

Every joint’s angle, speed and torque through the run, and where the payload went, are in output/trajectory.csv. output/playback.json holds the arm as simple shapes with their poses through the run and each servo’s torque beside its limit, so the arm can be watched trying to lift the payload with each servo’s load shown live.

Run it yourself

Terminal
$ git clone https://github.com/sohan-bhat/wobbl$ cd wobbl/examples/desktop-arm && ./run.sh

The part, the script and every output are in examples/desktop-arm on GitHub.