Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Kaaren loppupiste pythonilla, tai millä ihmeen funktioilla

pyython [22.11.2012 14:33:43]

#

CNC-koneeseeni tarvisin kaarikomentoa varten laskea kaaren loppupisteen koordinaatit.

Tein python-skriptin joka tuon tekee, mutta jostakin syystä koordinaatit menee päin seiniä

Saan alkuarvoiksi ympyrän keskipisteen, kaaren alkupisteen ja kaaren keskipisteen koordinaatit. Lisäksi tulee kaaren kulma, säteen ja pituus

ARCSTARTX 150.000,
ArcStartY 50.000,
ArcMidX 130.116,
ArcMidY 80.116,
ANGLE 46.262,
ARCCENTREX 66.477,
ARCCENTERY 16.476
Radius 90

Seuraava komento on uuden viivan alkupiste (tämä on siis oikeasti kaaren loppupiste)

S 100.000000, 50.000000


Koitin laskea tuota mutta se koordinaatti tuntuu heittävän aina vaan, ilmeisesti pitäs huomioida yksikköympyrän kulmat jotenkin eri tavalla, kun näyttää että loppupistettä ei saa asettumaan tuohon 100,50-pisteeseen..

Metabolix [22.11.2012 16:17:00]

#

Antamissasi luvuissa täytyy olla jotain vikaa, koska ympyrän keskipisteen etäisyys antamastasi kaaren loppupisteestä (100, 50) ei ole 90 vaan noin 47. Muutenkin tiedoissa on parannettavaa: nimien kirjoitusasu vaihtelee eikä ole edes täysin selvää, kumpi keskipiste on ympyrän keskipiste. Sitä paitsi kaaren keskikohta ja ympyrän säde ovat laskujen kannalta tarpeettomia.

Tässä ovat vielä oikeat laskut päätepisteen selvittämiseksi:

import math

# Ympyrän keskipiste.
xk, yk = 66.477, 16.476

# Kaaren alkupiste.
x0, y0 = 150, 50

# Kaaren kulma, 0.8074242185576167.
dt = math.radians(46.262)

# Säde esitietojen perusteella, 89.99972280512868, noin 90.
r = math.hypot(y0 - yk, x0 - xk)

# Alkupisteen kulma, 0.3816907046381504, noin 22 astetta.
t0 = math.atan2(y0 - yk, x0 - xk)

# Loppupisteen kulma, 1.1891149231957672, noin 68 astetta.
t1 = t0 + dt

# Loppupiste, (100.0002231478678, 99.99931180441938), noin (100, 100).
x1, y1 = xk + math.cos(t1) * r, yk + math.sin(t1) * r

pyython [22.11.2012 22:08:33]

#

Jep, otin alkuarvot vain dumppina cam-työkalun postprosessorilta, ne saa kaikki ulos kaarikomennon mukana. Nimesin ne vain hätäisesti debuggausta varten. Skripti käy siis läpi output-filen ja laskee uusiksi nuo kaarikomennot työstöohjelmaa varten.

Varsinaisesta python-koodista ei ollutkaan tuossa mitään, sekin pitää siistiä kuntoon. Python vaikuttaa ihan kätevältä tuommosten filujen muokkaamiseen ja toimii vaikka eri alustoillakin tarvittaessa.

Kylläpä foorumi näytti voimansa, Iso Käsi! ;)

pyython [23.11.2012 00:29:04]

#

Toimii!

Mitä pitäs tehdä jos haluaakin myötäpäivään kiertämään tuon kaaren?

Riittääkö pelkät kulmien vähentämiset vai pitääköhän vaihtaa sin/cos-funktioita?

Metabolix [23.11.2012 06:07:13]

#

Riittää tietenkin kulman (dt) muuttaminen negatiiviseksi.

pyython [23.11.2012 23:54:38]

#

koko roska tulemaan, aluksi lähdefile, jossa siis YK- ja YKV-riveillä kolmas parametri on ympyrän keskipisteen x, neljäs parametri on ympyrän keskipisteen y.

niiden tilalle pitäs laskea kaaren loppupisteen x (kolmas parametri) ja loppupisteen y (neljäs parametri)

myötäpäivään menevillä ympyrän kaarilla eli YK-komennoilla tulee tuo neljäs parametri väärin, siihen tulee takaisin se keskipisteen Y, vaikka miten tekisin.
kulma on kerrottu -1:llä, onkohan mun kehittymätön trigonometria haitaksi?


sourcefile, josta nuo rivit luetaan ja kirjoitetaan takaisin uusin arvoin:

