January 22, 2018

디바이스마트 미디어:

[33호]원격지 작업이 가능한 이동 로봇 팔 관리 시스템

2014 ict 메인

 

2015 ICT 융합 프로젝트 공모전 입선

원격지 작업이 가능한 이동 로봇 팔 관리 시스템

글 | 부경대학교 공영훈, 김준영, 김지수, 김민지, 김인준, 이동환

심사평

JK전자 이동을 하면서 섬세한 작업까지 가능한 이동형 로봇팔은 여러 분야에서 활용이 가능한 작품이다. 라즈베리파이에서 획득한 영상을 YUV형태 그대로 비 압축으로 영상을 전송하기 보다는 압축된 형태의 스트리밍으로 전송했다면 영상 전송의 프레임 속도가 조금 더 좋았을것 같다. 그리고 한가지 아쉬운 점이 로봇팔 제어를 위해 사용된 부품이 상용제품을 사용하여 약간은 쉽게 구현하였는데, 이 부분까지 직접 구현해 보았으면 좋았겠다.

뉴티씨 재난 상황에서 쓸 수 있는 원격제어 로봇팔은 매우 유용하게 사용될 수도 있다. 재난 상황이라는 것은 의도해서 생기는 상황이 아니므로, 언제든지 일어날 수 있다고 가정하고 대비하는 것이 필요하다. 하지만, 이러한 상황은 자주 일어나는 것이 아니라서, 해당 기술개발 등은 국가나 관련단체의 후원 없이는 개발되기 어려운 것이 현실이다. 하지만, 이번 작품은 이러한 상황에서 사용될 수 있는 로봇을 제작하였다. 다만, 현실적으로 사용된 로봇팔의 모터 등이 얼마나 내구성이 있으며, 방수나 화공약품 등을 방어하는 능력이 어느 정도인지는 의문이다. 현재 구하여 쓸 수 있는 모터 중에서 기능 구현을 위하여 사용한 것으로 생각되지만, 앞으로는 이러한 부분에서도 좀 더 고민하여 작품을 제작하였으면 하는 생각이 든다. 창의성과 실용성, 기술성, 작품완성도 등 다방면에서 높은 점수를 주었다.

칩센 원격을 이용하여 로봇을 조정한다는 점은 유용한 것으로 생각되나, 복합적인 기능을 하기에는 너무 한정적으로 되어 있다.

위드로봇 로봇팔을 원격에서 제어하기 위해 텔레 로보틱스 관점에서 마스터 제어기를 만들어 적용한 작품이다. 영상을 통해 로봇팔의 상황을 인지하여 조작하는 구조로 작성했지만, 실제 로봇팔이 놓인 상황을 모니터링 하려면, 현재 카메라 배치 및 제어 구조로는 어렵다. 그럼에도 불구하고, 마스터 제어기를 만들고, 이로부터 입력을 받아 동작하는 전체 시스템을 구현한 완성도에는 높은 점수를 준다.

작품개요

원격 제어는 로봇을 제어하기 위해 없어서는 안 될 한 분야이다. 원격제어는 우주탐사나 재해 현장과 같은 인간이 접근하기 힘든 위험한 환경에서 그 필요성이 부각된다. 따라서 이 작품은 기존의 산업이나 재해 현장에서 사용하던 로봇 팔의 역할을 그대로 수행하면서 한자리에 고정된 로봇이 아닌, 이동이 가능하며 원거리에서 사람이 영상을 보며 로봇 팔을 원격제어 할 수 있게 한다. 그리고 윈도우 Application을 제작해 로봇 팔에서 전송된 영상데이터를 확인하여 현재 상태를 체크하고 관리하는 시스템을 제작한다.

작품 설명

