2020년 2월 17일

sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 6)

안녕하십니까
이번시간에는 Sirius 에서 레이저 가공시의 절차를 사용자 입맛에 맞도록 구현하는 방법에 대해 설명해 보겠습니다.

1. IMarker 인터페이스

Sirius 에서는 해당 기능을 마커(IMarker) 인터페이스에서 제공하고 있습니다. 즉 이 마커를 상속받아 사용자가 원하는 방식의 구현이 가능합니다.

예를 들어 마커의 핵심적인 함수를 보면
(상세한 구현 내용은 Demos 폴더의 8번 예제 참고)
- 가공할 데이타를 준비하는 Ready 함수
- 가공을 시작하는 Start 함수
- 가공을 중단하는 Stop 함수
- 에러상태를 해제하는 Reset 함수

앞서 살펴본 봐와 같이 가공 정보는 문서(Document)에 존재하고 있으며, 이 문서 데이타를 화면(View)에 그리는 등의 작업이 일어납니다. 마커(IMarker)는 많은 데이타 처리를 비동기적으로 해야 하므로, 가장 일반적인 구현방법은 마커 내부에 작업 쓰레드를 만들어 처리하는 방식입니다. 이때 주의할것은 화면에 다시 그리는 이벤트는 수시로 발생해 문서(Docment) 데이타에 수시로 접근되고, 마커(IMarker) 역시 쓰레드내에서 문서 데이타를 읽어 가공을 하게 되므로, 공유 데이타(Document)에 대한 크로스 쓰레드 문제가 발생하게 됩니다.

때문에 마커내에서 작업 쓰레드를 생성해 사용할 경우에는, 반드시 문서를 복제(Clone)한 복사본을 만들어 마커는 복사복만 접근하도록 제한해야 합니다.

즉, public bool Ready(IDocument doc, IRtc rtc, ILaser laser, IMotion motion=null)
함수로 가공데이타를 전달받을 경우, 인자로 전달된 doc 를 복제(doc.Clone()) 하여 변수에 저장후 작업 쓰레드에서 처리해 주셔야 합니다.



2. 문서(Document)의 기준점 

자 그럼 마커에서 레이저 가공시 기준 위치를 설정하는 법을 살펴보겠습니다.



SIriusEditor 에디터에서는 위와 같이 문서 정보 버튼을 눌려줍니다.


그럼 위와 같이 현재 문서의 크기 정보(Dimension)를 입력할 수 있게 됩니다.
문서 크기의 핵심 데이타는 폭(Width), 높이(Height), 중심점(Center) 정보들입니다.


위와 같이 입력하였다면, 폭과 높이가 50mm 이고 가공 중심점(원점)은 X=25, Y=25 가 됩니다. 이때 가공 중심점이라는것은 스캐너의 원점을 의미합니다.


결국 위와 같이 HELLO 라는 마킹 텍스트 개체가 있을 경우 가공원점은 25,25 이므로 실제 스캐너를 이용해 가공시에는 우상단이 아닌, 상단 중앙에 "HELLO"가 가공되게 됩니다. 스캐너 장치는 기본적으로 원점(0,0) 을 기준으로 데이타를 처리하게 되는데, 위와 같이 사용자가 1사분면에만 가공데이타를 놓이게 하고 싶을경우 사용하는 방식입니다. 즉 기준 원점(Center)을 변경하는것은 스캐너의 원점을 변경하는 것과 동일합니다. (참고 : 개체를 선택후 Ctrl + H 단축키를 누르면 원점 정렬이 이루어집니다)


3. 문서(Document)의 회전 기준점

그러나 한가지 문제점이 있는데, 만약 위 데이타를 각도를 회전시켜 가공해야 할 경우가 있습니다. 회전 기준정보가 없는 상태에서는 기본적으로 수학적 원점(0, 0) 즉 예전 원점을 기준으로 회전되기 때문에 회전 기준점을 변경할 수 있어야 합니다.

때문에 위와 같이 Rotate Offset 에서는 회전 기준점을 설정할수있습니다. 즉 Dimension 에서 Center 점을 설정하고, 회전 기준점을 Center 점과 같은 값으로 설정할수도 있고 위와 같이 다른 위치를 설정할수도 있습니다.


4. 마커에서의 행렬 처리

마커에서는 위와 같이 문서의 기준점및 회전점을 처리한후 데이타를 가공해야 합니다. 더우기 가공시에는 오프셋(Offset)을 외부 측정 장치로 부터 연산하고 이 이동량, 회전량을 (DX, DY, Angle) 한번 더 변경하는것도 지원해야 합니다.

즉,

문서상의 가공 데이타(위 HELLO) => 
문서에 지정된 기준점(Center)으로 이동 => 
문서에 지정된 회전점(Rotate) 처리 => 
사용자가 입력한 오프셋(X,Y,Angle) 처리

가 모두 적용되어야 합니다.

(설명에서는 누락하였지만 만약 스캐너 장치를 누군가가 90 혹은 180 도 회전된채로 장착하였다면 이 역시 회전 처리가 되어야 겠지요.)

