로봇팔 제작 프로젝트의 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로 렌더링 하는 프로그램을 보여드리겠습니다.
알루미늄 프로파일을 사용해서 로봇 프레임을 설계하고 있습니다. 로봇 총 길이가 1m 가 되고 로봇 끝 툴(End effector)가 들 수 있는 무계는 60kg.cm * 4(감속) 해서 약 240g를 들 수 있습니다. Goal 까지 최대 시간은 6초로 설계하고 있습니다.
3D Printer로 로봇 관절 부분 제작 및 테스트
베어링 외경이 42mm 내경이 25mm 입니다. 설계 프로그램을 오토데스크 123D를 사용해서 설계하고 있는데 프로그램이 간단해서 초보자도 금방 설계 할 수 있을것 같습니다. 저는 3D Max 경험자라 빨리 익숙해 졌습니다. ㅋ
시뮬레이션을 할 수 가 없어서 인벤터 하나 배워두면 좋을것 같아요!! ㅋ
로봇 관절 부분 지름을 늘려서 6시간 동안 출력했지만...
퇴근 하고 집에 도착해보니 중간에 탈조가 일어나서 망했네요 ㅜㅜ
좀 더 출력하기 유리한 구조로 설계에서 다시 출력 했습니다.
관절 내부 구조 입니다. 베어링과 볼트, 너트 결합 과정.
관절 외부 출력
중간에 서포트를 만들지 않기때문에 가공하기 편했습니다.
참고로 설계하실때 3D 프린터 오차를 고려해야 합니다.
설계 치수와 실제 치수와는 차이가 있습니다. 저 같은 경우는 3D Printer 노줄이 0.2mm 이기 때문에 설계시 0.1~0.2mm 정도 감안하고 있습니다.
관절 부분 조립 과정
알루미늄 프로파일 속으로 와이어 삽입, 베어링를 사용해서 와이어 마찰을 줄임.
와이어를 사용하는 이유는 로봇팔을 최대한 가볍게 만들기 위함 입니다.
관절 결함
결합부를 깔끔하게 라운딩처리했습니다. ㅎㅎ
관절 부분 테스트를 위해서 간단하게 바이스에 고정
와이어를 당겨서 팔 부분을 반복적으로 움직였더니 문제점이 발생되었습니다.
와이어가 관적 부분에 너무 꺽이여서 들어가서 마찰이 증가되었고 스틸와이어 내구성 문제 입니다.