April 18, 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

[65호]AI-Based Guide Robot System for the Blind

65 ict_ai based  (8)

2020 ICT 융합 프로젝트 공모전 장려상

AI-Based Guide Robot System for the Blind

글 | 동양미래대학교 김선우, 김문, 김재아, 최대원

 

1. 심사평
칩센 개발이 필요한 이유와 사전 정보에 대한 정리가 매우 깔끔하게 되어 있어 목표와 필요한 이유에 대하여 쉽게 이해가 됩니다. AI와 여러 환경에 대응이 가능할 무한궤도 구동 방안 등이 포함되어 있어 작품에 대한 사용자 편의성 또한 충분히 고려된 듯 합니다. 다만 이미 서비스가 제공되고 있는 AI 플래폼과 정형화된 물체(객체)만을 파악하는 형태로는 실생활의 변수를 모두 포함할 수 없다는 점은 고려되어야 할 것으로 보입니다. 이는 차량 ADAS 시스템 또는 무인 자동차 솔루션 조차도 아직도 완벽하지 않은 이유와 동일한 내용으로 볼 수 있습니다. 하드웨어뿐 아니라 소프트웨어 여러 기능 측면에 대한 심도 깊은 연구가 함께 진행되어야 할 것으로 보입니다. 최종 작품이 완성되지 않은 것으로 보여 작품 완성도의 배점 부분이 아쉽습니다.
펌테크 아이디어와 창의성을 갖춘 작품이라고 생각이 듭니다. 단 제출된 보고서 내용을 감안하자면 작품에 대한 기획의도는 우수하다고 생각되지만 계획에 대비해서 출품작의 일부 진행과정은 확인이되나 최종적인 완성도를 구체적으로 확인할 수가 없었습니다
위드로봇 수행한 내용에 비해 보고서 내용이 빈약합니다. 보고서가 좀 더 충실하면 좋은 점수를 받을 수 있었습니다.

2. 작품 개요
2.1. 기술개발 필요성
2.1.1. 사회적 문제
현재 대한민국에서 활동하고 있는 시각장애인 안내견의 수는 약 80마리, 외출할 때 주변 사람이나 보조 기구의 도움이 반드시 필요한 5급 이상의 장애등급을 판정받은 사람은 약 8만 명으로 안내견 수가 턱없이 부족한 편이다. 안내견 한 마리를 교육하고 훈련을 마치는데 필요한 기간은 약 2년, 훈련 기간 소요되는 비용은 약 1억으로 현실적으로 모든 시각장애인들이 안내견을 분양받는 것은 불가능하다. 또한 시각장애인 안내견을 분양받아도 분양 후에는 안내견을 돌보는 비용을 시각장애인 스스로 감당해야 하기 때문에 현실적으로 어려움을 가지고 있다.

2.2. 기술개발 목표와 내용
2.2.1. 기술개발 과제의 추진 목표
현재 대한민국에 주거하는 시각장애인들의 실외, 실내 활동을 하는 데 있어 제한을 최소화하고 삶의 질 향상을 추구하며 사회의 일원으로서 배제되지 않도록 하는 것을 기술개발 과제의 추진 목표로 한다.

2.2.2. 기술개발 내용
SoftWare
· 카메라를 통해 얻은 영상을 A.I가 내장된 LattePanda Alpha를 통해 약 11가지 객체(장애물) 인지 및 사용자 기준 물체의 방향 알림 역할 수행
· Image Processing, 3축 가속도센서를 사용하여 계단 패턴 분석 및 정확한 계단 및 연석 인지 기능 수행
· 스마트폰 GPS를 이용하여 사용자의 실시간 위치 정보를 Geocoder를 통해 경도와 위도로 변환하여 사용자의 위치를 인지
· 스마트폰에 내장된 GPS의 실시간 위치 정보, Web parsing 기술을 이용한 길 찾기 시스템 구축

HardWare
· Timing Belt Pulley를 이용한 무한궤도 메커니즘 설계를 통한 계단 극복

