Wire harness installation gets harder every year, because the products the harnesses go into keep getting smarter and more dependent on dense internal wiring. Attaching a heavy, complex harness to a bare electrical cabinet takes two people: one holding the harness in position, one securing it with zip ties. The space is tight, access is bad, and both workers hold awkward postures for as long as the job takes — which is a real ergonomic problem when it repeats all day.
RAWHIDE — Robotic Assisted Wire Harness Installation Demonstration Effort — set out to give the holding half of that job to two robot arms, so one worker can do the securing alone without fighting the harness.


Hardware
Two Rethink Robotics Sawyer arms, each with a Robotiq 2F-85 gripper and universal controller, plus two easy-access push-button interfaces running on Arduino Pro Minis. An Optoforce force/torque sensor and a 3Dconnexion SpaceMouse were trialled as operator-input devices — more on how those went below.

The software bridge problem
Each Sawyer runs its own onboard computer with its own ROS Master. That makes the very first problem a plumbing one: there is no single terminal or program that can command both robots at once.
I used Robot Raconteur, an open-source middleware built for exactly this — integrating systems whose components differ in manufacturer, platform, interface, and API language. It lets you stand up a service that bridges the ROS Master controlling one robot to an external algorithm that has no ROS dependency at all.
I extended that service for the Sawyers specifically, so outside Python code can command a robot and everything hanging off it — grippers, force sensors, anything else on ROS. The service spins up threads that continuously subscribe and publish to the ROS topics you name, and function calls from the main algorithm are translated into ROS messages behind the scenes.

The payoff is that the main algorithm never has to know ROS is involved.
Getting the control feel right
The core interaction problem is letting a worker physically guide an arm without fighting it. Rather than a joystick or a teaching pendant, the worker should be able to express intent to the robot by simply pushing on it.
Impedance control was the first approach. The Sawyer SDK exposes end-effector position and velocity relative to the base, plus position and velocity for all seven joints. Those let you tune stiffness and damping so the arm behaves like a mass-spring-damper with a desired force output on its environment — something a worker can push around directly.
Impedance control on a Sawyer arm.
Admittance control is the inverse: force in, velocity out. Press harder and the arm moves faster in the direction you pushed, the way a toy car responds to how hard and where you press its button.

Admittance mattered here because of a constraint specific to twin-arm work: the two arms are mechanically coupled through the harness they are both holding. Moving one hand may require the other to change its pose to follow, and it’s cumbersome for a worker to reposition both. It gets worse as more wires and connectors are attached and the harness becomes more constrained. Those constraint forces have to be separated from the force the worker is deliberately applying — the approach being a force knob at each arm’s tip to distinguish intended input from incidental load.

Where the sensors failed, and what replaced them
Initial testing with an Optoforce 3D force sensor on one Sawyer’s end effector showed significant variation in the readings plus sensor drift, which produced occasional erratic robot motion — unacceptable for a machine working inches from a person.
The 3Dconnexion SpaceMouse was tried next. It doesn’t read force at all, so it can’t bear a harness’s weight, but its 6-DOF position readings were far more reliable than the Optoforce, and it did successfully teleoperate one arm by commanding end-effector velocity proportional to its displacement. Its driver only supports one SpaceMouse at a time, though, so as an interim step a single SpaceMouse was used to command the midpoint of the harness held between the two arms rather than one arm’s end effector. That worked moderately well for gross manipulation and poorly for fine work — exactly where you need it most, as the harness nears its installation point inside the cabinet.
Neither sensor was going to fit the end goal without significant additional work. The solution was already on the robot: the cuff buttons at the end of each Sawyer arm trigger Zero-G mode, in which the only torques commanded are gravity-compensation torques, so the arm can be moved freely by hand.

The one caveat is that Zero-G compensates for the mass of the robot alone. If the arm is holding a harness, it will sink toward the ground, so the worker has to bear some or all of the wire’s weight. In testing that wasn’t a problem, and harnesses under 6 kg were expected to be fine.
Simple, reliable, and it sidestepped the sensor problems entirely.
Teaching by demonstration
The end goal is that an expert worker teaches RAWHIDE the correct installation procedure for a series of harnesses once, and the system then uses that procedure to help less-experienced workers install the same harnesses efficiently and without errors.
The sequence: both arms rotate toward the table holding the next harness. A barcode-reading system supplied by QinetiQ North America locates the barcodes on the harness and reports where they are relative to each gripper, so the grippers can move to the barcode and grasp the wire beside it. The arms then rotate together to face the cabinet. If scanning the barcode shows an installation procedure already exists, the worker can play it back; if not, they can teach a new one — recording a sequence of hold positions through the push-button interface, the Zero-G cuff buttons, and the Sawyer’s own display, while doing the zip-tying themselves.


Re-grasping is the piece that was still open. When the robots have held the harness at one location and the worker has zip-tied it, the arms must release and re-grasp further along to continue. In the version I left, the worker helps that along manually — either placing the end effectors at the re-grasp points or handing the harness back to the robot. The intended final version uses the same QNA barcode system as the initial grasp: locate the barcodes, decide which gripper takes which, and drive each end effector to its own grasp point.
