과제가 진도가 나가지 않아 갑갑한 느낌을 받은 것은 약 2년전 정식으로 프로젝트 협업이란걸 시작하면서부터였습니다.
물론 코딩을 하면서 막히고 속상한 일은 자주 있지만..
프로젝트의 진도가 나가지 않는다는 것은 속이 체한 것 같은 중압감 + 눈치(뒤통수가 싸늘), 팀원과의 사이(눈 마주치기도 불편함) + 과제방향 모호 + 무기력함, 자책감(내가 할 줄 아는 건 뭐지?) 등등 커다란 스트레스가 되지요.
요 근래 저는..
신이 나서 완성한 트윗디제이(http://topnanis.tistory.com/140)에 이어 새로운 팀이 구성되어 약 한 달가량 과제가 진행 되었습니다.
이제 불과 보름이 남았구요.
가지고 있는 기술에 과제의 모티브가 없는 상태에서 점점 구체화를 해 나가고 팀원들과 분업을 하였지만.. 글쎄요.. 제가 이번에 맡은 일은 저에게는 참 생소한 분야였답니다.
바로 μCos-II(마이크로씨오에스) 운영체제를 사용하는 MC-100이라는 임베디드 보드셋을 사용하여 영상처리를 하는 것이었는데..
이번 과제는 특히 QR코드, AR이라던지, 엣지검출, 보정 같은 내용을 포함하고 있다고 하여
이미지처리 쪽의 기본지식으로, 어떻게든 되겠지 하는 생각으로 맡게 되었답니다.
결론부터 말씀드리면 어떤 경우에 '어떻게든'은 아무런 일도 생기지 않을 수 있습니다.. 결국 내가 다 스트레스 받고 끙끙 매다 손대야하는 일들이 되어버렸구요 ㅠ
물론 많은 분들이 알고 계셨겠지만.. 몰랐어요, 임베디드보드가 리눅스OS에서 컴파일이 되더군요. 프로그래머는 기본적으로 리눅스와 vi에디터에 익숙해질 필요가 있구요.(OS로 윈도우가 깔려있다면 리눅스 에뮬레이터 cygwin과 같은 걸 설치해야 합니다.)
arm용 컴파일러(코드소서리)가 필요하구요. 디버거(Trace32를 썼어요)도 필요합니다.
모든 것은 제한적인 임베디드의 성능과 메모리를 고려한 구조로 되어 있기 때문에.. 학교에서 이걸 왜 하나 생각했던 비트 연산이 이쪽 세계에서 매우 빛을 발휘하더군요.(소켓프로토콜도 비트연산으로 정의 한다고 들었으나 캥거루 과제때는 그냥 문자열로 보냈었답니다) 저는 영상을 주로 R(Red), G(Green), B(Blue) 색상을 각각 8비트씩 0~255값, 총 3바이트로 받아왔는데.. 여기에서는 3바이트를 지원하지 않을수도 있고 만일 지원하더라도 보드가 어떻게 받아올지를 먼저 선택해야 합니다.
저의 경우는 5, 6, 5 비트로 구성되어 있었는데 01010 11110 00101 이런 값이 날아와 예를들면,
#define LOW_R 1111100000000000
register int r = (frameBuf & LOW_R) >> 11;
이렇게 쉬프트로 컬러를 제어한다는 것을 생각하지도 못하였습니다. 첨에는 이게 왜 값이 이렇게 나올까.. 이렇게 나올까만 고민했죠.. 디버깅만 계속 반복하다가 알아낸것 같아요. 배운적이 없었으니까..;;
기본적으로 영상처리는 이진화를 거치고 잡음제거를 한 뒤, 마스크로 처리(반복문을 중복적으로 사용)를 하는 경우가 많은데 임베디드에서는 이것이 어엄청난 리소스를 잡아먹게 된다는 것도 알게 되었습니다. 프레임수가 너무 낮으면 써먹을 수가 없죠. 카메라 작동을 멈추고 연산하게 한다던지 하는 트릭을 사용하거나 단순연산을 해야 합니다.(저의 경우.. 기본틀만 갖추고 돌려보았는데도 2프레임 정도가 나오더군요. 라인트레이서에 끼우면 마커를 인식할 수 없는 번짐 영상이 초당 1프레임 정도 나오지 않을까요)
한번은.. 3바이트 구성으로 바꾸었으나.. 뜬금없는 빅인디언 문제로 순서가 바뀌어서 D R G B 순서가(D는 덤프) R D B G 로 들어와 (최초 3바이트 - R+(D)+B 즉, 보라색으로만) 출력되는 결과도 나오기도 했죠(이걸 모르고 디버깅하면 한나절이 훌렁-)
결국 겁을 먹으면서 코딩을 하고 한줄 한줄에 신경을 쓰게 되죠. 제가 이번 과정에서 얻은 것이라고 한다면
왜 PC가 아닌곳에서 영상처리가 복잡해질 수 없는지, 어느정도 제한해서 코드를 짜야 되는지 하는.. 어떤.. 감을 잡게 되었다고 할까요
openCV 라이브러리를 사용할 수 없고 C로 쓰여진 자료를 쉽게 찾을 수 없다는 것도, 어떠한 감을 잡을 수 없다는 것도 크게 한 몫을 하죠. 주로 특정 제품에서만 사용되는 이러한 보드들은.. 기업에서도 공개를 하지 않는다고 하는군요. 이런게 다 재산이니.. C소스도 귀함. (artmega128 류는 조금 덜하겠죠)
과제의 기간은 길지 않았지만.. 방향을 잘 못 잡고 있었기 때문에 많은 시간을 잡아먹게 되었고 또한 많은 수정을 거치게 되었답니다. '많이 해봐야 안다'는
말은 많이 들었지만.. 이렇게 가슴에 와 닿는 경우도 생기는군요.
현재는 얼마 남지 않은 시간을 퍼포먼스에 중점을 둔 알고리즘을 구상하고 있습니다. 현재도 까마득한 상태이긴 하지만 욕심을 많이 버려 마음이 조금 홀가분하답니다. 마치 늪을 빠져나가듯이 발버둥을 더욱 치는 거예요. 프로젝트를 완성하는 능력도 경험이라는 생각을 하고 있습니다. 방향을 수정해야 할 때를 놓친다면 그 땐 과제 자체를 완성 할 수도 없을테니까요.
팀원들과의 사이는 과제 진행상황과도 연결이 되고 있기 때문에 항상 유의할 필요가 있지요.. 과제도 과제이지만.. 팀원과의 관계가 더 힘든 법인 것 같아요.
임베디드에서 코딩을 하는 것은 참 다른개념이라는 생각을 하게 되었습니다.
난 그동안 임베디드 프로그래밍 곁에서 지켜만 보면서 말을 참 편하게 했다는 생각이 들었어요.
그리고.. 요즘은 일을 벌여 놓은게 많아 한 곳에 신경을 잘 못쓰고 있는데.. 이런 것도 팀원들에게 참 미안하네요.
잡담은 이만 하고 어서 분발해서 멋지게 마무리 지어야겠어요!
아자아자!!
'6_ 그 밖에 아무거나' 카테고리의 다른 글
한 해를 마무리하며.. (5) | 2011.12.31 |
---|---|
발빠르게 변화하는 소통의 시대로의 진입 (Tech plus forum 2011) (0) | 2011.11.14 |
Timemachine clock (0) | 2011.06.27 |
2011 공대 창의적 공학작품 한마당 (1) | 2011.05.18 |
프로그래밍과는 조금 다른 이야기.. (1) | 2011.03.12 |