|
1. Maybe it is... They have told me mechanically they can put the senors in the same plane than the parts.
2. No, I can't. I need too much precision. And I would need a metrology machine to check that... something the customer doesn't want. They are interested on a solution that could survive a mechanical maintenance.
3. Sensors only read the distance between the sensor to the part.
4. No, the precision I need is 3 micro meters... Really don't know how to move that part with that precision.
I really hope the mechanical engineers will be capable to put all the sensors in the same plane than the part itself, if this is not happening, then I'm afraid the solution will be much more harder.
|
|
|
|
|
Hi, You get good distance measurement ( I expect worse case error to be less than double the sensors if you don't have an angle ( beam to cl ) over 45deg. _that's a guess_ ).
Note, ( don't know scale ) at 3 uM, you're in the breath on it and it moves range.
You have a known 2 diameters "perfect" standard, you want to measure part diameter but part to measure may not be exactly located.
Try - draw this and check, I didn't - place your standard. Take 3 measurements, think about 3 arcs from the standards axis, move your standard, repeat, you have 8 unknowns ( x,y for each sensor, x,y for the standard ) and 3 measurements for the first location, 10 unknowns, 6 measurements for the second, 12 and 9, 3rd, 14 and 12 4th, 16 and 15 5th, 18 and 18 6th, at 17 you get a solution. Note that the error bars could be horrible depending on the setup. I suspect that placing the sensors in an approximately equilateral triangle helps, adding a 4th sensor should help, adding measurements will, I'd try a 3 x 3 grid of "target" points that covered most of the between sensor area.
But you will have to work on error analysis and see.
Have fun!
|
|
|
|
|
If the problem is a 2D one, then the angle can be computed using this equation:
cos(alpha) = (r1-r2)/(m2-m1)
|
|
|
|
|
Sorry, I forgot to specify what alpha is. The angle alpha is the angle between the red line and a line that connects the device with the common center of the two circles.
|
|
|
|
|
The distance between the device and the center of the two circles can be also calculated as:
(m2r1 - m1r2)/(m2-m1)
|
|
|
|
|
Simple answer: Yes you can find the angle given measurements of the two discs. I will give you some details in a moment.
More complicated answer: If you want an accurate estimate of the angle, you are out of luck. If you only plan to use the cosine of the angle, you can come up with something pretty good.
Let's call theta the angle that the sensor deviates from dead center on the disc(s).
Let y be the distance of the sensor from the center of the disc(s).
You can use the law of cosines to build two equations involving y and theta.
r_1^2 = m_1^2 + y^2 - 2*m_1*y*cos(theta)
r_2^2 = m_2^2 + y^2 - 2*m_2*y*cos(theta)
Solving them gets you
y = sqrt(m_1*m_2 + (m_2*r_1^2 - m_1*r_2^2)/(m_2 - m_1))
cos(theta) = (m_1^2 - r_1^2)/(2*m_1*y) + y/(2*m_1)
The problem with getting a good value for theta is that cos(theta) is going to be very close to 1.0000 for any small value of theta. So even a tiny measurement error will result in a incommensurately large error in theta. And cos(theta) may even come out to be greater than 1, in which case theta is undefined. However, it seems like a good bet that you can get by with just an estimate of cos(theta) for your calibration, since given a measurement m you can use the law of cosines to find the distance from the center.
modified 4-Feb-20 17:02pm.
|
|
|
|
|
I guess I have a broader question. What is the end goal of this measurement? in other words is the end goal of the analysis, measurement and calculation to:
a.) determine the angles and position for each of the three measuring devices?
b.) determine the difference in radii between the inner and outer rings of the three masters?
c.) measure the radii between the inner and outer rings of random test devices?
d.) test that an introduced device has an inner and outer radii that falls within a given tolerance?
The approach to the calculation will most likely vary depending on the answer to this question.
itprorh66
|
|
|
|
|
e) Measuring the radius of new parts that operators will put into the machine.
I want to know the position + angle of the sensors to be able to calculate the radius of newly introduced parts in the machine.
We want to use the master parts to calibrate the machine and be able to measure new parts.
Thanks for your time and for helping!
|
|
|
|
|
I found a couple of errors and edited my post with the equations to correct them.
|
|
|
|
|
This maybe a simplistic view but looking at the problem of determining the angle at which the sensor strikes the master seems to be as follows:
Consider a Right Triangle with the base labeled AB, the hypotenuse labeled AC, and the following being defined:
1. Line AB is the difference between inside and outside radii of the Master.
2. Line AC is the difference in distances measured by the sensor between outside and inside edges of Master
3. The angle at A formed by Line AB and line AC is the sensor angle.
A first approximation of the angle A is therefore the arcCos of AC/AB. A more accurate determination could be found if you consider the length of Line AC is adjusted by the curvature of the master.
One final note: If you are only interested in determining if the radii of test devices placed in the measurement tool fall within some acceptable tolerance, you could avoid all the messy calculations simply by maintaining the master measurements and comparing acceptable results against new measurement values to determine if the new values are within an acceptable range. This may mean the masters are designed to define maximum and minimum acceptable radii.
|
|
|
|
|
It seems to me that you need a test rig and calibration procedure if variation is the issue keeping you from knowing the position of the sensors. Just because the mechanical engineers can't guarantee the position, doesn't mean you can't measure it after manufacturing.
|
|
|
|
|
You have 3 "points" for every measuring device: where it crosses each circumference and the "center" point of the circles. You should be able to "triangulate" the angle.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Persisting tirelessly to be fit - and agile, perhaps? (13)
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
indefatigable ( not sure about the spelling )
Edit I just checked and amended it
"We can't stop here - this is bat country" - Hunter S Thompson - RIP
|
|
|
|
|
You are up tomorrow.
Persisting tirelessly
be fit - and agile BEFITANDAGILE
perhaps? (anag)
INDEFATIGABLE
(Your spelling is fine)
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
OriginalGriff wrote: INDEFATIGABLE
Just Googled it and apparently we had a ship named that... seems like a strange choice of name for a ship though?
I wonder if the plan was to distract the enemy while they worry about how to try and pronounce it...
Radar-boy: "Sir, I'm picking up the HMS In... In... Ind... Ind... Inde..."
*10 minutes later*
"...Inde... Indefatigable on our scanners!"
Captain: "I know, boy... it sunk us 5 minutes ago..."
|
|
|
|
|
It's a very Victorian name for a ship, isn't it? "An Implacable-class aircraft carrier" is rather Victorian as well, if you know what I mean - kinda makes you wonder how we actually won WWII sometimes ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
kinda makes you wonder how we actually won WWII sometimes
Did we though?
"We can't stop here - this is bat country" - Hunter S Thompson - RIP
|
|
|
|
|
L0001: jmp L0002, L0010, L0021, L0029, L0040, L0050, L0059, L0070, L0082, L0092, L0101, L0109, L0115, L0121, L0133, L0142, L0149, L0157, L0167, L0174, L0185, L0190, L0198, L0209, L0213, L0219, L0223, L0233, L0241, L0247, L0256, L0264, L0272, L0278, L0285, L0292, L0297, L0302, L0306, L0311, L0315, L0319, L0323, L0327, L0331, L0335, L0339, L0343, L0347, L0352, L0357, L0361, L0366, L0371, L0375, L0380, L0384, L0389, L0393, L0398, L0402, L0407, L0412, L0416, L0421, L0426, L0430, L0435, L0440, L0444, L0449, L0453, L0458, L0492, L0499, L0506, L0513, L0520, L0527, L0537, L0546, L0554, L0561, L0568, L0574, L0583, L0591, L0598, L0606, L0616, L0625, L0633, L0640, L0647, L0656, L0665, L0671, L0681, L0690, L0696, L0702, L0708, L0716, L0728, L0753, L0768, L0773
Each JMP operand spawns a fiber (basically a thread). I haven't counted how many are spawned here, but 70-80 or so?
I think maybe this code is a bit heavy handed. This is just to match a (quite complicated) regular expression
Real programmers use butterflies
|
|
|
|
|
honey the codewitch wrote: Each JMP operand spawns a fiber (basically a thread). A light-weight form of a thread.
Given the amount of threads that chrome spawns, I wouldn't mind a bit if there's a few fibers running. Do you have a test-project to test the performance?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Yes I do and the performance is god awful. This is for a compound regular expression rather than a web browser, so this is more than a little excessive. Normally the machine will spawn like 2 or 3 while it's doing normal character scans, but when it has to split it quickly grows.
The reason it spawns more than one is disjunctions in the regex, like foo|bar - it spawns a fiber to scan each one. In truth it spawns slightly more than 1 fiber on average because save points spawn a fiber. Plus each fiber only lives for the duration of one character.
Real programmers use butterflies
|
|
|
|
|
honey the codewitch wrote: Yes I do and the performance is god awful. I agree, and that's why I run FireFox
honey the codewitch wrote: Plus each fiber only lives for the duration of one character. So, light weight threads that are short-lived?
How would it compare to a threadpool, cutting back on creation cost and feeding the threads as they become available?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
They're already allocated since they're simple structs sitting inside an array. The only field that gets set are two simple 32 bit fields on the struct =) Since they're allocated this way, at least unless .NET sucks in this arena (i haven't checked the IL) they don't need to be recycled - they're permanent instances.
Furthermore, the fibers get used at maximum - they are never idle, ergo, a threadpool won't benefit me.
Real programmers use butterflies
|
|
|
|
|
Eddy Vluggen wrote: So, light weight threads that are short-lived?
Kinda. Their primary purpose is non-preemptive/cooperative multitasking instead of preemptive multitasking like threads. The best analogy I've seen is co-routines.
|
|
|
|
|
Yep. That's about the long and short of it.
private struct _Fiber
{
public readonly int[][] Program;
public readonly int Index;
public int[] Saved;
public _Fiber(int[][] program, int index,int[] saved)
{
Program = program;
Index = index;
Saved = saved;
}
public _Fiber(_Fiber fiber, int index,int[] saved)
{
Program = fiber.Program;
Index = index;
Saved = saved;
}
}
All it contains is a pointer to the program array which all fibers share, the current instruction pointer, and any saved cursor position (only used in the event of the "save" instruction)
Creating them is cheap since I just use a straight array to hold them all and it basically never gets resized, so all of them are already "live" just waiting to have their fields filled in.
Real programmers use butterflies
|
|
|
|
|