--
You received this message because you are subscribed to the Google Groups "OpenPnP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to openpnp+u...@googlegroups.com.
To post to this group, send email to ope...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/openpnp/cdb07b20-2e82-4f6d-b529-2a29bd38df39%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
For an optimal Z-up,xyc-move,Z-down combined move, you would really need start the Z-up, and then AFTER it has moved up Zmin, which is like the height of the part + extra to clear feeder shutters&stuff, Only then is it safe to start the XYC move. If you knew that the Z-down was going to take Zdtime, you still can't start that move Zdtime before the XYC is finished, because you might hit other tall parts that are already placed on the board.
The machine I am building has linear motors for X and Y, so it could be crazy fast like yours. So your making me think about some of these things too.
I hadn't even thought of starting the XYC before the Zup was done. My controller will report a move is done before the motion completely damps out, and I figured that I could safely start the Zdown at that time, in the hopes that XYC finish oscillating around the commanded coordinate before the Zdown gets to the board.
Although one I am thinking about eventually looking at is a line scan camera - basically the head just flies the part over the up-looking camera without stopping.
If doable, this would be a huge timesaver.
For an optimal Z-up,xyc-move,Z-down combined move, you would really need start the Z-up, and then AFTER it has moved up Zmin, which is like the height of the part + extra to clear feeder shutters&stuff, Only then is it safe to start the XYC move. If you knew that the Z-down was going to take Zdtime, you still can't start that move Zdtime before the XYC is finished, because you might hit other tall parts that are already placed on the board.sure! but if Z has some headroom above Zmin i it should be faster to allow it to overshoot and stop there after XYC started to move. same for Z-down - start descending before XY reach target position so to cross Zmin when we're at the right place.
The machine I am building has linear motors for X and Y, so it could be crazy fast like yours. So your making me think about some of these things too.yeah, cool, i've seen you video. can't even compare that to my vibrations-inducing stretchy X belt drive :)I hadn't even thought of starting the XYC before the Zup was done. My controller will report a move is done before the motion completely damps out, and I figured that I could safely start the Zdown at that time, in the hopes that XYC finish oscillating around the commanded coordinate before the Zdown gets to the board.motion controllers usually have a "position in place" signal. with properly tuned servos they should not leave a predefined range around that target position. definitely they should not oscillate much...
Although one I am thinking about eventually looking at is a line scan camera - basically the head just flies the part over the up-looking camera without stopping.If doable, this would be a huge timesaver.hm. interesting. cannibalize a CCD sensor from a flatbed scanner? :)
Ultimately that would be ideal for fastest placement. I imagine if you can make your controller say that Zup is 'done' as soon as it has cleared Zmin, then openPnp would move on to the XYC move. And if you get your controller to say XYC is done the right amount of time it will take the Zdown to cross Zmin.I think it would need to know what that Zmin would be, and how long the Zdown to cross Zmin will take, all when the XYC move is commanded.
If not, what about firing a strobe? You would get your same instantaneous stopped position in space and need no 'new' hardware beyond a decent camera. I imagine someone has done this, but it's just what popped in my head.
--
You received this message because you are subscribed to the Google Groups "OpenPnP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to openpnp+u...@googlegroups.com.
To post to this group, send email to ope...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/openpnp/c1b5cb79-18fa-4809-9255-011747d72bd4%40googlegroups.com.
I’d be open to reworking the driver interface to support higher performance motion if someone wants to put together a proposal.
sure! but if Z has some headroom above Zmin i it should be faster to allow it to overshoot and stop there after XYC started to move. same for Z-down - start descending before XY reach target position so to cross Zmin when we're at the right place
I have some ideas to do this without changing the driver interface and adapt the client software but it would be quite a challenge:
...i thought about a possibility to introduce a kind of middle layer motion planner with higher-level calls like:
"pick a part, move along a path to XYZC, above Zmin, with specified speed/acceleration, sensing vaccum - stop and signal an error if leaking"
a reference implementation which will directly map onto existing drivers should be straight-forward ...)
--
You received this message because you are subscribed to the Google Groups "OpenPnP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to openpnp+u...@googlegroups.com.
To post to this group, send email to ope...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/openpnp/a488658c-41f5-4548-907d-c6b38160c200%40googlegroups.com.
Thanks Jason
> 1. GcodeDriver was never meant to be as "fat" as it is now. Non-squareness compensation, visual homing, sub-drivers, backlash compensation, axis mapping, etc. are all things that do not belong in GcodeDriver. Some of them should be high level features, and some should be mid-level features that other drivers can use or extend.
Yes, indeed.
> 2. I think it's time to revisit the Driver interface. It has served us well for 6 years now, but it's a little long in the tooth. Some things I've been mulling over:
> 1. Make the driver more of a HAL - the driver tells the machine what devices exist, rather than the current way, which is backwards. In other words, if the machine supports vacuum sensors, and controllable lighting, the driver should tell the machine about that rather than the user having to set that up separately and then link them together.
Could you please elaborate a bit? Sorry, I don't understand.
I think the current building blocks are quite nice if we clean them up a bit and streamline things.
Reality check:, we have a M:N relation between drivers and machine model objects. One single controller will often do many things like control some but not all axes, control lights, control vacuum pump but not the valve, might control the drag pin actuator but not the drag pin positioning axis, etc. The different axes of the same Movable might be controlled by different drivers. There is no clean relationship between the controller and the machine model objects. So yes, axis mapping and sub-drivers may be a bewildering mess but such a linking scheme is necessary because the user does not want to spend extra dollar just to dedicate a separate controller board to a clean group of machine model objects. Also a driver is ultimately 1:1-associated with a connection (serial port/tcp), so you can't break that up, unless you make it more complex on the controller side which I guess would be no gain in the end.
What I think could be done...
First an illustration of how the UI could look like, explanation below:
1. Convert the sub-driver tree structure into a linear pipeline much like in CV.
2. Let the user choose on the UI which type of driver to add.
3. Let the user add the new driver at any position in the pipeline, so drivers can be sandwiched into the middle and on top.
4. Add waitForMovesToComplete() like you suggested.
5. While we’re at it add an extensible “mode” parameter object to moveTo() to allow for different move modes (like G0 vs. G1, precision move vs. fast move, future ideas about relative motor current etc. pp.)
6. Add all the axes to the Location type, perhaps use a new DriverLocation type that is only used inside the driver pipeline. This will support AxisMapping+PathBlending (see below) rolled into one, i.e. the machine could move both Z axes of a four nozzle head at once and could pre-rotate all four nozzles while travelling to the pickup location, saving the time to do that when it is there. This would also support conveyor and feeder axes moves being blended in.
7. Controller specific drivers should never do transformations like AxisTransform, non-squareness compensation and backlash compensation themselves. All they are allowed to do is talk the language of the controller.
8. Instead create simple, separate transformation drivers for various purposes.
9. Transformation must go forwards in moveTo() with the drivers being called in sequence of the pipeline.
10. Transformation must go backwards in home() with the drivers being called in reverse sequence of the pipeline(reverse transformations being applied).
11. Drivers always work in the transformed location space as passed down from their predecessors (or reverse transformation passed up from their descendants). If this is not wanted, an untransformed coordinate must be copied to a new “virtual” axis by the LinearTransformDriver (see below).
12. There could be a VisualHomingDriver. It can be sequenced well above the actual controller driver.
13. There could be a AxisMappingDriver per Movable object where you can choose which Location axes are mapped to which DriverLocation axes (matrix of X, Y, Z, C dropdowns, see image). No more XML editing. In the home() method the AxisMappingDriver will set the current axis coordinates after having received the reverse-transformed coordinates from its descendants.
14. There could be a MultiNozzleDriver covering the usual seesaw/rocker nozzle Z transform. NOTE that it would transform the two axes Z1, Z2 that are separately mapped in the AxisMappingDriver into one Z1. Very clean and universal. No more XML editing.
15. There could be many multi-axis transformation drivers in the future with robot arm solutions etc.. These must be sequenced below the axis mapping stuff but above the actual controller driver.
16. There could be a NonSquarenessDriver. Or Perhaps a more general LinearTransformationDriver.
17. There could be a PathBlendingDriver (as discussed previously but without the heuristics) sequenced underneath all transformation drivers but above the actual controller driver.
18. There could be a BacklashCompensationDriver underneath all that but above the actual controller driver. It would transform all coordinates by the backlash offset. Only waitForMovesToComplete() would then issue the final precision move to the target location.
19. Finally the various controller and machine specific drivers (including a slimmed-down GcodeDriver) would reside underneath .
As you see this would create quite a pipeline of drivers. Because every driver does only one task it could still be quite simple to understand. Divide and conquer.
CAVEAT: how to migrate peoples’ old machine.xml settings?
Given time I could do most of the internal implementation, I guess, if you could add the UI and XML migration (if at all possible) on top of that.
_Mark