3. 작품 설명
3.1. 주요 동장 및 특징

65 ict_ai based  (1)

3.1.1. S/W
위험 요소 감지 및 음성 안내
· YOLO 알고리즘 기반의 YOLO V3 모델을 구현하여 주변 위험 요소 감지
· 주변 위험 요소 11가지의 위치 파악
웹파싱을 이용한 길 안내
· 네이버 지도 API를 사용하여 웹파싱 기술을 통해 가공하여 길 찾기 기능 구현
· 현재 GPS 위치 변화에 따른 음성 안내
Android studio Application 제작
· 스마트폰을 통해 사용자의 현재 위치, 길 안내, 장애물 인지 등 사용자에게 필요한 정보 제공
· 주변 사람들의 도움을 보다 편리하게 받을 수 있는 UI

상용 웹서버 Firebase를 활용한 데이터 통신
· 스마트폰에 내장되어 있는 GPS 값의 실시간 데이터를 웹서버에 uploading 하여 실시간 길 찾기 기능 구현
· A.I Device인 LattePanda Alpha를 통해 인지한 객체를 TTS(Text to Speech)를 통해 사용자에게 청각 알림

3.1.2. H/W
Main Device
· Raspberry Pi (MCU/MPU), Sensor(3-axis Acceleration, Ultrasonic), Cooling Fan, Speaker(SP-82557S), Timing Belt, Pully, Battery(Lipo 22.2V 5000mAh)
A.I Device
· LattePanda Alpha (MPU), Webcam(Logitech C930e)

3.2. 전체 시스템 구성 및 개발 환경
3.2.1. S/W
A.I
· Webcam을 이용해 촬영 후 LattePanda Alpha에서 연산
· AI YOLO v3 프로그램을 Python으로 구현하여 객체 인식
· LattePanda Alpha가 연산(YOLO v3)결과를 문자열로 재가공 후 Firebase에 결과 출력

65 ict_ai based  (2)
Stair Climing
· 3축 가속도센서(3-axis Acceleration) Roll Pitch 값에 따른 로봇의 Motor control
· Image Processing 기반 계단의 pattern 분석 및 정확한 계단 인지

65 ict_ai based  (3)

Application Functions
· 사용자 스마트폰에 내장된 GPS기반으로 실시간 사용자 위치(경도, 위도) 수신
· Google STT(Speech to Text)를 사용하여 사용자가 목적지를 음성으로 입력하면 Geocoder를 사용해 위도, 경도로 변환
· Google TTS(Text to Speech)를 사용하여 길 찾기 음성 안내, 장애물 발견 시 위험 요소 음성 안내
· 길 찾기 기능을 수행하기 위한 웹파싱 기능 구현
· ‘다음 맵’API 서비스를 이용하여 스마트폰 디스플레이에 map을 구현

65 ict_ai based  (4)

Application UI

· 주변 사람이 한 눈에 보고 도움을 주기 편한 UI로 제작
· 목적지까지의 방향, 실시간 현 위치, 장애물을 디스플레이에 표시하는 심플한 UI

65 ict_ai based  (5)

3.2.2. H/W
Harness
· 곡면 modeling을 통해 사용자에게 편안한 그립감을 줄 수 있는 외형 제작

65 ict_ai based  (1)

· 3D 프린터(PLA)를 사용해 장시간 들고 있어도 손에 무리가 가지 않도록 무게 최소화

4. 회로도
· 22.2V Lithium Polymer Battery 단일 전원
· Raspberry Pi 3 B+, Latte Panda, SZH-CH076, Fan 총 4개 소자에 공급되며, 각 소자의 정격 전압에 맞게 regulator를 사용

65 ict_ai based  (6)

5. 설계도면

65 ict_ai based  (7)

6. 소스코드

from sense_hat import SenseHat
import time
import imageprocessing_03 as stair
import MotorController_03 as motor
import cv2
import os
import RPi.GPIO as GPIO

## MOTOR config setting ##

# 모터 상태
STOP = 0
FORWARD = 1
BACKWORD = 2

