April 30, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[42호]제 6의 손가락 : 4절 링크를 이용한 수평 유지 로봇 SRF

2016 ictmain

2016 ICT 융합 프로젝트 공모전 우수상

제 6의 손가락 : 4절 링크를 이용한

수평 유지 로봇 SRF

(Supernumerary Robotic Finger)

 

글 | 고려대학교 최주헌

 

심사평

JK전자 기능적으로는 어느 정도 구현이 되었으니 힘이 있는 모터를 사용해서 조금 더 무거운 것을 올려도 균형을 잡을 수 있다면 인체에 부착하여 무거운 짐을 옮길 때 사용하면 편리하겠네요.
뉴티씨 균형 유지라는 매우 어려운 주제이지만, 누구나 쉽게 이해할 수 있도록 프로젝트를 구성하여 좋은 작품으로 평가된다. 알고리즘 등에 보다 집중하여 구현하고 설명을 한다면 더 좋은 작품이 될 것으로 보이며, 움직임이 보다 빠르게 구현될 수 있도록 하여, 빠른 움직임에서도 빠르게 대처될 수 있도록 개선하는 작업이 필요해 보이며, 앞으로 좀 더 연구하여 매우 훌륭한 작품을 만들기를 바라며, 좋은 점수를 받았다.

칩센 좋은 아이디어와 훌량한 완성도를 가지고 있다. 장애를 가진 사람에게도 도움이 될 아이디어 같다.

위드로봇 아이디어와 작품의 완성도가 무척 높습니다. 제어기를 좀 더 세심하게 설계하여 평판의 기울기 정도를 좀 더 잘 제어할 수 있으면 재미있는 상품이 나올 수 있을 것 같습니다.

작품 개요

42 ict 4절 링크를 이용한 (1)

전지와 MCU(Micro Controller Unit)의 소형화 추세에 따라 웨어러블 로봇이 각광받고 있다. 최근에는 “사람의 팔, 다리가 여러 개이면 어떨까?” 라는 아이디어에서 나온 여분의 신체부위 로봇 SRL(Supernumerary Robotic Limbs)이 개발되고 있다. 하지만 이러한 SRL은 사람의 의도를 파악하기 위해, 추가하고자 하는 신체부위에 많은 센서를 부착해야 하는 문제가 있다. 이 작품은 여분의 보조 손가락 SRF (Supernumerary Robotic Finger)를, 신체에 별도의 센서를 부착하지 않고도 신체 정보를 얻어 조절할 수 있다. SRF는 사람의 팔에 부착되어 쟁반과 같은 면적이 넓은 물체를 손으로 들 때, 물체가 균형을 잃지 않도록 보조해 주는 것을 목적으로 한다. 이때 필요한 신체 정보는 SRF End Point에 부착된 센서를 통해 4절링크 모델로 분석하여 얻어낸다. 제작한 SRF로 수평 유지 실험결과 수평 유지에 큰 도움을 주는 것을 확인하였다. 위 작품을 통해 로봇과 인간사이의 조화 연구에 새로운 접근 방향을 제시할 것으로 본다.

작품 설명
주요 동작 및 특징

42 ict 4절 링크를 이용한 (2)

본 작품은 쟁반과 같은 넓은 평면 물체의 균형을 잡아주는 여분의 보조 손가락(SRF) 웨어러블 로봇으로, 손목에 로봇이 부착된다. 로봇의 센서가 쟁반에 부착되어 쟁반의 지면과의 기울기를 측정하고 이에 따라 로봇의 서보 모터를 제어하여 쟁반의 균형을 유지한다. 본 작품은 기존의 SRF로봇들이 수행하는 물건을 잡는 기능이 아니라 물체의 균형을 잡는 새로운 기능을 시도하여 SRF 연구에 새로운 방안을 제시한다.

전체 시스템 구성

42 ict 4절 링크를 이용한 (3)

본 작품은 물체의 균형을 잡아주는 2개의 서보모터(AX-12)와 물체의 기울기를 측정하는 IMU 센서(EBIMU-9DOFV3), 이들의 상호작용을 일으키는 연결 Joint들, 모터 제어와 센서 값을 받아들이는 MCU(아두이노MEGA)로 구성된다. 이와 같은 로봇 디자인이 나오게 된 이유는 단계별 제작과정에 구체적으로 서술하였으며 작동방식은 첨부한 영상을 통해 보다 이해하기 쉽게 하였다.

