Pick and Place with model change

Hello.

I am implementing an application where the robot will pick up a box from a conveyor (Position_1), move to a different point to wait (Position_2) and then place the box on a second conveyor (Position_3). The conveyors are static and the boxes stop at the same position.

My issue is that, while the motions are all relatively the same, the Pick, Wait and Place positions vary depending on the size of the box.

I want to be able to quickly switch between box models and simply load the relevant positions to the robot, so I could just have access to a list, sort of like this:
Model 1:
- Position_1
- Position_2
- Position_3

Model 2:
- Position_1
- Position_2
- Position_3

…

Model 15:
- Position_1
- Position_2
- Position_3

etc…

In other robots, I could just store positions “in a list” and access them by calling, for example, Position_1, Position_2, Position_20, etc…, but I haven’t been able to replicate this same kind of functionality with UR.

The best I could find natively is storing the positions in sub programs and calling them dynamically, but this gets unorganized very quickly and it is not very elegant.

Another solution I’ve found is connecting the robot to a server through TCP/IP and having the server store the relevant positions and handle the model change, so each cycle the robot just requests the positions to the server and the server answers depending on the current model. In this case, you could say the robot isn’t even “aware” that a model change may be taking place, it is just receiving the positions for the current work cycle. With this solution, the server also handles the payload for the kind of box and displays information to the operator, so it is more useful.

Finally, I think I’ve jumped through too many hoops for something that should be rather simple, so my question is… Is there a better way to implement this sort of application?

Thank you in advance for you help.

Perhaps it would be useful for you to use the Palletizing Wizard with an irregular pattern. You can create as many locations as you want. In your code before the palletizing wizard you can modify the pallet sequence counter (Pallet_1 _cnt perhaps) to identify the location you want to place the item.

1 Like

Hey Sergio,

Thanks for posting. This may need a little more context for me to answer in the best way, but I would just write a switch case where each case is a different model. The model can be changed at the top of the program or with an external device. Link positions that need to change together (alike positions) and teach all others separate. The program will be structured exactly like your example above there the integer value of your switch is the model you run.

1 Like

Would this work for you? Put all the waypoints into a list then call them out as required according to the index value?

I tried to do this with a 2D matrix but matrices won’t accept poses apparently, so all in one long list.

2 Likes

@pho

Perhaps it would be useful for you to use the Palletizing Wizard with an irregular pattern. You can create as many locations as you want. In your code before the palletizing wizard you can modify the pallet sequence counter (Pallet_1 _cnt perhaps) to identify the location you want to place the item.

Thanks for your reply. Using the pallet wizard in this way seems a little confusing to me but I understand the concept. I will try to implement it this way and check if it is useful for my application

@jucr

Hey Sergio,

Thanks for posting. This may need a little more context for me to answer in the best way, but I would just write a switch case where each case is a different model. The model can be changed at the top of the program or with an external device. Link positions that need to change together (alike positions) and teach all others separate. The program will be structured exactly like your example above there the integer value of your switch is the model you run.

Thanks for your reply. Using a switch/case was my original idea as well, but it quickly became too unorganized, as I would have a Switch/ Case 1, Case 2, Case 3… Case 30…, so I was trying to look up a more elegant solution than this one.

@ajp

Would this work for you? Put all the waypoints into a list then call them out as required according to the index value?

I tried to do this with a 2D matrix but matrices won’t accept poses apparently, so all in one long list.

Yes, this is what I’ve been trying to accomplish. I didn’t want to manually make such a long list, but this is the closest I’ve seen to my original idea. I might even use a similar technique to store the payload for each kind of box. Thank you.

Working with other robots, the positions are stored by default in an indexed list, so it is possible to just call each position by its index on the list, and as you suggested, using an offset to call the relevant items in the group. I was expecting to find a similar functionality working with UR.

Thank you all for helping out on this issue. I will try to update the post when my application is running and detail if I found a better solution. I still haven’t discarded the TCP/IP server idea, just because it took me so long to write it out haha.