초음파 센서 장애물 감지 및 정차

패키지 생성

  • $ catkin_create_pkg ultra_drive std_msgs rospy
  • $ mkdir launch

image

파이썬 코드 및 launch 파일 작성

  • ultra_gostop.py
#!/usr/bin/env python

import rospy, time
from sensor_msgs.msg import Int32MultiArray
from xycar_msgs.msg import xycar_motor # Int32MultiArray, xycar_motor 메시지 사용 준비 

ultra_msg = None
motor_msg = xycar_motor() # 초음파센서 거리 정보를 담을 저장공간 준비

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

def drive_go(): # 자동차 전진
	global motor_msg, pub
	motor_msg.speed = 5
	motor_msg.angle = 0
	pub.publish(motor_msg)

def drive_stop(): # 자동차 정지
	global motor_msg, pub
	motor_msg.speed = 0
	motor_msg.angle = 0
	pub.publish(motor_msg)

rospy.init_node('ultra_driver')
rospy.Subscriber("xycar_ultrasonic", Int32MultiArray, callback, queue_size = 1)
pub = rospy.Publisher('xycar_motor', xycar_motor, queue_size = 1) # 노드 선언 & 구독과 발행할 토픽 선언

time.sleep(2) # 초음파 센서가 가동할 때까지 잠시 기다림 

while not rospy.is_shutdown(): 		
	if ultra_msg[2] > 0 and ultra_msg[2] < 10:
		drive_stop()
	else:
		drive_go()  # 전방 초음파 센서가 감지한 거리 정보가 0 < 거리 < 10cm 범위에 있으면 정차, 그보다 크면 전진 (거리값 0 : 무한대, 장애물이 없음을 의미)
  • ultra_gostop.launch
<launch>
	<include file="$(find xycar_motor)/launch/xycar_motor.launch" />
	<node name="xycar_ultra" pkg="xycar_ultrasonic" type="xycar_ultrasonic.py" output="screen" />
	<node name="ultra_driver" pkg="ultra_drive" type="ultra_gostop.py" output="screen" />
</launch>

실행

  • $ roslaunch ultra_drive ultra_gostop.launch

실행 결과

  • rqt_graph

image