초음파 센서를 위한 노드와 토픽

초음파 센서

  • 장애물까지의 거리를 알려주는 센서
  • 아두이노를 거쳐서 프로세서와 연결
    • 초음파센서 노드의 역할은 둘 사이의 통신

image

초음파센서 토픽

  • /xycar_ultrasonic 토픽
    • data에 Int32 타입의 8개의 데이터가 담겨 있음

image

초음파 센서 ROS 패키지

  • /xycar_ultrasonic 노드에서 발행하는 /xycar_ultrasonic 토픽을 이용

image

패키지 및 launch 디렉터리 만들기

  • $ catkin_create_pkg my_ultra std_msgs rospy
  • $ mkdir launch

image

ultra_scan.py

  • 초음파센서로부터 주변 물체까지의 거리값을 받아 출력
#!/usr/bin/env python

import rospy
import time
from std_msgs.msg import Int32MultiArray

ultra_msg = None

def ultra_callback(data): # 초음파센서 토픽이 들어오면 실행되는 콜백함수 정의 
	global ultra_msg
	ultra_msg = data.data # data의 data부분을 ultra_msg에 저장

rospy.init_node("ultra_node") # ultra_node 이름의 노드 생성
rospy.Subscriber("xycar_ultrasonic", Int32MultiArray, ultra_callback) # xycar_ultrasoinc 토픽의 Int32MultiArray 타입 메시지를 수신하고 수신할 때 마다 ultra_callback 이름의 콜백함수 실행

while not rospy.is_shutdown(): # shutdown 되기 전까진 계속 돔
	if ultra_msg == None: # 처음에 메시지가 오지 않을 때 잠깐 기다림
		continue

	print(ultra_msg) 	# 초음파센서 데이터 출력
	
	time.sleep(0.5)

ultra_scan.launch

<launch>
    <node pkg="xycar_ultrasonic" type="xycar_ultrasonic.py" name="xycar_ultrasonic" output="screen" />
    <node pkg="my_ultra" type="ultra_scan.py" name="my_ultra" output="screen" />
</launch>

실행결과

  • 초음파 센서 8개의 거리정보를 표시함(사진에서는 5개가 장착되어 있어서 5개 표시)

image

  • rqt_graph

image

초음파 센서 ROS 패키지 제작

  • 자이카에 있는 것을 사용하는 것이 아닌 초음파 센서와 아두이노 부품을 사용하여 직접 ROS 패키지를 제작
  • 기능
    • 초음파 센서를 제어하여 물체까지의 거리를 알아내고, 그 정보를 ROS 토픽으로 만들어 노드들에게 보냄
  • 초음파센서, 아두이노 보드, 리눅스 ROS 시스템 필요
    • 초음파센서 : 물체로 초음파를 쏘고 반사된 초음파 신호를 감지하는데, 처음 초음파를 쏜 시점과 반사파를 수신한 시점을 표시한 펄스(Pulse) 신호를 아두이노에게 전송
    • 아두이노 : 초음파센서가 보내준 펄스신호를 받아 분석하는데, 두 시점의 시간차이를 이용하여 물체까지의 거리를 계산하고 ROS에 알려줌
    • 리눅스 ROS : 아두이노가 보내준 물체까지의 거리정보를 사용하기 좋은 형태로 적절히 가공한 후 ROS 토픽에 담아 필요한 노드들에게 Publish 함

image

초음파센서 모듈

  • 스펙

image

  • 시그널
    • Vcc : +극으로 센서 부품에 전력 공급 (DC 5V)
    • GND : -극으로 회로의 그라운드에 연결
    • Trig : 센서를 동작시키기 위한 트리거 시그널 (입력)
    • Echo : 거리 측정 결과를 전달하기 위한 시그널 (출력)

image

  • 초음파센서 동작 시나리오

    • 시작 -> 초음파 발사와 수신 -> 시간차 출력
    1. 아두이노가 TRIG 핀에 시작명령(10us 동안 High 신호)을 내보냄
    2. 초음파센서가 40kHz 초음파펄스를 8개 만들어 물체로 보냄
    3. 물체에 반사된 초음파펄스가 되돌아가서 초음파센서에 수신
    4. 센서는 송신과 수신의 시간차에 비례하는 길이의 펄스를 Echo 핀으로 출력하여 아두이노로 전달

image

  • 초음파센서를 이용한 거리 측정
    • 소리의 속도 : 초속 340m (1cm 이동하는데 약 29us 소요)
    • 송신과 수신의 시간차 = 초음파의 왕복 이동시간이므로
      • 물체까지의 거리 = [송신과 수신의 시간차(us) / 2] /29us cm

아두이노

  • 초음파센서가 보내주는 펄스신호를 받아 분석함
    • 초음파를 쏜 시점과 반사파를 받은 시점의 시간차를 이용해서 물체까지의 거리를 계산하고 ROS에 알려줌
  • 초음파센서와 아두이노 연결
    • Vcc와 GND는 정해진 곳에 연결해야하지만 Trig와 Echo는 D(data)가 쓰여있는 아무 곳에 연결해도 됨

image

  • 아두이노 핀 배치도
    • 초음파센서가 아두이노의 어떤 핀에 연결되어있는지 확인
    • 펌웨어에서 세팅 작업에 필요
  • 아두이노 펌웨어 프로그래밍

    1. Arduino IDE 설치

    2. ultrasonic_1_fw.ino 파일 작성
    3. PC에서 아두이노 연결
    4. 소스코드 컴파일 및 업로드

ROS

  • 위 내용 참고