주요 동작 및 특징
이동용 로봇 팔
MCU : ATmega128
원격지 작업이 가능하기 위해서 주행 모드와 로봇 팔 임무수행 모드 2가지로 분류한다. 각 모드는 Embedded Board인 Raspberry Pi에게 명령을 받아서 동작한다. 원격지로 이동하기 위한 이동 수단으로 바퀴를 선택하였고 (주)디엔지위드 사의 RA-35GM 07TYPE의 DC모터를 사용하며, L298N모터 드라이버를 이용하여 모터를 구동한다. 임무수행을 위해 다이나믹셀로 만든 로봇 팔이 장착되어있다. 다이나믹셀은 로보티즈 사에서 제공되는 프레임을 통해서 모터를 로봇 팔의 형태로 조립하기 쉽고 UART를 이용하여 구동하기 때문에 모터의 제어가 쉬운 장점이 있다. 하드웨어적으로 데이지체인 형태로 연결되어 있다. 제품을 구입할 때 로보티즈사에서 제공하는 다이나믹셀 전용 controller cm-5가 있지만 우리는 cm-5를 대신하여 AVR ATmega128을 사용하여 데이터를 전송한다. 데이터를 전송하기 위해선 다이나믹셀만의 통신 패킷이 필요하다. 다이나믹셀의 데이터시트를 확인하여 그것만의 통신패킷을 구성한다. packet이란 주로 데이터 통신 분야에서 사용되는 용어로 특정의 형식으로 배열되어 있는 비트 열이다. 아래 그림은 다이나믹셀 전용 통신 패킷이고 아래 그림에서 표현하는 순서대로 packet의 역할을 할 배열을 구성한다.

33 ICT 원격지 (1)

33 ICT 원격지 (2)
위 그림과 같이 두개의 시작비트 0xff와 모터의 ID, packet의 길이, 다이나믹셀 전용 명령어, 모터의 각도와 속도 등의 명령어 그리고 마지막으로 check sum으로 배열을 구성한다. Check Sum은 배열에 담길 각 데이터들이 정상적으로 도착하였는지 수신부에서 확인하기 위해서 존재하는 것으로 각 회사마다 고유의 check sum 계산 공식이 있으며, 송신부에서 패킷을 전송하면 수신부는 수신 받은 데이터를 사용해 check sum 계산 공식에 대입하여 check sum을 계산해 수신 받은 데이터의 정확성을 확인한 뒤 모터를 구동한다. 각 instruction들은 데이터시트의 Control Table을 통해서 parameter들의 값을 확인할 수 있다. Instruction Set은 다이나믹셀 명령어 집합으로 한 개의 모터를 제어하는 명령어, 여러 개의 모터를 제어하는 명령어, 모터의 현재 상태를 받으려는 명령어, 모터의 기본설정을 바꾸는 명령어 등 다양한 명령어들로 구성되어있다. 그 중 우리가 사용한 명령어는 SYNC WRITE란 명령어로 ATmega128에 연결되어 있는 모터들에게 동시에 데이터를 전송해서 여러 모터를 구동한다. 일반 WRITE 명령어와 비교하였을 때 SYNC WRITE 명령어가 모터가 동시에 동작하게 하여 WRITE 명령어의 단점인 각 모터의 딜레이를 최대한 줄여줄 수 있다. Raspberry Pi와 ATmega128간에 모드 선택 시 사용한 통신은 i2c를 사용한다. i2c는 동기화 통신 방식으로 SCK선으로 동기시킬 클록이 이동하고, SDA선으로 데이터가 이동해야 한다. 데이터 송수신은 SDA선을 한 개 이용한다. 따라서 송수신간 데이터 충돌을 피하기 위한 일정한 프로토콜이 있고, ATmega128을 Slave로 선택하여 구동한다.