# 모터 채널
CH1 = 0
CH2 = 1

# PIN 입출력 설정
OUTPUT = 1
INPUT = 0

# PIN 설정
HIGH = 1
LOW = 0

# 실제 핀 정의
#PWM PIN
ENA = 26 #37 pin
ENB = 0 #27 pin

#GPIO PIN
IN1 = 19 #35 pin
IN2 = 13 #33 pin
IN3 = 6 #31 pin
IN4 = 5 #29 pin
SW1 = 17 #13 pin
SW2 = 27 #15 pin
SW3 = 16
SW4 = 20

# 핀 설정 함수
def setPinConfig(EN, INA, INB):
GPIO.setup(EN, GPIO.OUT)
GPIO.setup(INA, GPIO.OUT)
GPIO.setup(INB, GPIO.OUT)
# 100khz 로 PWM 동작 시킴
pwm = GPIO.PWM(EN, 100)
# 우선 PWM 멈춤.
pwm.start(0)
return pwm

# 스위치 핀 함수
def setPinSwitch(SW1, SW2, SW3, SW4) :
GPIO.setwarnings(False)
GPIO.setup(SW1,GPIO.IN,GPIO.PUD_UP)
GPIO.setup(SW2,GPIO.IN,GPIO.PUD_UP)
GPIO.setup(SW3,GPIO.IN,GPIO.PUD_UP)
GPIO.setup(SW4,GPIO.IN,GPIO.PUD_UP)

# 모터 제어 함수
def setMotorContorl(pwm, INA, INB, speed, stat):

#모터 속도 제어 PWM
pwm.ChangeDutyCycle(speed)

if stat == FORWARD:
GPIO.output(INA, HIGH)
GPIO.output(INB, LOW)

#뒤로
elif stat == BACKWORD:
GPIO.output(INA, LOW)
GPIO.output(INB, HIGH)

#정지
elif stat == STOP:
GPIO.output(INA, LOW)
GPIO.output(INB, LOW)
# 모터 제어함수 간단하게 사용하기 위해 한번더 래핑(감쌈)
def setMotor(ch, speed, stat):
if ch == CH1:
#pwmA는 핀 설정 후 pwm 핸들을 리턴 받은 값이다.
setMotorContorl(pwmA, IN1, IN2, speed, stat)
else:
#pwmB는 핀 설정 후 pwm 핸들을 리턴 받은 값이다.
setMotorContorl(pwmB, IN3, IN4, speed, stat)

def RC():
if GPIO.input(SW1) == 0 : #forward

SPEED = 12 #LEFT MOTOR
SPEED1 = 12
setMotor(CH1, SPEED, FORWARD)
setMotor(CH2, SPEED1, BACKWORD)
print(“forward”)

elif GPIO.input(SW2) == 0 : #back

SPEED = 12 #LEFT MOTOR
SPEED1 = 12
setMotor(CH1, SPEED, BACKWORD)
setMotor(CH2, SPEED1, FORWARD)
print(“back”)

elif GPIO.input(SW3) == 0 : #LEFT
SPEED = 1 #LEFT MOTOR
SPEED1 = 15
setMotor(CH1, SPEED, FORWARD)
setMotor(CH2, SPEED1, BACKWORD)
print(“here”)
print(“left”)

elif GPIO.input(SW4) == 0 : #right
SPEED = 15 #LEFT MOTOR
SPEED1 = 1
setMotor(CH1, SPEED, FORWARD)
setMotor(CH2, SPEED1, BACKWORD)
print(“right”)

else :
setMotor(CH1, 0, STOP)
setMotor(CH2, 0, STOP)
print(“stop”)

###########################

def stair_detection():
while True:
print(‘in rc’)
RC() #..
i = 0
while i < 50 :
sense.get_orientation_degrees()['pitch'] i = i + 1

if stair_threshold <= sense.get_orientation_degrees()['pitch']:
print(“up stair”)
setMotor(CH1, 0, STOP)
setMotor(CH2, 0, STOP)
os.system(“sudo service uv4l_raspicam restart”)
os.system(“sudo dd if=/dev/video0 of=image.png bs=11M count=1″)

