How to lift random weight at certain distance?

I have a UR10e that I want to program to pick up a bin filled with washed toys of all shapes and sizes. The most I think I’ll ever toss in are up to 15lbs so the robot doesn’t enter a stop if it’s like 30 lbs. The tricky part is guessing how much the bin weighs with toys that retain water such as plushies. The weight can vary from 2-15lbs after a wash so I’m not sure if I should be using a Force template or Direction feature. Can I get some ideas please? I am currently using the simulation but I don’t think it’s giving accurate results. When Polyscope indicates Lift_Up is active during runtime, it just goes to Above_Bin_1 then back to First_Pose. The force is in “Simple” mode.

What is your idea behind using either Force or Direction? To accomodate for the varying payload?

I doubt you’ll get good results with any moving around after picking up the bin, if you do not tell the robot what the bin weighs. It will also introduce unwanted wear on the joints.
It is possible to make some code that makes the robot (e-series and newer) weigh the picked up load, but I have only had success doing so with a payload extended directly downwards in the Z direction of the robot tool flange and the robot flange being horizontal.

Yes, this is to accommodate for the varying payloads. I did some digging around the forum for any other ideas and you came up with this code (link to topic: Dynamic Payload setting in UR E series to pick the dynamic payload - #2 by sya )

Wait 0.2
zero_ftsensor()
Pick_Part
Wait 0.2
Var_1 = force()
Var_2 = Var_1/10 //Newton to kg
set_payload_mass(Var_2)

So I put that in my code to look something like this:

Before Start
Weight_Shift:= False
Wait 2.0
...
Robot Program
Weight_Shift:= False
MoveL
 First_Pose
 Above_Bin_1
 Trap_Handle
 Gripper Close
 Wait: 0.3
 Weight_Shift:= True
 Wait: 0.3
 Weigh_Bin
 Wait: 3.0
 Lift_Up
 Wait: 1.0
 Weight_Shift:= False
 ...

Thread_1
If Weight_Shift =? True
 zero_ftsensor()
 var_1:= force()
 var_2:= var_1/10
 set_payload_mass(var_2)
 sync()

 

I ran this in the simulator and it seems to work fine but there are no real life external forces acting on it so I’m a bit skeptical if I uploaded this to my Cobot. The idea is that the thread is monitoring the code and when Weight_Shift goes to True, it will change the payload constantly until the variable is set to False again. Is this a bad approach? I don’t have much experience coding such large robots..

Yes, that won’t work. The robot must be completely still when you execute the code once. The zeroing must be done before picking up the part - not after.

The Wait 0.2 is to make sure the robot is not vibrating/shaking after a movement.
Then zero the sensor (before touching the part to pick).
Then move down to the part and pick it up (lift it above the table so that the part doesn’t touch anything).
Then wait again to have as few vibrations as possible.
Now you can do the reading (ideally you can use get_tcp_force() instead of Force(). Then extract the third variable from the array so you only get the force exerted in Z ( var_2 = var_1[2] )).

1 Like

Hi,

We have done this to multiple customer and it works fine even when the robot is moving, you just need to move slowly the first few centimeter (we are moving 5mm/s with 200mm/s² for about 10mm) and the payload will increase during the process.

Our code :

In a thread :

If calcul = True:

global Force=get_tcp_force()
global mass=(-Force[1]/9.82) (here I put “-” because our robot with in a certain position, maybe it will ne be the case with yours
load_data=get_target_payload()

global WeightGlobal=load_data+mass

set_target_payload(WeightGlobal,[0,0.060,0.100]) (here you put your cog tcp)

sleep(0.1)

end
sync()

You need to keep the variable “calcul” true during all the first movement

1 Like

Thank you for sharing your code! Your CoG TCP is based on the gripper itself or gripper + object?

I’ve heard issues of objects containing water. They can slosh around and throw the CoG around. I have an image here from hyperphysics that I would use to calculate this CoG. But…it sounds like I may be out of luck if my CoG is moving around as the water drains from the toys.

Can you set up a function related to the time it takes to drain the water? It would be relatively linear I’d imagine. But that will require you to know the dry weight of the box as well as weighing the wet bin when lifting it.

You’re right about sloshing water - that’s always an issue if it has a considerable free-moving weight.

What is the size of object? What is the speed you want to move at?

As far as I know the payload does shift the band width of acceptable motor currents (resulting in force) for the safety functions. Have you tried setting the payload at 15 lb and just running it at such?

You have a lot of wait-calls in your code, so I assume it is not a time critical. With that you should be finde with slower concistent moving.

Ultimately the best with such complex objects is just to try it out.

Setting the payload higher than the actual weight will also result in protective stops. The controller calculates the safety limits both positively and negatively so to speak.

Also, it’s not recommended to run the robot with a wrong payload since it can introduce unwanted wear on the joints.

I guess you are right, if you would want to accelerate a lower mass too fast it should also stop.

The unwanted wear on the joints should only happen if the used acceleration is greater with higher payloads. Or what am I missing here?

I asked my team for ideas and someone suggested I could measure the bin with washed parts using a fish scale myself. I’d set up a slow motion camera to capture the highest value on the scale after I lift it up quicker than intended.

Since I don’t have the equipment yet, assume the highest value on the scale was 6.8kg & the lowest was 4.8kg when the bin is still and water is drained.

Method 1:


I would set a payload “MaximumWeight” [6.8kg+1.3kg(gripper) = 8.1kg] right after the grippers engage. The Cobot will then lift up, stop, run the thread provided by cp11 for a few seconds until it reaches the “Lift_Up” pose.

Method 2:


This other method would have another payload “MinimumWeight” [4.8kg + 1.3kg(gripper) = 6.1kg] set after the bin is still in the air. It will not include the thread.

I think either way the Cobot will suffer some wear on the joints & possibly enter a protective stop. It would be best to set up a standard of what parts can go in the bin to keep the payloads somewhat true. Any recommendations and feedback are appreciated.

Where is it picking the bin from, and does the water drain at all? My thought would be to introduce another piece of hardware. Can the bin be placed on a simple scale that can provide analog data to the robot so it KNOWS how much it weighs before picking it up? If it’s pulling the bin straight from the water, could the bin first be lifted out by some kind of linear actuator and allowed to drain before the robot comes and picks it up?