[2023-04-04] 4. 초음파센서 ROS 패키지
초음파 센서를 위한 노드와 토픽
초음파 센서
- 장애물까지의 거리를 알려주는 센서
- 아두이노를 거쳐서 프로세서와 연결
- 초음파센서 노드의 역할은 둘 사이의 통신
초음파센서 토픽
- /xycar_ultrasonic 토픽
- data에 Int32 타입의 8개의 데이터가 담겨 있음
초음파 센서 ROS 패키지
- /xycar_ultrasonic 노드에서 발행하는 /xycar_ultrasonic 토픽을 이용
패키지 및 launch 디렉터리 만들기
$ catkin_create_pkg my_ultra std_msgs rospy
$ mkdir launch
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개 표시)
- rqt_graph
초음파 센서 ROS 패키지 제작
- 자이카에 있는 것을 사용하는 것이 아닌 초음파 센서와 아두이노 부품을 사용하여 직접 ROS 패키지를 제작
- 기능
- 초음파 센서를 제어하여 물체까지의 거리를 알아내고, 그 정보를 ROS 토픽으로 만들어 노드들에게 보냄
- 초음파센서, 아두이노 보드, 리눅스 ROS 시스템 필요
- 초음파센서 : 물체로 초음파를 쏘고 반사된 초음파 신호를 감지하는데, 처음 초음파를 쏜 시점과 반사파를 수신한 시점을 표시한 펄스(Pulse) 신호를 아두이노에게 전송
- 아두이노 : 초음파센서가 보내준 펄스신호를 받아 분석하는데, 두 시점의 시간차이를 이용하여 물체까지의 거리를 계산하고 ROS에 알려줌
- 리눅스 ROS : 아두이노가 보내준 물체까지의 거리정보를 사용하기 좋은 형태로 적절히 가공한 후 ROS 토픽에 담아 필요한 노드들에게 Publish 함
초음파센서 모듈
- 스펙
- 시그널
- Vcc : +극으로 센서 부품에 전력 공급 (DC 5V)
- GND : -극으로 회로의 그라운드에 연결
- Trig : 센서를 동작시키기 위한 트리거 시그널 (입력)
- Echo : 거리 측정 결과를 전달하기 위한 시그널 (출력)
-
초음파센서 동작 시나리오
- 시작 -> 초음파 발사와 수신 -> 시간차 출력
- 아두이노가 TRIG 핀에 시작명령(10us 동안 High 신호)을 내보냄
- 초음파센서가 40kHz 초음파펄스를 8개 만들어 물체로 보냄
- 물체에 반사된 초음파펄스가 되돌아가서 초음파센서에 수신
- 센서는 송신과 수신의 시간차에 비례하는 길이의 펄스를 Echo 핀으로 출력하여 아두이노로 전달
- 초음파센서를 이용한 거리 측정
- 소리의 속도 : 초속 340m (1cm 이동하는데 약 29us 소요)
- 송신과 수신의 시간차 = 초음파의 왕복 이동시간이므로
- 물체까지의 거리 = [송신과 수신의 시간차(us) / 2] /29us cm
아두이노
- 초음파센서가 보내주는 펄스신호를 받아 분석함
- 초음파를 쏜 시점과 반사파를 받은 시점의 시간차를 이용해서 물체까지의 거리를 계산하고 ROS에 알려줌
- 초음파센서와 아두이노 연결
- Vcc와 GND는 정해진 곳에 연결해야하지만 Trig와 Echo는 D(data)가 쓰여있는 아무 곳에 연결해도 됨
- 아두이노 핀 배치도
- 초음파센서가 아두이노의 어떤 핀에 연결되어있는지 확인
- 펌웨어에서 세팅 작업에 필요
-
아두이노 펌웨어 프로그래밍
-
Arduino IDE 설치
- ultrasonic_1_fw.ino 파일 작성
- PC에서 아두이노 연결
- 소스코드 컴파일 및 업로드
-
ROS
- 위 내용 참고