return stair.stair_detection()

elif sense.get_orientation_degrees()['pitch'] <= -stair_threshold :
print(“down stair”)
setMotor(CH1, 0, STOP)
setMotor(CH2, 0, STOP)
os.system(“sudo service uv4l_raspicam restart”)
# down stair sound

return ‘down’
if __name__ == “__main__” :
os.system(“sudo service uv4l_raspicam restart”)
sense = SenseHat()
stair_threshold = 15 # …
roll_threshold = 10 #

# GPIO 모드 설정
GPIO.setmode(GPIO.BCM)

#모터 핀 설정
#핀 설정후 PWM 핸들 얻어옴
pwmA = setPinConfig(ENA, IN1, IN2)
pwmB = setPinConfig(ENB, IN3, IN4)
setPinSwitch(SW1, SW2, SW3, SW4)

SPEED = 12
SPEED1 = 12

while True:
print(” ##### program start ##### “)

detection = stair_detection()

if detection == True: #up stair

print(‘up stair’)
#up stair sound mp3
while sense.get_orientation_degrees()['pitch'] > 3 :

if sense.get_orientation_degrees()['roll'] > roll_threshold:
setMotor(CH1, 10, FORWARD)
setMotor(CH2, 0, STOP)
print(‘left move’)

elif sense.get_orientation_degrees()['roll'] < -roll_threshold:
setMotor(CH1, 0, STOP)
setMotor(CH2, 10, BACKWORD)
print(‘rigth move’)
elif -roll_threshold < sense.get_orientation_degrees()['roll'] < roll_threshold:
setMotor(CH1, 13, FORWARD)
setMotor(CH2, 13, BACKWORD)
print(‘straight’)

elif detection == ‘down’ :

print(‘down stair’)
while sense.get_orientation_degrees()['pitch'] < -3 :

if sense.get_orientation_degrees()['roll'] > roll_threshold:
setMotor(CH1, 0, STOP)
setMotor(CH2, 13, BACKWORD)
print(‘right move’)

elif sense.get_orientation_degrees()['roll'] < -roll_threshold:
setMotor(CH1, 13, FORWARD)
setMotor(CH2, 0, STOP)
print(‘left move’)
elif -roll_threshold < sense.get_orientation_degrees()['roll'] < roll_threshold:
setMotor(CH1, 10, FORWARD)
setMotor(CH2, 10, BACKWORD)
print(‘straight’)

elif detection == False : #wall or 1 stair

print(“wall”)
setMotor(CH1, 0, STOP)
setMotor(CH2, 0, STOP)

GPIO.cleanup()

 

6. 완성이미지

65 ict_ai based  (2) 65 ict_ai based  (3)

7. 참고문헌
· 김윤구 김진욱 논문「도심지형 최적주행을 위한 휠·무한궤도 하이브리드형 모바일 로봇 플랫폼 및 메커니즘」, 로봇학회 논문지 제5권 제3호, 2010
· 박동일 임성균 곽윤근 논문「계단등반을 위한 가변형 단일 트랙 메커니즘 해석」, 대한기계학회 춘추학술대회, 2005.5
· 김의중 저「인공지능, 머신러닝, 딥러닝 입문」, 위키북스, 2016
· 알 스웨이가트 저, 트랜지스터팩토리 역「파이썬프로그래밍으로 지루한 작업 자동화하기」, 스포트라잇북, 2013
· Sam Abrahams Danijar Hafner Erik Erwitt Ariel Scarpinelli 공저, 정기철 역「엣지있게 설명한 텐서플로우」홍콩과학출판사, 2017
· 아담 스트라우드 저, 오세봉 김기환 역 「안드로이드 데이터베이스」, 에이콘, 2017
· http://kpat.kipris.or.kr/kpat/biblioa.do?method=biblioFrame (특허청에 등재된 유사 기술 검색)

 

Leave A Comment

*