이 같은 선형변환을 위해 Rtc 인터페이스 내부에는 행렬 스택(Matrix Stack)을 지원합니다.
이 행렬 스택은 입력된 데이타의 선형변환 (회전, 이동 등)을 스택(Stack)에 Push 하게 되면, 레이저 가공시 스택에 존재하는 모든 행렬을 연산한 결과값을 적용한 최종 위치를 계산하게 됩니다.

데모 8번 코드를 예를 들면,

var matrix =
      Matrix3x2.CreateTranslation(dx, dy) * /// 6. 오프셋 이동량
      Matrix3x2.CreateRotation((float)(angle * Math.PI / 180.0)) *  /// 5. 오프셋 회전량            Matrix3x2.CreateTranslation(Vector2.Negate(doc.Dimension.Center)) * ///4. 문서의 원점 위치 이동
      Matrix3x2.CreateTranslation(doc.RotateOffset.X, doc.RotateOffset.X) * ///3. 회전 중심 위치 원복
      Matrix3x2.CreateRotation((float)(doc.RotateOffset.Angle * Math.PI / 180.0)) *  ///2. 문서에 설정된 회전량
      Matrix3x2.CreateTranslation(-doc.RotateOffset.X, -doc.RotateOffset.X);  ///1. 회전을 위해 회점 중심을 원점으로 이동

/// 연산된 행렬 스택을 IRtc 에 설정함
rtc.MatrixStack.Push(matrix);


위와 같이 선형 변환에 필요한 행렬을 스택에 넣고 그 결과값을 IRtc 에 처리해 주고 있습니다. 자세한 구현사항은 데모 8번 예제를 참고해 주시기 바랍니다.

2020년 2월 11일

sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 5)


안녕하십니까
이번시간에는 최근 추가적용된 새로운 기능에 대한 설명입니다.


1. DXF 가져오기 및 벡터의 분해(Explode)


위와 같이 DXF 파일을 가져오게(Import) 되면 하나의 그룹(Group) 개체로 불러들여지게 됩니다. DXF 파일은 수많은 정점 정보가 있기 때문에 고속으로 화면에 렌더링을 위해서 Sirius 에서는 그룹(Group)이라는 특수 개체를 만들어 모든 벡터 정보를 가지도록 처리되었습니다.



해당 그룹(Group) 개체의 모든 데이타를 확인하고 싶을 경우에는 이 그룹 개체를 분해(Explode) 할수도 있습니다. 위와 같이 분해(Explode) 버튼을 사용해 분해를 하게 되면, 위 이미지처럼, 그룹 개체를 구성하고 있는 선, 호, 폴리선 등의 하부 개체로 쪼개지게 됩니다.  (특정 선, 호 등의 개체를 삭제하거나 추가도 가능하게 되겠지요)


2. 폴리라인의 정점들


또한 폴리선(Polyline : 통상 선과 호의 집합)은 캐드등에서 가장 많이 사용되는데, 이 폴리선의 내부 데이타 역시 Vertex Array 속성 버튼을 누르면 위와 같이 개별 정점(Vertex)으로 표시가 가능하며, 개별 정점을 선택하면 해당 위치가 어디인지를 같이 표시해 주게 됩니다. (X,Y, Bulge 같은 세부 데이타 조작도 가능하며, 가공순서를  반전(Reverse ) 시킬수도 있습니다)


3. 반복 가공 



Sirius에서는 레이저 가공이 가능한 모든 개체들에 Repeat 회수라는 항목을 제공하고 있습니다. 이 값을 통해 몇번이고 반복 가공이 가능해 집니다.




그러나 어떤 그룹개체에 속한 다수의 개체들을 반복 가공할 경우는 다양한 순서의 조합이 가능해야 할 경우가 있습니다.  이 경우에는 우선 해당 개체를 그룹(Group) 개체로 변경을 해줍니다. 여기 까지는 반복 가공 방식이 달라지지 않습니다.


이후 그룹 개체의 오프셋 정보를 적절히 입력하여 복수개의 나선 개체 가공을 각각 5회씩 반복한다고 가정하면, 

1. 첫 나선 개체를 5회 반복  -> 다음 나선 개체를 5회 반복 ->  ... -> 마지막 나선 개체를 5회 반복 => EntityFirst 방식

2. 첫 나선 개체를 1회 반복 -> 다음 나선 개체를 1회 반복 -> 마지막 나선 개체를 1회 반복
위의 가공을 5회 반복 => OffsetFirst 방식

3. 위 두 방식에서 홀수번째 반복 가공에서는 정방향/ 짝수번째 반복 가공에서는 역방향으로 가공 방향을 조합하고자 할때 => Reversible Mark 를 True 로 설정

와 같이 사용자가 적절한 방식을 선택가능하여 가공 품질을 변경할수있습니다. 아무래도 레이저를 반복해서 집중적으로 가공할 경우에는 다양한 품질 이슈가 있을수 있으니 시간을 두고 반복되도록 해야할 경우도 발생합니다.

sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 4)

안녕하십니까
이번시간에는 SiriusEditor 에 포함된 유용한 기능들을 소개하고자 합니다.

1. 해치 (Hatch)


닫힌 폐곡선(Closed figure) 의 형태에 대해서는 해치를 지원합니다. 즉 내부 폐영역에 대한 채우기라고 보시면 됩니다. 옵션으로는 해치를 사용할지 여부(True/False)와 모드(현재는 직선만 제공), 각도, 간격, 배제할 영역 크기 등의 정보를 입력해 주시면 됩니다. 위의 예에서는 트루투입 폰트에 대한 해칭을 활성화 한 모습입니다.


앞서 폰트에 직접 해치를 넣었지만, 또다른 해치의 방법은 위와 같이 개체를 선택하고 해치 버튼을 누른 화면입니다. 이 창에서 설정값들을 입력하게 되면 해치를 진행하고 그 결과 개체가 생성되는 방식입니다.


위와 같이 원본이 되는 영역은 남고, 그 영역 정보를 가지고 해치 패턴을 따내는 방법도 가능합니다.

* v0.9 버전에서는 원, 사각형, 폴리라인(Closed)에 대한 해치를 제공하고 있고, 선(Line) 타입만 제공중


2. 그룹및 오프셋 기능

어떤 개체를 반복적으로 가공하고자 할때 이를 복사해서 붙혀넣기 하기에는 그 개수가 많고 정렬에 어려움이 있습니다. 이를 위해 Sirius 에서는 그룹 + 오프셋 기능을 제공합니다.



우선 반복적으로 배열하고자 하는 개체를 선택하고 개체를 그룹 개체로 변환시킵니다. (개체 트리뷰에서 Group 으로 변환하는 모습)


그룹 개체로 변환이 이루어지면 속성에 Offset Array 이라는 항목이 생성됩니다. 이를 선택하면 위와 같이 오프셋 에디터 창이 뜨고 여기에서 원하는 오프셋 위치값들을 입력해주시면 됩니다. 오프셋 위치정보를 외부에 저장된 파일에서 가져오거(Import)나 내보내기(Export)가 가능하며, Row/Col 개수및 간격을 직접입력할수도 있습니다.


위와 같이 가로세로 개수및 간격등 정보를 입력하여 오프셋 배열정보를 만들어 보겠습니다.


해당 오프셋 정보를 가지고 25개의 나선 개체를 만든 모습입니다.


3. 가공 경로 최적화

가공 데이타가 많아지게 되면 반드시 필요한 것이 가공에 소요되는 시간을 단축해야 한다는 것입니다. 즉 가공 순서에 따라 같은 데이터라도 어떤 경로는 1분이 걸리고 또 다른 경로는 30초만에도 가공이 될수있기 때문입니다.



예를 들어 수많은 포인트(점) 을 이용한 구멍뚫는(Punch) 것이 필요하다고 가정해 보면, 위와같이 일단 점 집합(Points) 개체를 생성합니다.


해당 점 집합 개체는 그룹 개체의 Offset Array 와 유사하게 Vertex Array 항목이 있습니다. 이를 선택하면 포인트 집합 에디터 창이 위와 같이 표시됩니다.

많은 데이타의 예를 들고자 하므로, 임시로 만들어 놓은 랜덤 데이타(Generate Random)을 선택합니다. 그러면 임의의 수백개의 점 데이타가 생성됩니다. (외부 파일에서 Import/Export 등도 가능)

이 상태로 가공을 할 경우 수백개의 점들의 위치를 가공하는데 약 40초가 걸린다고 한다면, 이를 10초만에 가공할수있도록 경로를 최적해 해 보겠습니다.


메뉴 목록에서 경로 최적화(Path Optimizer)를 누르면 위와같이 경로 최적화 창에 수백개의 점 위치정보를 시각화한채 표시됩니다.

이때 위의 Start 버튼 을 누르면 경로최적화가 실시간으로 진행됩니다.


최적화 진행과정이 실시간 계산되며, 부과적으로 아래 상태바에는 최적화 전의 전체 경로 길이, 최적화 이후 전체 경로 길이, 최적화로 향상된 효율성이 계산되어 나옵니다. 약 334 %의 향상이 있는것이 보이시나요?

이 최적화는 앞서 Group 의 오프셋 에서도 제공하고 있으며, 위와 같이 복잡한 경로를 최적화 해야하는 경우 매우 효율적으로 사용이 가능합니다.

해당 최적화는 TSP(Travel Saleman Problem)으로 NP 복잡문제로 알려져 있습니다.

시리우스 라이브러리 홈페이지 오픈

현재 시리우스(Sirius) 라이브러리라는 제품을 개발하고 이를 소개하는 홈페이지를 오픈 하였습니다. 관심있는 분들의 많은 방문 요청드립니다. 앞으로 업데이트 소식및 변경사항은 스파이럴랩 홈페이지를 통해 진행할 예정입니다. 스파이럴랩 홈페이지 :  h...