SRF 전체 구성
SRF 로봇은 사람 손목에 부착되며 2개의 흡착판은 평면 물체에 부착된다. 각각의 서보 모터는 로봇과 부착된 물체의 Roll, Pitch를 조절하여 지면과의 수평을 조절할 수 있다. MCU는 IMU 센서 값에 측정되는 Roll Pitch 값을 받아들여 지평면과의 수평을 유지하도록 모터를 제어한다. 제어방식은 PID 제어 방식이며, 처음에 모터 각속도에 따른 평면 물체의 각속도 변화를 통해 사람 손가락과 로봇 End Point간의 거리를 측정, 제어 상수를 결정한다.
이러한 과정을 통해 SRF 로봇은 손가락에 별도의 센서를 부착하지 않고도 손의 위치를 파악하여 손위의 평면 물체 기울기를 유지할 수 있도록 보조해준다.

개발 환경(개발 언어, Tool, 사용 시스템 등)
· C언어를 이용하여 아두이노 MEGA 사용(아두이노 스케치)
· SRF 손목 부착 방식 (구버전)
· 서보모터와 IMU 센서는 시리얼통신을 이용

단계별 제작 과정
SRF 모델 설정
손위의 평판 기울기를 조절하기 위해서는 평판과 만나는 최소 3개의 점으로 평면이 필요하며, 3점 간의 거리를 조절하여 3차원 상의 기울기 Roll. Pitch, Yaw의 각도를 조절할 수 있다.
3차원 상에서 지면과 수평을 이루기 위해서는 평판과 지면 사이의 각이 전부 0이 되면 된다. 즉 수평면 사이의 각인 Roll, Pitch가 0이 되도록 3개의 점을 조절하면 된다. 그렇기에 손의 변화에 맞춰 Roll, Pitch 값이 0에 수렴하도록 SRF를 2자유도 모델로 설정하여 설계하였다.

42 ict 4절 링크를 이용한 (2)

위 모델을 통해 사람 손을 단순화 시켜보면 평판과접하는 5개의 손가락은 그림(Fig 1)처럼, 평판과 수평면 사이 각을 조절하는데 필요한 3개의 점 중 하나의 점으로 볼 수 있다. 이렇게 할 경우 손의 점을 기준으로 나머지 점 2개의 위치를 조절하여 손위의 평판과 수평면과 평행하게 조절할 수 있다. 본 작품은 이러한 모델을 통해 하드웨어 설계를 진행 하였다.

SRF 하드웨어 디자인
2자유도의 SRF는 2개의 서보모터(Dynamixel AX-12), 4개의 링크, 조인트, End Point로 구성되어 있으며 아래 그림(Fig 2)과 같은 형태로 설계하였으며 이에 따른 D-H 변수는 표 1과 같다.

42 ict 4절 링크를 이용한 (3)

42 ict 4절 링크를 이용한 (4)

이때 θ1과 θ1만 서보 모터를 이용하여 제어하도록 설계하였는데, 그 이유는 2차원 상에서 보았을 때 그림(Fig 3)의 형태처럼 손위의 평판과 SRF의 End Point로 결합할 경우 2자유도 모델이 되기 때문이다.
이때 SRF와 평판과 손의 관계가 4절 링크 형상을 띄기 때문에 이러한 관계를 이용하여 평판의 수평 조절을 제어할 수 있다. Joint 1은 End point와 함께 Universal Joint의 역할을 하여 Motor2 제어시 손목의 꺾임을 막는다. 평판의 수평 조절을 위해서는 손의 형상에 따른 임의로 주어진 평판 위 1개의 점을 통해 2개의 점을 조절하면 되기때문에, End Point 설계시 평판과 2점이 만나 부착될 수 있도록 하였다. 또한 End Point는 평판에 부착되어 평판의 Roll, Pitch 값과 End Point의 Roll, Pitch 값은 동일하기 때문에 End Point에 IMU Sensor를 부착하여 평판의 기울기 정보를 얻어내도록 하였다. (Fig 4)

42 ict 4절 링크를 이용한 (4)

이러한 설계를 통해 NX 3D모델링 프로그램과 3D프린터를 이용하여 제작한 SRF는 위 그림(Fig 5)과 같다. 부품 제작 과정은 아래에 기재하였다.