%File Name:     Profile 1_1
%---
%FEED_RATE_CHANGE
YK 33.000,74.834,33.000,84.334,9.500,90.000
%FIRST_CW_ARC_MOVE     %ARCSTARTX 33.000, ArcStartY 74.834, ArcMidX 26.282, ArcMidY 77.616, ANGLE 90.000, ARCCENTREX 33.000, ARCCENTERY 84.334
S 23.499769, 107.410538
YK 23.500,107.411,33.000,107.411,9.500,90.000
%FIRST_CW_ARC_MOVE     %ARCSTARTX 23.500, ArcStartY 107.411, ArcMidX 26.282, ArcMidY 114.128, ANGLE 90.000, ARCCENTREX 33.000, ARCCENTERY 107.411
S 90.538231, 116.910538
YK 90.538,116.911,90.538,107.411,9.500,90.000
%FIRST_CW_ARC_MOVE     %ARCSTARTX 90.538, ArcStartY 116.911, ArcMidX 97.256, ArcMidY 114.128, ANGLE 90.000, ARCCENTREX 90.538, ARCCENTERY 107.411
S 100.038231, 84.333618
YK 100.038,84.334,90.538,84.334,9.500,90.000
%FIRST_CW_ARC_MOVE     %ARCSTARTX 100.038, ArcStartY 84.334, ArcMidX 97.256, ArcMidY 77.616, ANGLE 90.000, ARCCENTREX 90.538, ARCCENTERY 84.334
S 32.999771, 74.833618
S-NOPEUS72
%FEED_RATE_CHANGE
S 32.999771, 74.833618
%RAPID_MOVE

koodi

import re
import math

fin = open("C:/temp/oldkone/NUMO/Profile 1_1.AJO","r")
fout = open("C:/temp/oldkone/NUMO/koe.ajo", "wt")

for line in fin:
	if 'YK' in line or 'YKv' in line:
		#cols = line.split(',')
		print(line + 'original')

		cols = re.split('[ ,]', line)

		print ('|0| '+cols[0]+' |1| '+cols[1]+' |2| '+cols[2]+' |3| '+cols[3]+' |4| '+cols[4]+' |5| '+cols[5]+' |6| '+cols[5]+'|')

		#print ('xk '+ str(xk) + ' yk '+ str(yk) + ' x0 '+ str(x0) +' y0 '+ str(y0)+ ' dt '+ str(dt) + ' r ' + str(r) +' x2 '+ str(x2) +' y2 '+ str(y2) + ' x1 '+ str(x1) +' y1 '+ str(y1) +' t0 '+ str(t0)+' t1 '+ str(t1)+' t2 '+ str(t2) + ' t2deg ' + str(math.degrees(t2)) + ' t1deg ' + str(math.degrees(t1)) )

		if cols[0] == 'YK':
			# kulma asteina
			ANGLE = float(cols[6])

			# keskipiste
			xk, yk = float(cols[3]), float(cols[4])

			# alkupiste
			x0, y0 = float(cols[1]), float(cols[2])

			# alkukulma rad, kaanteisluku
			dt = math.radians(-1*ANGLE))

			# radian
			r = math.hypot(y0 - yk, x0 - xk)

			# alkupisteen kulma
			t0 = math.atan2(y0 - yk, x0 - xk)

			# loppupisteen kulma
			t2 = t0 + dt

			# sijoitetaan takaisin rivin soluihin
			cols[3], cols[4] = str(xk + math.cos(t2) * r), str(yk + math.sin(t2) * r)


		if cols[0] == 'YKv':

			# kulma asteina
			ANGLE = float(cols[6])

			# keskipiste
			xk, yk = float(cols[3]), float(cols[4])

			# alkupiste
			x0, y0 = float(cols[1]), float(cols[2])

			# alkukulma rad
			dt = math.radians(float(ANGLE))

			# radius
			r = math.hypot(y0 - yk, x0 - xk)

			# alkupisteen kulma
			t0 = math.atan2(y0 - yk, x0 - xk)

			# loppupisteen kulma
			t1 = t0 + dt

			cols[3], cols[4] = str(xk + math.cos(t1) * r), str(yk + math.sin(t1) * r)


		if ANGLE <180:
			cols[6]='0' #for small curves
		else: cols[6]='1'

		fout.write(cols[0]+' '+','.join(cols[1:7]))
		fout.write('\n')

		#log
		print (cols[0]+' '+','.join(cols[1:7])+'\n')

	else:
		fout.write(line)


fin.close()
fout.close()
print('C:/temp/oldkone/NUMO/koe.ajo')

Sitte tulokset:
input:
YK 33.000,74.834,33.000,84.334,9.500,90.000

output:
YK 33.000,74.834,23.5,84.334,9.500,0

Neljäs parametri näyttää pysyvän samana, vaikkakin se pitäis olla ympyrän keskipisteen y + sin(-alkukulma) * r

Seuraava komento jatkaa: S 23.499769, 107.410538
oikea kaaren lopun y-koordinaatti on siis reilut 107 eikä tuo n. 84 joka on keskipisteen y-koordinaatti.

yk + math.sin(t2) * r

mathforum: arcs

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta