2016년 8월 25일 목요일

구부림 센서 다루기

구부림 센서(Flex Sensor)는 구부러지는 정도에 따라 저항이 달라지는 특성을 갖고 있는 부품입니다.

이 센서의 아두이노 회로는 다음과 같습니다.

구부림 센서는 2 pin만 가지고 있으므로 변화된 저항 값을 측정하려면 전압 분배 회로를 만들어야 합니다.

이 회로를 유니티에서 다룰려면 아두니티 Wire Editor에 다음과 같이 연결하면 됩니다.

위 정보를 아두이노 스케치로 Export하고 보드에 업로드하면 유니티에서 구부림 센서를 다룰 수 있는 준비가 끝납니다.
실제로 보드와 유니티를 연결하여 실험을 해보면 구부림 정도에 따라 AnalogInput 값이 달라지는 것을 확인할 수 있지만, 그 변화 값이 제멋대로여서 쓰기가 쉽지 않습니다.

InputFilter
측정된 센서 값이 불안정할 때 사용되는 것이 바로 InputFilter입니다.


InputFilter 사용법에 대해서는 빛 센서 다루기에 자세히 나와있으니 참고하시기 바랍니다.
AnalogInput과 InputFilter를 연결하면 다음과 같습니다.


3D 물체 구부리기
구부림 센서는 손가락 구부림을 통해 여러 장치를 제어하는 데이터 글로브(Data Glove)란 장치로 활용될 수 있습니다.
이런 아이디어를 실현하기 위해 3D 모델로 손가락 모양을 만든 후 구부림 정도에 따라 같이 움직이면 재미있는 효과를 만들어 낼 수 있습니다.
먼저 Cube를 3개 만들어서 손가락의 3 마디를 표현합니다.

이 모양을 위한 GameObject 구조는 다음과 같이 표현됩니다.

나중에 한번 깊게 내용을 다루겠지만, 다관절 구조의 3D 모델을 표현할 때는 모양을 나타내는 GameObject와 관절을 나타내는 GameObject를 분리해서 표현하는 것이 좋습니다. 그 이유는 모양을 표현할 때 Transform의 Scale을 조정하게 되는데, Scale이 1이 아닌 경우 Parent가 회전하면 Child가 일그러지는 문제가 발생하기 때문입니다.

입력되는 값을 회전 각도로 변환하기 위해서는 MappingInput을 이용하면 됩니다. 단 MappingInput은 손가락의 관절 별로 따로 만들어야 합니다.
그 이유는 손가락의 움직임을 잘 관찰해보면 구부러짐에 따라 각 관절의 꺾임 정도가 다른 것을 확인할 수 있습니다.
MappingInput을 통해 각도가 추출되면 이것을 RotationAxisReactor로 GameObject를 회전시키면 됩니다.


구부림 센서 활용 영상을 통해 이 결과를 확인하시기 바랍니다.


 

댓글 3개:

  1. joint를 사용한 손가락 모델은 어떻게 만든건가요??

    답글삭제
  2. 혹시 조언을 들을수 있을까 싶어 이렇게 댓글을 달아봅니다.

    지금 저같은 경우는 하이어라키 상으로

    MainCamara
    Directional Light
    Arduity
    Finger
    ㄴ Joint0
    Proximal Phalanx
    ㄴ Joint1
    Middle Phalanx
    ㄴJoint2
    Distal Phalanx

    이런식으로 구성되어있고, Ardunity객체에 Comm Serial스크립트와 Ardunity App 스크립트, Analog Input 스크립트가 추가되어있고,

    Finger객체에 Input Filter스크립트가 추가되어있으며
    각 조인트(Joint0,1,2)에 Mapping Input과 Rotation Axis Reactor스크립트가 추가되어있습니다.

    각 Rotation Axis Reactor 스크립트의 up Axis 는 z축, forwardAxis는 Y축을 기준으로 세팅해준 상태고, Mapping Input의 맵 커브도 세팅해준 상태입니다.
    sketch 익스포트를 통해 아두이노에 스케치를 업데이트 해 주었지만 연결을 하면
    손가락 모델이 전혀 동작을 안하고 있는 상황에 있습니다.

    혹시 제가 놓친것이 있는지 조언을 여쭙고 싶은데 방법이 있을까요?

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제