42 ict 4절 링크를 이용한 (5)

 

42 ict 4절 링크를 이용한 (5) 42 ict 4절 링크를 이용한 (6)

SRF 제어
설계한 SRF를 이용하여 평판이 수평을 유지하도록 하기 위해서는 End Point에 부착된 IMU 센서가 측정하는 Roll, Pitch 값을 0에 수렴하도록 모터 2개를 제어해야 한다. 각각의 모터는 Roll과 Pitch를 제어할 수 있는데 Motor1의 경우 그림(Fig 6.)처럼 Pitch 값을 제어할 수 있다.
SRF는 그림(Fig 7)처럼 팔에 부착되어 있으며 초록색 사각형은 모터, 노란색 원은 Revolute-joint를 의미한다. SRF의 링, 팔, 평판의 움직임은 4절 링크와 같기 때문에, 표 1. D-H변수를 사용하면 θ1을 통해 θ3와 θ5가 정해진다. θ1통해 IMU센서로 측정되는 Roll 값을 제어 할 수 있으므로 Pitch가 0이 되도록 Motor1을 PID 제어로 제어하였다.
하지만 θ1과 Pitch값을 조절하는 시스템이 일정하지 않고 손의 길이 a0 평판의 길이 a4에 따라 관계가 바뀌기 때문에 컨트롤러의 Kp, Ki, Kd 상수 값은 IMU로 측정되는 각속도 값과 θ1 사이의 관계를 통해 지속적으로 변화시키도록 하였으며 그 과정은 이와 같다.

42 ict 4절 링크를 이용한 (6)

4절 링크 관계식을 이용하기위한 링크 별 길이 정보는 표 2와 같으며 팔 길이 a0 손목에서 손까지의 일반적인 길이 20cm로 정하였다. 이때 손과 SRF 사이의 평판 길이 a4가 잡는 방식에 따라 변하기 때문에, w1이 일정할 경우 a4의 변화와 링크a1의 회전 상태인 θ1에 따른 각속도 w6의 값의 변화를 알아야 한다. 4절 링크 관계식으로 이를 계산하면 아래 그림(Fig 7)과 같이 선형적인 관계임을 볼 수 있다. 이를 통해 측정된 w6와 θ1값을 통하여 w4를 측정 할 수 있으며 이를 이용하여 Kp, Ki, Kd 상수 값을 변경 시킨다.

42 ict 4절 링크를 이용한 (7)

Pitch 값의 수평 제어 후 Roll의 수평 제어의 경우, Motor2의 회전축과 Roll의 회전축이 일치하여 Motor2의 움직임이 Roll 값의 변화와 같다. 이러한 선형적인 관계이므로 PID 제어를 통해 Roll 값이 0이 되도록 제어하였다. Motor2를 제어하면 그림(Fig. 8)과 같이 평판과 손 SRF 사이의 간격이 “r”로 일정하기 때문에 Motor2의 회전축이 변하게 되고 손목을 꺾게 된다.

42 ict 4절 링크를 이용한 (8)

그렇기 때문에 하드웨어 디자인에서 Joint 1을 넣어 End point와 함께 Universal Joint역할을 하게하여 손목 꺾임을 방지하였다. 대신 Motor2의 제어는 2D에서본 4절링크의 링크 길이를 변화시키기 때문에 평형에 맞추어진 Pitch 값에 변화를 주게 된다.
Motor2에 의한 Pitch 변화에 바로 반응하기 위해 그림(Fig. 9)와 같은 제어 시스템을 사용하였다.

42 ict 4절 링크를 이용한 (9)

SRF 성능 실험
로봇 설계 후 손의 위치 변화에 따른 평판의 각도 측정값은 다음과 같다.

42 ict 4절 링크를 이용한 (10)

외부에서 각도 변화가 주어졌을 때 SRF의 대응을 확인하기 위해, 일정한 주기로 평판을 변화시키며 이에 따른 SRF End Point 값을 측정한 결과. 그림(Fig 10, Fig 11)과 같이 SRF는 손의 움직임에 의한 평판의 진폭을 2배 이상 감소시키며 이를 통해 SRF의 목표인 수평 보조 기능을 잘 수행함을 확인할 수 있으며 충분히 빠른 시간에 반응하는 것을 확인할 수 있다.