(2) Embedded Board : Raspberry Pi
Embedded Board 역할을 할 Raspberry Pi는 이더넷에 연결하고 UVC카메라에서 획득한 영상데이터를 윈도우 Application으로 전송하며 ATmega128의 모드 관리에 사용된다. Raspberry Pi를 사용한 이유는 영상 데이터를 획득하는 것과 이더넷을 이용하기에 ATmega128보다 편리하기 때문이다. 카메라의 영상을 획득하기 위해 먼저 V4L2에 접근한다. V4L2는 영상을 획득하기 위한 Linux 드라이버로 획득한 영상을 RGB형태로 배열에 담을 수 있다. 이더넷에 접근해 데이터를 주고받기 위해선 먼저 소켓 통신이 가능해야한다. 소켓 통신은 쉽게 말해 인터넷을 통해 데이터를 송, 수신하는 방법으로 tcp 소켓, udp 소켓 두 가지 통신이 존재한다. tcp 소켓 통신은 Server가 데이터를 송신하고 수신부에서 송신한 데이터를 수신하였는지 Server가 확인한 뒤 다음 데이터를 전송하고, udp 소켓 통신은 수신부가 데이터를 수신하였는지 Server가 확인하지 않고 계속해서 다음 데이터를 전송한다. udp에 비해 tcp가 안정적이지만 데이터 전송 속도는 udp가 더 빠르다. 우리는 영상데이터의 전송에서 속도 대신 안정성을 선택하였고, tcp 소켓 통신을 이용하여 영상을 전송한다. Udp 소켓 통신은 ATmega128의 모드 설정 시 사용한다. 카메라에서 획득한 영상이 tcp 소켓 통신을 이용하여 윈도우 Application으로 전송되면 사용자는 윈도우 Application에서 이동 형 로봇 팔의 현재 상태를 영상을 통해 확인할 수 있으며, 사용자가 현재 필요한 모드를 결정하고 모드 변경의 명령을 내리면 udp 소켓 통신을 통해 Raspberry Pi로 전달되고 전달된 명령은 Raspberry Pi에서 ATmega128로 i2c를 통해서 전송된다. i2c는 Raspberry Pi를 master로 설정하여 구동한다. tcp 소켓과 udp 소켓을 관리해주기 위해 각각을 하나의 쓰레드로 구성한다. 쓰레드는 실행분기를 나누는 것으로 하나의 프로세서가 여러 개의 실행 흐름을 가지기 위해서 사용된다.

33 ICT 원격지 (3)
위 그림과 같이 쓰레드 1은 영상데이터를 윈도우 Application으로 전송하는 역할 tcp 소켓으로 구성하고, 쓰레드 2는 윈도우 Application으로부터 방향에 대한 명령을 받은 후 i2c 통신을 통해 이동 로봇 팔로 전송하여 이동형 로봇 팔의 모드를 설정하며 udp 소켓으로 구성한다.

무선 컨트롤러

33 ICT 원격지 (2)

모형 로봇 팔은 포맥스를 통해서 로봇 팔을 조립한 형태의 비율로 축소해서 제작한다. 모형 로봇팔의 각 관절 부분은 가변 저항으로 구성한다.
가변저항의 ADC를 이동형 로봇 팔로 전송해서 모션을 제작할 수 있다. ADC 데이터를 무선 컨트롤러의 MCU에서 로봇 팔의 MCU로 전송할 땐 블루투스 통신을 사용한다. 제작된 모션은 EEPROM에 저장한다. EEPROM에 모션을 저장하고 반복 재생하게 하기 위해 각 가변저항의 ADC를 EEPROM에 저장해 두었다가 다시 불러오는 방법을 이용한다. 모션의 저장과 반복은 Push 버튼을 통해서 구현한다. 3개의 Push 버튼을 외부 인터럽트 핀에 연결하여 Push 버튼에서 발생한 신호를 외부 인터럽트 신호를 확인하여 각 버튼을 누름에 따라 모션의 저장, 반복, 리셋이 가능하게 하였다.

윈도우 Application
로봇 팔의 관리 시스템으로 동작할 윈도우 Application은 UI를 제작하고 쓰레드를 통해 tcp통신과 udp통신을 나누어 관리해주었다. 먼저 UI는 picture box와 button으로 구성하였다. 기본적인 UI구성은 아래와 같이 구성한다. 구성된 UI는 아래 그림을 통해 확인할 수 있다.

