로봇팔 제작 프로젝트의 6번째 게시글입니다. 초기 계획 단계부터 지금까지 1년의 시간이 지낫네요 ㅠㅜ
아무래도 직장생활을 하면서 취미생활로 추가적인 로봇팔 프로젝트를 진행하다보니, 집에서 작업하는 게 가끔은 업무처럼 느껴집니다.
로봇팔 SW개발하기 앞서 Visual Studio에서 제공하는 UML 프로젝트로 먼저 SW 설계를 진행했습니다. startUML로 초기 설계를 했었는데 너무 오래된 툴이기도 하고, 처음으로 Visual Studio UML를 사용해보고 있습니다.
프로젝트 요구사항은
1. 모듈화 및 확장성 다양화
2. 2D, 3D Viewport개발
- 역기구 알고리즘 (로봇 관절 시뮬레이션)
3. Robot Bin Picking
- Template matching (end effector 카메라 이용)
4. 병렬화 처리 (multi core, simd)
5. 캘리브레이션
이제 간단하게 프로젝트 진행 과정을 살펴보겠습니다.
VST(VisionSimulationTool) 프로젝트 생성
프로젝트 생성 후 예상되는 개발 시나리오에 요구되는 클래스를 추가합니다.
그리고 모듈화 상속관계를 예상하고, 인터페이스를 설계하고 정의합니다.
앞서 클래스를 추가 후 클래스 다이어그램을 생성합니다. (클래스 다이어그램에서 클래스를 추가하셔도 무방)
클래스 다이어그램에서 클래스의 관계를 연결 짓습니다. 개발 스타일마다 다르겠지만, 저 같은 경우 처음 큰 틀로 클래스 구조를 잡고, 세부 클래스 변수, 함수를 추가합니다.
Cwnd를 상속받는 VwBaseView는 자식의 2D, 3D, Profile(Chart)를 관리하고, 상황에 따라서 스위칭 가능한 구조로 설계를 하였습니다.
VwBaseView 클래스에 정의된 2D DrawItem 은 상위 부모인 BsNameObj의 클래스 이름을 검색하여 Item를 찾는 구조로 설계하였습니다.
VwCloud 클래스에 정의된
GLMngr 클래스 : (GLSL, VBO, CallList)
VwRestoreRC : openGL 리소스 할당, 해지
VwCloudCamera : 3D Viewport 시점 관리
데이터 탐색으로 KDTree 사용 - 8~16 step
VwCloud 클래스에 정의된 Object Item으로 순서대로 Paint가 되는 구조며, 각각 Object의 Metrix 가 존재함.
구조를 다시 잡아야 하는 상황을 사전에 방지하기 위해선 반드시 SW 구조 설계하면서 구현에 필요한 기술을 사전에 많이 조사하고 정리하는 습관을 연습하고 있습니다.
이제 각각의 예상되는 클래스에 변수, 함수를 정의하고, 구현합니다. 현제 개발 진행도는 50% 정도 되었습니다.
3D 데이터 구조를 잡으면서 가장 혼란스러웠던 부분이 SOA <-> AOS를 병행 하는 구조, 그리고 SIMD 처리하면서 발생되는 메모리 처리였던 거 같습니다. SOA <-> AOS 변환은 SSE, AVX 두 개가 거이 동일한 성능 차이를 보이고, 포인트 수에 따라 차이는 있지만 SISD 보다 약 1.5배 이상 성능 차이를 보입니다.
이해를 돕기 위해 코드로 생각해보면
struct Point
{ float x;
float y;
float z;
}
Point pt [1000]; //SOA 구조
//AOS 구조
float x [1000];
float y [1000];
float z [1000];
이렇게 됩니다.
병렬 처리에 유리한 구조가 AOS 가 되고, 렌더링 Shader에 보내기 위해 SOA 구조로 변경하게 됩니다. (vertex shader copy 하기 유리함.)
다음 포스팅에서는 로봇에 붙어있는 Laser distance Sensor 데이터를 360도 맵핑해서 3D로 렌더링 하는 프로그램을 보여드리겠습니다.