/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using System; using System.Collections.Generic; using System.Linq; using VisionCommon; namespace VisionSequence.Setup { /// /// 캘리브레이션 플랜 /// public class CalPlan { private const int FIRST_STEP = 0; private const int SECOND_STEP = 1; private const int BACKLASH_STEP = 2; /// X, Y축 수평 이동 횟수 public int _MoveCalStep { get; private set; } /// T축 회전 이동 횟수 public int _MoveThetaStep { get; private set; } /// 현재까지 이동 횟수 public int _CurrentStep { get; private set; } /// X, Y축으로 1회 이동 거리 public double _AxisCalLength { get; private set; } /// T축으로 1회 회전 각도(Degree) public double _ThetaCalDegree { get; private set; } private int _CalXaxisStep { get; set; } private int _CalYaxisStep { get; set; } private int _CalTaxisStep { get; set; } private Dictionary Plan = new Dictionary(); /// /// 생성자 /// /// X, Y축 수평 이동 횟수 /// X, Y축으로 1회 이동 거리 /// T축 회전 이동 횟수 /// T축으로 1회 회전 각도(Degree) public CalPlan(int moveStep, double axisLength, int thetaStep, double thetaDegree) { _MoveCalStep = moveStep; _MoveThetaStep = thetaStep; _AxisCalLength = axisLength; _ThetaCalDegree = thetaDegree; _CalXaxisStep = moveStep + BACKLASH_STEP; _CalYaxisStep = moveStep + BACKLASH_STEP; _CalTaxisStep = thetaStep + BACKLASH_STEP; _CurrentStep = 1; } private void MakeXaxisCalPlan(string axis, string actionType) { if (_CalXaxisStep == BACKLASH_STEP) { return; } else { MakeAxisCalPlan(_CalXaxisStep, _AxisCalLength, axis, actionType); } } private void MakeYaxisCalPlan(string axis, string actionType) { if (_CalYaxisStep == BACKLASH_STEP) { return; } else { MakeAxisCalPlan(_CalYaxisStep, _AxisCalLength, axis, actionType); } } private void MakeTaxisCalPlan(string axis, string actionType) { if (_CalTaxisStep == BACKLASH_STEP) { return; } MakeAxisCalPlan(_CalTaxisStep, _ThetaCalDegree, axis, actionType); } private void MakeAxisCalPlan(int calAxisStep, double calAxisLength, string moveAxis, string actionType) { string MoveAxis = moveAxis.Remove(1); double CalAxisLength = calAxisLength; double BackLash = -calAxisLength; try { for (int i = 0; i <= calAxisStep; i++) { Dictionary CalDistance = new Dictionary(); Dictionary CalMove = new Dictionary(); Dictionary CalAction = new Dictionary(); Dictionary CalAxis = new Dictionary(); if (i == FIRST_STEP) { if (MoveAxis == Constants.X) { double startPosition = CalculateStartPosition(_MoveCalStep, CalAxisLength) + BackLash; CalDistance.Add(Constants.X, startPosition.ToString()); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.Y) { double startPosition = CalculateStartPosition(_MoveCalStep, CalAxisLength) + BackLash; CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, startPosition.ToString()); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.T) { double startPosition = CalculateStartPosition(_MoveThetaStep, CalAxisLength) + BackLash; CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, startPosition.ToString()); } else { Console.WriteLine("Axis Error"); } CalMove.Add(Constants.BACKLASH, CalDistance); CalAxis.Add(moveAxis, CalMove); CalAction.Add(actionType, CalAxis); Plan.Add(_CurrentStep.ToString(), CalAction); } else if (i == SECOND_STEP) { if (MoveAxis == Constants.X) { CalDistance.Add(Constants.X, (-BackLash).ToString()); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.Y) { CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, (-BackLash).ToString()); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.T) { CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, (-BackLash).ToString()); } else { Console.WriteLine("Axis Error"); } CalMove.Add(Constants.MOVE, CalDistance); CalAxis.Add(moveAxis, CalMove); CalAction.Add(actionType, CalAxis); Plan.Add(_CurrentStep.ToString(), CalAction); } else if (i == calAxisStep) { if (MoveAxis == Constants.X) { double measurePosition = CalculateMeasurePosition(_MoveCalStep, CalAxisLength); CalDistance.Add(Constants.X, measurePosition.ToString()); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.Y) { double measurePosition = CalculateMeasurePosition(_MoveCalStep, CalAxisLength); CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, measurePosition.ToString()); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.T) { double measurePosition = CalculateMeasurePosition(_MoveThetaStep, CalAxisLength); CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, measurePosition.ToString()); } else { Console.WriteLine("Axis Error"); } CalMove.Add(Constants.CALCULATION, CalDistance); CalAxis.Add(moveAxis, CalMove); CalAction.Add(actionType, CalAxis); Plan.Add(_CurrentStep.ToString(), CalAction); } else { if (MoveAxis == Constants.X) { CalDistance.Add(Constants.X, CalAxisLength.ToString()); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.Y) { CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, CalAxisLength.ToString()); CalDistance.Add(Constants.T, "0"); } else if (MoveAxis == Constants.T) { CalDistance.Add(Constants.X, "0"); CalDistance.Add(Constants.Y, "0"); CalDistance.Add(Constants.T, CalAxisLength.ToString()); } else { Console.WriteLine("Axis Error"); } CalMove.Add(Constants.MOVE, CalDistance); CalAxis.Add(moveAxis, CalMove); CalAction.Add(actionType, CalAxis); Plan.Add(_CurrentStep.ToString(), CalAction); } _CurrentStep++; } } catch (Exception e) { Console.WriteLine(e.ToString()); } } private double CalculateStartPosition(int calAxisStep, double calAxisLength) { int stepsToStartPos = (calAxisStep + 1) / 2; int directionToStartPos = -1; return (calAxisLength * stepsToStartPos * directionToStartPos); } private double CalculateMeasurePosition(int calAxisStep, double calAxisLength) { int stepsToMeasurePos = calAxisStep / 2; return (stepsToMeasurePos * calAxisLength * (-1)); } /// /// 캘리브레이션 플랜을 생성한다. /// /// 픽셀 사이즈 측정 플래그 /// X축 캘리브레이션 사용 플래그 /// Y축 캘리브레이션 사용 플래그 /// T축 캘리브레이션 사용 플래그 /// public Dictionary MakeCalPlan(bool isCalPixelExist, bool isX, bool isY, bool isT) { if (isCalPixelExist) { if (isX) { MakeXaxisCalPlan(Constants.X_PLUS, Constants.X_CAL); } if (isY) { MakeYaxisCalPlan(Constants.Y_PLUS, Constants.Y_CAL); } } if (isT) { MakeTaxisCalPlan(Constants.T_PLUS, Constants.THETA_CAL); } return Plan; } } }