결론
본 작품은 물체의 수평 유지를 목적으로 하는 SRF에 대한 것으로, SRF가 사용자의 의도를 파악하는 방식으로는 로봇과 신체를 하나의 기구학적 모형으로 해석하고 이로부터 신체 정보를 얻음으로써 신체에 별도의 센서를 부착하지 않고도 수평유지라는 목적을 달성하는 방법을 제시하였다.
이러한 방식의 SRF는 착용자에게 센서를 장착하는 대신 로봇 자체의 센서를 이용하기 때문에 착용자로부터 아무런 조건의 제한을 받지 않는다. 이 점을 이용하여 사람뿐만 아니라 향후 구조물 등에 부착되도록 하여 물체의 수평을 유지하는 역할을 수행할 수 있다. 또한 기존의 웨어러블 로봇의 인체 의도 파악 연구에 새로운 해결 방안을 제시하였다.

42 ict 4절 링크를 이용한 (7) 42 ict 4절 링크를 이용한 (8)

기타(회로도, 소스코드, 참고문헌 등)
회로도

42 ict 4절 링크를 이용한 (11)

소스코드

#define Roll_initial 512
#define Pitch_initial 512
#define Yaw_initial 512
#define Angle_MarginP 0.5
#define Angle_Margin 0.5
#define Kd 0.01 // D 제어
#define Ky 0.3 // Roll 제어에 따른 Pitch 제어
#define Ki 0.05 // i제어
#define Motor_Speed 1000
#define Speed_High 700
#define Speed_Low 300
#define Kp1 0.5
#define ID_Roll 8
#define ID_Pitch 4
#define ID_Yaw 2
int flag=1;
int sequence1 =1;
double Kp=2.5; // P제어
int sa=0;
double wr=0;
double wp=0;
char *str;
char *p;
int temp;
double fRoll;
double fPitch;
double Roll, Pitch, Yaw;
long Motor_R, Motor_P, Motor_Y;
double ip=0;
double ir=0;
double Time = 0;
double dt = 0.025;
double maxw=0;
void setup()
{
Serial.begin(115200); //Serial Monitor
Serial1.begin(1000000); // Serial for Motor
Serial2.begin(115200); // Serial for IMU

Motor_R = Roll_initial;
Motor_P = Pitch_initial;
Motor_Y = Yaw_initial;
sequence1 =1;
Motor(512,512, 512, 100);
delay(1000);
Motor(513,600,513, 100);
delay(10);
}void loop()
{
//시리얼 통신으로 IMU 센서값 받아들임
temp=Serial2.available();
if(temp>40)
{
char b[60]={0};
char c[60]={0};
for(int i=0; i<temp; i++)
{
b[i]=Serial2.read();
}
for(int i=0; i<temp; i++)
{
if(b[i]==42)
{
for(int j=i; j<temp; j++)
{
if(b[j]==13)
{
for(int k=0; k<j-i-1; k++)
{
c[k]=b[k+i+1];
}
break;
}
}
}
}
str = strtok_r(c,”,”,&p);
Roll = atof(str);
str = strtok_r(NULL,”,”,&p);
Pitch = atof(str);
Time += dt;

Serial.print(fRoll);
Serial.print(“,”);
Serial.print(fPitch);
Serial.print(“,”);
Serial.print(Time);
Serial.println();
//시간에 따른 IMU 센서값 출력
delay(10);
}else{
Serial.begin(115200); //Serial Monitor
Serial1.begin(1000000); // Serial for Motor
Serial2.begin(115200); // Serial for IMU
Serial.println(“Loop Start”);
}
//0값 노이즈 제거
if(Pitch!=0){
wp=(fPitch-Pitch)/0.03;
ip+=fPitch*0.03;
fPitch=Pitch;

}
if(Roll!=0){

wr=(fRoll-Roll)/0.03; //Rol 각속도 측정
Serial.print(“w is – “);
Serial.print(wr);
if(maxw<abs(wr)&&abs(wr)<100){ //초기 값 세팅에서 손가락 길이 알기위한 w가 측정 노이즈 보정위해 100이상은 무시
maxw=abs(wr);

}
Serial.print(“max w is – “);
Serial.print(maxw);
ip+=fRoll*0.03;

fRoll=Roll;
}
if(sequence1){ //전원 연결시 스캐닝과정 초기 Roll Pitch 값이 0이 되도록 단순제어
if (0<abs(maxw)&&abs(maxw)<25){//w값에 따른 Kp값 변경
Kp=3;
}else if(26<abs(maxw)&&abs(maxw)<50){
Kp=2,3;
}else if(51<abs(maxw)&&abs(maxw)){
Kp=1.7;
}
if (abs(fPitch) > Angle_MarginP)
{

if(Pitch > 0){
if(Motor_P<824){
Motor_P+=1;
}
}
else if(fPitch < 0)
{
if(Motor_P>200){

Motor_P-=1;

}
}
}

if (abs(fRoll) > Angle_Margin)
{

if(fRoll < 0){
if(Motor_R<700){

Motor_R+=3;

}
}
else if(fRoll > 0)
{
if(Motor_R>300){
Motor_R-=3;

}
}
}
Motor(Motor_R,Motor_Y, Motor_P, 100);

}else{

//스캐닝 후 PID 제어

if (abs(fPitch) > Angle_MarginP)
{
Motor_P+=wp*Kd+Ki*ip;
if(Pitch > 0){
if(Motor_P<824){
Motor_P+=abs(fPitch)*Kp1;
}
}
else if(fPitch < 0)
{
if(Motor_P>200){

Motor_P-=abs(fPitch)*Kp1;

}
}
Motor_R+=Ky*abs(fPitch);
}

if (abs(fRoll) > Angle_Margin)
{

if(fRoll < 0){
if(Motor_R<700){
Motor_R+=wr*Kd+ip*Ki;
Motor_R+=abs(fRoll)*Kp;

}
}
else if(fRoll > 0)
{
if(Motor_R>300){
Motor_R-=abs(fRoll)*Kp;
Motor_R+=wr*Kd+ip*Ki;
}
}
}
Motor(Motor_R,Motor_Y, Motor_P, Motor_Speed); //모터와 시리얼 통신
}
if((abs(fRoll)<Angle_MarginP)&&(abs(fPitch)<Angle_MarginP)){
sequence1=0;
Motor_Y-=1;

}
Serial.println (sequence1);
delay(15);
}
void Motor(unsigned int Pos_1, unsigned int Pos_2, unsigned int Pos_3, unsigned int Speed) //모터 시리얼 통신 함수
{ unsigned char Check_Sum;
int Num_Actuator = 3;
unsigned char ID_1 = 8;
unsigned char ID_2 = 2;
unsigned char ID_3 = 4;
unsigned char Length = 5*Num_Actuator+4;

Serial1.write(0xFF);
Serial1.write(0xFF);
Serial1.write(0xFE); //Broadcast ID
Serial1.write(Length); //Length
Serial1.write(0×83); //Instruction
Serial1.write(0x1E); //Address
Serial1.write(4); //Data Length

Serial1.write(ID_1);
Serial1.write(Pos_1);
Serial1.write(Pos_1>>8);
Serial1.write(Speed);
Serial1.write(Speed>>8);
Serial1.write(ID_2);
Serial1.write(Pos_2);
Serial1.write(Pos_2>>8);
Serial1.write(Speed);
Serial1.write(Speed>>8);
Serial1.write(ID_3);
Serial1.write(Pos_3);
Serial1.write(Pos_3>>8);
Serial1.write(Speed);
Serial1.write(Speed>>8);
Check_Sum = ~(0xFE + Length + 0×83 + 0x1E + 4 + (ID_1+ID_2+ID_3) + (Pos_1+Pos_2+Pos_3) + ((Pos_1>>8)+(Pos_2>>8)+(Pos_3>>8)) + 3*(Speed+(Speed>>8)));
Serial1.write(Check_Sum);
}

 

참고문헌
[1] C. Davenport, F. Parietti, and H. H. Asada, “Design and biomechanicalanalysis of supernumerary robotic limbs,” in ASME 2012 5th Annual Dynamic Systems and Control Conference joint with the JSME 2012. 11th Motion and Vibration Conference, pp. 787-793, 2012.
[2] Domenico Prattichizzo, Monica Malvezzi, Infan Hussain and Gionata Salvietti “The Sixth-Finger: a Modular Extra-Finger to Enhance Human Hand Capabilites”in The 23rd IEEE International Symposium on Robot and Human Interactive Communication 2014
[3] Arthur G.Erdman and George N.Sandor, Sridhar Kota Mechanism Design Analysis and Synthesis 4Edition, Prentice Hall

 

 

 

 

Leave A Comment

*