33 ICT 원격지 (3)
UI의 왼쪽 부분은 Raspberry Pi에서 획득한 영상을 소켓 통신을 통해 전송받은 뒤 출력하는 Picture Box부분이다. image 버튼을 클릭 할시 영상이 출력된다. 영상은 picture Box를 통해 지속적인 출력이 가능하며, 출력된 영상을 통해 사용자는 로봇팔의 현재 상태를 확인할 수 있고, 그에 따라 버튼을 통해서 주행 모드와 임무 수행 모드 두 가지 중 한 가지 모드를 선택하여 명령을 내릴 수 있다. 로봇 팔 모드 설정을 위해 먼저 mode start 버튼을 클릭한다. 그 뒤 중간 radio button으로 ‘drive mode’와 ‘mission mode’ 2가지가 있다. ‘drive mode’를 클릭하고, ‘mode change’ button을 클릭할 시 우측에 ‘go’, ‘stop’, ‘back’, ‘left’, ‘rigth’ 버튼을 통해 로봇의 이동 방향을 조절할 수 있다. ‘mission mode’를 클릭하고 ‘mode change’ 버튼을 클릭할 시 모형 로봇 팔을 통해서 로봇 팔을 제어할 수 있다. 아래는 ‘image’ 버튼을 클릭 시 Raspberry Pi에서 전송된 영상을 출력하고 있는 모습을 Capture 한 그림이다.

33 ICT 원격지 (4)

전체 시스템 구성

33 ICT 원격지 (5)

전체적으로보면 AVR ATmega128 2개를 사용하고 DC motor, Raspberry Pi 등의 제품들을 사용한다. 작품의 세부적인 흐름으로 블록도를 구성하면 아래 그림들과 같다.

33 ICT 원격지 (6)

모형 로봇 팔의 모션을 이동형 로봇 팔로 전달하고 메모리에 저장하는 것을 나타낸 블록도이다. 윈도우 어플리케이션에서 로봇팔의 모드를 임무수행으로 선택한다면 AVR2는 모형 로봇 팔을 구성하는 가변저항의 ADC를 블루투스를 이용하여 AVR1로 전달한다. AVR1은 전달받은 ADC를 로봇 팔의 각도 데이터로 변환하고 변환한 데이터를 UART를 이용하여 다이나믹셀로 전송하여 모형 로봇 팔의 모션을 이동 형 로봇 팔에서 그대로 따라할 수 있게 한다. 모션의 저장은 AVR2의 내부 EEPROM을 이용한다. 모형 로봇 팔의 ADC를 획득한 뒤 EEPROM에 저장하고 블루투스를 이용하여 로봇팔로 전송하는 순서로 모형 로봇 팔의 모션을 저장하고, 저장한 모션은 가변저항의 ADC는 무시하고 EEPROM에 저장된 ADC를 반복적으로 불러와 다이나믹셀로 전송하여 저장한 모션의 반복재생을 구현하였다.

33 ICT 원격지 (7)

윈도우 Application을 통해 로봇 팔을 관리하는 부분이다. 먼저 UVC camera를 통해 Raspberry Pi는 영상데이터를 획득하고 이더넷에 연결하여 윈도우 Application으로 영상데이터를 전달하는 모습을 볼 수 있다. 사용자는 수신한 영상을 토대로 로봇 팔의 현재 상황을 판단하고 목적지까지 도달하기 위해 주행하여야 하는지 목적지에 도달해서 임무수행이 가능한지를 판단할 수 있다. 목적지에 도달하였다면 임무수행 radio button을 선택하고 무선 컨트롤러로 로봇 팔을 제어하며, 주행 radio button 선택 시 윈도우 Application에서 조향에 관한 명령을 이더넷을 통해 Raspberry Pi로 전송하고, Raspberry Pi가 AVR에게 i2c를 이용해 전달하여 DC모터를 제어하는 모습을 볼 수 있다.

33 ICT 원격지 (8)

