Learning contactfrom motor current
The servos in my robot arm report how much current they draw. I wanted to know whether that number could tell a learned policy when the peg it holds has touched the hole.
I spent six months trying to teach a cheap robot arm to push a peg into a tight hole. The trouble starts when the peg gets close. Through the wrist camera I could not tell a peg that was lined up from one resting on the rim or one beginning to jam, and neither could the policy. A force sensor would have settled it, but my arm has none. What it has is six servos, and each reports its own motor current for nothing. So I asked three plain questions of that number. Does it carry any information about contact? Does a policy I train take notice of it? And with the number in hand, does the policy put the peg in more often?
Visual occlusion
As the peg nears the hole, the gripper and the peg itself block the wrist camera's view of the rim. From the picture alone I cannot tell whether the peg has touched.
- 1
The picture barely changes. When I look through the wrist camera, a peg lined up with the hole, one resting on the rim, and one that has started to jam all look much alike. Each calls for a different move.
- 2
Touch sensors cost money and trouble. A force sensor or a tactile skin would tell the cases apart. I would have had to buy one, fit it, wire it, and calibrate it, and so would anyone who wanted to repeat my work.
- 3
The servos already measure current. Each of my six servos keeps a register of the current it draws. I can read it with every camera frame, thirty times a second, and it costs me nothing.
- 4
It is a crude number. About half the readings I get are exactly zero. The value depends on how the arm is posed as much as on what it touches, and I have no way of turning it into a force.
Do the policies I train take notice when the current changes?
Does a policy that sees the current put the peg in more often?
My arm and the task
I ran the whole study on a hobby arm. The one thing I added to what it normally observes is a register its servos keep anyway.

