[Project 1] 신호 데이터의 Contact & Release 지점 찾기 (1)
프로세싱할 데이터에 대해서
터치 패널에 등간격으로 N개의 점을 찍거나, 특정 엣지(모서리)에서 다른 엣지로 N개의 선을 긋는다. 우리는 이때 감지되는 신호의 강도를 측정한다. 펜이 패널에 닿았을 때가 contact, 뗄 때를 release라고 한다. 한 번의 컨택과 릴리즈를 터치 한 번이라고 표현하겠다. 터치 한 번의 신호 데이터 경향성은 아래와 같다.
증가 (펜이 패널로 다가오는 구간) -> contact point -> 일정 (터치 진행) -> release point -> 감소 (펜이 패널로부터 떨어지는 구간)
즉, contact point와 release point는 증감 부분을 제외한, 일정한 터치 신호 강도가 유지되는 구간의 시작점과 끝점이라고 할 수 있다. 데이터의 종류(등간격으로 찍은 점인지, 얼마의 간격을 가지고 찍은 점인지, 엣지-엣지로 그은 선인지, 어느 방향으로 어느 각도만큼 기울기를 줬는지, etc.)에 따라 신호의 세기, 터치 사이의 간격, 노이즈의 정도 등의 다른 특징을 갖지만, 큰 그림에서의 데이터의 경향성은 위와 같고, 풀고자 하는 문제는 진행된 모든 터치의 contact, release point를, 즉, 터치가 일정한 신호로 진행되는 구간을 구하는 것이다.
문제의 정의와 의미
위에서 설명했듯이 문제는 각 터치의 contact, release 지점을 찾아내는 것이다. 이는 우리는 터치의 강도가 일정한 구간의 데이터만 필요하기 때문이다. 이렇게 찾아진, 일정한 신호를 갖는 터치 구간들의 데이터는 각 터치의 무게중심 값, 즉 패널에서의 위치를 계산하는 데에 사용되고, 이 좌표값들이 ideal한 좌표와 얼마나 근접한지 테스트를 하는데에 사용된다.
선택한 해결 방안
주어진 데이터를 파싱해 피크 사이들의 최소 거리를 만족하는 모든 피크들을 찾고, 찾아낸 피크 사이들의 중요도를 확인해 대략 비슷한 개수의 원하는 점들(피크들)을 찾는다. 잘걸러낸 이 피크들에 대해서, 각 피크를 갖는 구간의 너비를 통해 contact, release 지점을 구한다.
등간격으로 점을 찍는 데이터에 한정, 마주한 문제 1
중요도를 통해서 피크들을 걸러낼 때, 실제 missing된 터치들이 있을 경우 터치가 아닌 곳의 피크도 터치로 인식한다.
선택한 해결 방안
양쪽의 피크 크기와 비교했을 때 너무 심하게 작은 피크는 노이즈라고 판단한다.
등간격으로 점을 찍는 데이터에 한정, 마주한 문제 2
엣지의 몇 개의 라인들을 빼고 터치 정보를 받아보고 싶다는 요구 사항이 추가되었다.
이제까지 모든 터치들은 (contact index, release index)의 형태로 pointsInfo라는 list에 append 되어왔기 때문에 우리는 missing 된 터치의 총개수는 알 수 있지만, 어디에서 어떻게 missing 된 지는 모르는 상태였다.
터치들이 missing 되지 않았을 경우에는 crop에 문제가 없지만, missing이 발생했을 경우, 우리는 이게 어느 위치에서 missing 되었는지를 알아야 crop을 할 수 있었다. (제대로 피크/터치를 찾았는지 validate 하기 위해서도 각 터치의 위치를 아는 것은 필요한 일이었다.)
터치가 missing 될 수 있는 경우는 아래와 같다.
1. 신호의 크기가 너무 작아서 detect가 안 되는 경우 (주로 기울여서 터치를 하면 엣지에서 이런 일이 발생, 노이즈와 분간하기 어려움)
2. 데이터의 이가 빠졌을 경우
어떤 이유로든 missing이 되었거나 신호가 너무 불안정하면 데이터 자체를 믿을 수 없으니 애초에 엣지를 제외하고 파싱을 하고 싶은 것이다. (e.g., 왼쪽/오른쪽 엣지 두 라인은 빼고 parsing, 위/아래 엣지 두 라인은 빼고 parsing 이런 parameter을 설정하고 싶은 것)
점들의 위치를 알려면 점들이, 라인 바이 라인으로, 총 height 개수의 row들로 나누어야 하고 각 row는, 총 width 개수의 column들로 나누어야 한다. (width = 69, height = 157 —> 각 69개의 점을 갖는 157개의 라인으로 나누어져야 함)
한 row에서의 missing 지점을 찾아내는 건 가능하다. 제일 근접한, 터치를 missing 하지 않은 2개의 row들의 정보를 참조해 판단할 수 있다. 문제는 row들을(height 개수만큼의 line들을) 어떻게 나눌 것인가?
엣지에 위치하기 때문에 line이 바뀌기 직전부터 바뀐 직후의 신호는 굉장히 작다. 뭘 기준으로 나눌 것인가? missing 되는 지점이 첫 번째 line(row)의 마지막 부분인지, 두 번째 line(row)의 첫 번째 부분인지 어떻게 알아낼 수 있는가?
해결 방안을 향한 과정
라인이 넘어갈 때 직전의 점과의 거리가 커지는데, 이 큰 차이값을 갖는 점이 width의 간격으로 나오지 않으면 이상함을 감지한다.
--> 이상함이 시작되는 시점은 구할 수 있어도, 그 이후에는 이미 messed up이다. 그 뒤에 나오는, 직전 점과의 큰 거리를 갖는 점이, 앞의 점이 missing 되었기 때문인지, line이 바뀌었기 때문인지를 확신할 방법이 없기 때문. 뭘 기준으로 판단할 수 있을까?
--> height 개수로 line을 분리해야 한다는 생각을 버린다. 중간 부분에서부터 위로, 아래로 따로 parsing 해나가면서, 이상함을 감지하면 그 전체 구간의 column validation을 진행한다.
위로 가면서 처음으로 이상함을 감지한 row의 마지막 index를 column validation reverse로 보내고, 그 index로부터 index 0까지 expected position을 확인해 나가면서 (missing일 경우 valid position으로 업데이트하면서) 전체 구간의 위치를 validate 한다.
아래로 가면서 처음으로 이상함을 감지한 row의 첫번째 index를 column validation으로 보내고, 그 index로부터 마지막 index까지 expected position을 확인해 나가면서 (missing 일 경우 valid position으로 업데이트하면서) 전체 구간의 위치를 validate 한다.
아직 문제가 좀 많은데, 다음 글에 이어서 마무리할 예정이다. 나는 진짜 똥몽총이다. 생각하는 것을 시작하려고 노력 중... ㅠ_ㅠ
스스로가 정리할겸, 진행 과정 로그라고 생각하고 썼는데, 가독성이 정말 안 좋은 것 같다. 추후에 심심할 때 실제 데이터 그래프와 코드를 추가해서 가독성을 높여보겠다.