전체 블록도를 구성할 프레임 별로 나누어 보면 무선 컨트롤러의 역할을 할 프레임은 프레임1로 리모컨이란 이름을 붙여두었고, 이동형 로봇 팔의 프레임은 프레임2로 차량, 로봇팔이란 이름을 붙여두었다. 마지막으로 프레임은 아니지만 하나의 관리 서버 역할을 할 윈도우 Application을 하나의 프레임으로 구분해 주었다.

개발환경

33 ICT 원격지 (9)

단계별 제작 과정

모형 로봇팔, 이동형 로봇팔 납땜

33 ICT 원격지 (10)

이동형 로봇팔 제작

33 ICT 원격지 (11)

33 ICT 원격지 (12)

33 ICT 원격지 (13)

모형 로봇팔 제작

33 ICT 원격지 (14)

실험 사진

33 ICT 원격지 (15)

기타

회로도

33 ICT 원격지 (16)

33 ICT 원격지 (17) 33 ICT 원격지 (18)

33 ICT 원격지 (19)

33 ICT 원격지 (1)

소스코드

AVR

이동형 로봇팔

#include <iom128.h>
#include <ina90.h>
#include “Header/DcPid.h”
#include “Header/i2c_k.h”
#include “Header/dynamixel_k.h”
unsigned char PortCtrl = 0×00;
unsigned int SecFlag = 0, tim_count = 0;
unsigned int LeftObjectSpeed, RightObjectSpeed, LeftPresentSpeed, RightPresentSpeed;
unsigned int DutyA, DutyB;
unsigned int LeftEncoder = 0, RightEncoder = 0;
int RightOutput, LeftOutput, LeftBeforeError, RightBeforeError;
int LeftErrorSum = 0, RightErrorSum = 0;
int LeftError, RightError;
void StartDc(void)
{
if(twi_ch[2] == 1)//drive mode
{
BasicRobotArm();
PortCtrl = 0×00;
if(twi_ch[0] > 5)
{
LeftObjectSpeed = twi_ch[0] – 2;
PortCtrl |= 0×01;
}
else if (twi_ch[0] < 5)
{
LeftObjectSpeed = 8 – twi_ch[0];
PortCtrl |= 0×02;
}
else
{
LeftObjectSpeed = 0;
PortCtrl |= 0×01;
}

if(twi_ch[1] > 5)
{
RightObjectSpeed = twi_ch[1] – 2;
PortCtrl |= 0×04;
}
else if(twi_ch[1] < 5)
{
RightObjectSpeed = 8 – twi_ch[1];
PortCtrl |= 0×08;
}
else
{
RightObjectSpeed = 0;
PortCtrl |= 0×04;
}
}
else // mission perform mode
{
twi_ch[0] = 5;
twi_ch[1] = 5;
PortCtrl = 0×00;
}

if(SecFlag == 1)
{
__disable_interrupt();
LeftPresentSpeed = (LeftEncoder*312)/1000;
LeftError = LeftObjectSpeed – LeftPresentSpeed;

if(LeftError > 0)
{
/*LeftOutput = (58*LeftError)/100 + (500*(LeftError-LeftBeforeError))/100 + (10*LeftErrorSum)/100 ;*/
LeftOutput = (L_K_P*LeftError + L_K_D*(LeftError-LeftBeforeError)
+ L_K_I*LeftErrorSum)/SCALING_FACTOR;
DutyA += LeftOutput;
if(DutyA > 1000)
DutyA = 1000;
}
else if( LeftError < 0)
{
DutyA -= 5;
if(DutyA < 1)
DutyA = 0;

전체소스는 하단 pdf를 참고하시기 바랍니다.

참고문헌
· 열혈 TCP/IP 소켓 프로그래밍
· C# 5.0 프로그래밍
· 라즈베리파이
· AVR ATmega128 정복
· 닷넷 프로그래밍 정복
· 열혈 C프로그래밍

 

 

Leave A Comment

*