Characterisation of the current signal
Before I trained any policy, I put the register to the simplest test I could think of. Does it change when the arm touches something?
Closing on any of the three objects sends the current well above closing on air. The smallest of the three differences is 3.4 standard deviations. Before the test I had set 0.8 as the least I would count.
The middle value is 18.5 counts and the largest is 77. I let the last ten seconds stand in for the moment of insertion, because I did not mark the frames one by one.
The current does move when my arm touches something. I read it alongside the joint angles and the picture, and I never treat it as a force.
Dataset
I taught the task myself, moving the leader arm through a hundred insertions. For every frame I kept the wrist picture, the six joint angles, the six currents, and where my hand had put the leader arm.
The boundaries were marked by hand from the films. I used them to check my analysis, and I never showed them to the policies.
I train the policies with and without current on the same frames, the same pictures, and the same actions. All I change is the list of numbers describing the arm: six joint angles, or six joint angles and six currents.
Nearly half the readings are zero, and the rest trail off into a long tail. When I scaled them the usual way, a rare spike landed tens of standard deviations out. So for the later policies I cut each channel off at the value that 99.5 per cent of the training readings fall below, and scaled it after that.
Multimodal policies
For each comparison I trained two policies on the same demonstrations and ran them on the same day, turn and turn about. The only thing I changed between them is how the current gets into the network.
| Comparison | Without current | With current |
|---|---|---|
| ACT, raw current | The wrist picture and the six joint angles. | I added the six currents to the list of numbers, just as the servos report them. |
| ACT, cleaned current | The same network as before, which I ran again on the same day. | I cut the currents off and scaled them with figures from the training data before they go in. |
| ACT, learned encoder | The same network again, which I ran a third time. | I gave each joint a short history of its current and let a small network boil it down into six extra tokens. |
| Diffusion Policy, learned route | I trained it end to end without current. | I froze that network and added a learned path that lets the current nudge each of its blocks a little. |
I count a trial only if the peg ends up all the way in before time runs out. I give every success rate with a 95 per cent confidence interval and put every pair to Fisher's exact test. Before the trials began, I fixed ten percentage points as the smallest gain I would call worth having.
Evaluation
For each policy I have picked one attempt that went in and one that did not, filmed from the side. They are single trials, and I chose them to show what the two outcomes look like. The counts come next.
Sees the wrist picture and the joint angles, nothing more.
Results
I ran thirty trials for each policy, the two policies of a pair taking turns on the same day. I never set one pair against another, and for good reason: the same network, without current, put the peg in 17 times out of 30 on one day and 7 times on another.
I count a trial when the peg is all the way in within 45 seconds
Only in the first pair do the two intervals come apart, and there the policy with current did worse (p = 0.0089). In the other three the difference may well be nothing. The learned encoder came out 16.7 points ahead, more than the ten I had set as worth having, but no more than chance can produce in thirty trials (p = 0.267). Rest the pointer on a marker to see the figures.
Data table
| Comparison | Without current | Successes | With current | Successes | Fisher p |
|---|---|---|---|---|---|
| ACT, raw current | Vision only | 19/30 (63.3%) [45.5, 78.1] | With raw current | 8/30 (26.7%) [14.2, 44.4] | 0.0089 |
| ACT, normalised current | Vision only | 17/30 (56.7%) [39.2, 72.6] | With normalised current | 15/30 (50.0%) [33.2, 66.8] | 0.796 |
| ACT, learned encoder | Vision only | 7/30 (23.3%) [11.8, 40.9] | With a learned current encoder | 12/30 (40.0%) [24.6, 57.7] | 0.267 |
| Diffusion Policy | Vision only | 9/30 (30.0%) [16.7, 47.9] | With a learned current route | 12/30 (40.0%) [24.6, 57.7] | 0.589 |
Percentage points with 95 % confidence intervals
A filled marker means the interval leaves out zero. Only the raw current manages that, and in the wrong direction. None of the intervals is tight enough to say the two policies of a pair are as good as each other.
When my policies with current failed, they mostly failed at the hole. They dropped the peg or missed the opening; they seldom fumbled the grasp. The two learned encoders lean the way I had hoped, but my thirty trials cannot tell that lean from luck.
Modality-use analysis
A policy might carry the current along and never act on it. To find out, I swapped the current for its average over the training data and left the picture and the joint angles alone. How far the chosen action moved is my measure.
All four policies change their actions when the current is taken away, so none of them ignores it. The one that changes most is the one that never got the peg in at all. Taking notice of a number and profiting from it are two different things.
My policies use the current. Using it did not help them.
What I learned
Yes. The current carries information about contact.
When I close the gripper on an object, its current climbs far above what it draws closing on air. When the peg meets the rim, the elbow current climbs as well. The number is noisy, often zero, and changes with the pose of the arm. It tells me the motor is working hard. It does not tell me how hard the peg is pressing.
Yes. The policies take notice of it.
When I take the current away from any policy I trained with it, its actions shift. Whether they shift for the better is another matter, and this test of mine cannot settle it.
No. The peg went in no more often.
When I gave ACT the raw current, it did worse. When I gave it the cleaned current, it did neither better nor worse that I could measure. My two learned encoders came out ten to seventeen points ahead of their baselines, and thirty trials cannot tell that from luck.
I found a signal that is real and, so far, no use.
The number held the information and my networks took it up, and still the robot put the peg in no more often. If I were to trust a sensor like this again, I would measure the signal, check that the policy responds to it, and then count successes on the real robot. I have learned that nothing short of the last step will do.
- I had one arm, one task, one operator (myself), one training seed, and thirty trials for each policy.
- I still do not know whether the learned encoder beats simply appending the current. I never ran the two on the same day.
- The current does not show me the peg slipping in the gripper. At thirty readings a second it may not tell a slip from ordinary movement.
Citation
@mastersthesis{ranpariya2026contact,
author = {Jaydeepkumar Ranpariya},
title = {Learning Contact Representations from Zero-Cost
Proprioceptive Effort Signals for Contact-Rich
Visuomotor Imitation Learning},
school = {Friedrich-Alexander-Universit{\"a}t Erlangen-N{\"u}rnberg},
year = {2026},
note = {In cooperation with Fraunhofer IIS},
url = {https://contact-from-current.pages.dev/}
}