RVIZ 기반 라이다 뷰어 제작

ROSBAG

  • 토픽을 구독하여 파일로 저장하거나, 파일에서 토픽을 꺼내 발행하는 기능

image

  • 사용법
    • $ rosbag record - O lidar_topic scan
    • $ rosbag play lidar_topic bag
  • launch 파일
<launch>
	<node name="rosbag_play" pkg="rosbag" type="play" output="screen" required="true" args="$(find rviz_lidar)/src/lidar_topic.bag" />
</launch>
  • /scan 토픽이 저장된 lidar_topic.bag 파일

image

Range 데이터를 발행해서 뷰어에 표시

  • 토픽 전달 흐름
  • Range 타입의 데이터를 담은 /scan1, scan2, /scan3, /scan4 4개의 토픽을 발행
  • RVIZ에서 원뿔 그림으로 Range 거리 정보를 시각화하여 표현

image

패키지 구성

image

  • 노드 이름 : lidar_range
  • 토픽 이름 : /scan1, /scan2, /scan3, /scan4
  • 메세지 타입 : Range(from sensor_msgs.msg import Range)

image

  • 4개의 publisher을 선언하고 모두 각각 다른 토픽 이름으로 발행하도록 lidar_range.py작성

image

  • 메시지 구조 확인
    • $ rosmsg show sensor_msgs/Range

image

파이썬 코드, launch xml, Rviz 파일 작성
  • lidar_range.py
#!/usr/bin/env python

import serial, time, rospy
from sensor_msgs.msg import Range # Range 임포트
from std_msgs.msg import Header # Header 임포트

rospy.init_node('lidar_range') # 노드 생성 

pub1 = rospy.Publisher('scan1', Range, queue_size = 1)
pub2 = rospy.Publisher('scan2', Range, queue_size = 1)
pub3 = rospy.Publisher('scan3', Range, queue_size = 1)
pub4 = rospy.Publisher('scan4', Range, queue_size = 1) # 4개의 토픽 발행 준비

msg = Range() # Range 정보 채우기 준비
h = Header() # Header 정보 채우기 준비
h.frame_id = "sensorXY" # Header 정보 채우기
msg.header = h 
msg.radiation_type = Range().ULTRASOUND
msg.min_range = 0.02
msg.max_range = 2.0	# Range 정보 채우기
msg.field_of_view = (30.0/180.0) * 3.14 # 원뿔 모양의 Range 표시에 필요한 정보 채우기

while not rospy.is_shutdown():
	msg.header.stamp = rospy.Time.now()

	msg.range = 0.4
	pub1.publish(msg)

	msg.range = 0.8
	pub2.publish(msg)

	msg.range = 1.2
	pub3.publish(msg)

	msg.range = 1.6
	pub4.publish(msg) # msg.range에 장애물까지의 거리를 미터(m) 단위로 넣고 토픽을 발행 
	
	time.sleep(0.2)
  • lidar_range.launch
<launch>
	<!-- rviz display-->
	<node name="rviz_visualizer" pkg="rviz" type="rviz" required="true" args="-d $(find rviz_lidar)/rviz/lidar_range.rviz" />
	
	<node name="lidar_range" pkg="rviz_lidar" type="lidar_range.py" />
</launch>
  • lidar_range.rviz
    • rviz 실행 후 lidar_range.rviz로 설정 저장
Range 뷰어 설정
  • Fixed Frame 설정
    • Publisher 노드에서 “sensorXY” 값으로 세팅했으므로 이걸 넣음

image

  • Range 뷰어 설정 : 플러그인 추가
    • RVIZ 우측 Displays 탭 하단에 Add 버튼을 클릭 후 By topic 탭에서 /scan 4개의 아래부분을 Range로 선택하고 확인

image

  • Range 뷰어 설정 : 토픽 이름 확인
    • Range 4개 설정 확인

image

  • Range 뷰어 설정 : 색상 지정

image

image

  • Range 뷰어 설정 : 표시 선택
    • 좌측 Displays 탭의 4개의 Range 중 시각화 할 토픽 선택
    • 4개를 모두 선택할 경우 겹쳐 표기되므로 확인이 어려움

image

  • RVIZ 창을 닫고 lidar_range.rviz로 파일 저장
토픽 발행 확인
  • $ rostipic list
  • $ rostopic echo scan1
    • 데이터가 실시간으로 잘 전송중인지 확인
    • field_of_view는 lidar_range.py에서 30도(1/6 파이)로 설정함 3.14/6 =0.5233..

image

rqt_graph

image