ROS(Robot Operating System)에서 라이다(LiDAR) 센서를 활용한 환경 인식 평가

Posted by

라이다(LiDAR) 센서는 빛을 이용해 주변 환경을 측정하는 기술이다. 이 센서는 로봇, 자율 주행 차량, 지형 측량 등 다양한 분야에서 활용되고 있다.

최근 평가를 위해 2D LiDAR 센서의 로그(Log)를 확보하였으며 확보한 데이터에는 LiDAR 센서의 정보와 주변을 인식한 정보를 포함하고 있다.

이번 포스트에서는 ROS(Robot Operating System)에서 LiDAR 데이터를 다루는 방법에 대해 알아보겠다.

ROS(Robot Operating System) 메시지 구조

ROS에서 LiDAR 데이터는 주로 sensor_msgs/LaserScan 메시지 형태로 전달된다. 이 메시지는 다음과 같은 필드로 구성된다:

  • header: 메시지의 메타데이터를 담고 있으며, 시퀀스 번호(seq), 타임스탬프(stamp), 그리고 좌표계(frame_id)를 포함한다.
  • angle_min, angle_max: 각도의 최소값과 최대값으로, LiDAR가 측정하는 범위를 나타낸다.
  • angle_increment: 각도 증가량으로, 연속적인 측정 사이의 각도 차이를 의미한다.
  • time_increment: 시간 증가량으로, 연속적인 측정 사이의 시간 간격을 나타낸다.
  • scan_time: 스캔에 걸린 총 시간이다.
  • range_min, range_max: 거리의 최소값과 최대값으로, LiDAR가 측정할 수 있는 범위를 나타낸다.
  • ranges: 실제 거리 측정값의 배열로, 각 요소는 angle_min부터 angle_max까지 angle_increment만큼 증가하는 각도에 해당하는 거리를 나타낸다.

다음은 ROS에서 확보한 LiDAR log의 header 부분이다.

header: 
  seq: 25149
  stamp: 
    secs: 1707806901
    nsecs: 342378000
  frame_id: "laser_frame"
angle_min: -3.1415927410125732
angle_max: 3.1415927410125732
angle_increment: 0.0034579995553940535
time_increment: 5.600645818049088e-05
scan_time: 0.10406000167131424
range_min: 0.10000000149011612
range_max: 25.0
ranges: [0.0, 1.0325000286102295, 1.034000039100647, ...]

위 로그를 기반으로 header 정보를 확인해보자.

  • 라이다 센서의 각도 범위는 -3.14라디안(약 -180도)부터 3.141라디안(약 180도)까지이다​​.
  • 각도 증가량은 0.00346라디안, 시간 증가량은 5.6e-05초이다​​.
  • 라이다 센서의 스캔 시간은 0.104초이다​​.
  • 센서의 최소 감지 거리는 0.1미터, 최대 감지 거리는 25.0미터이다​​.
  • ‘ranges’ 배열에는 라이다 센서가 각도별로 측정한 거리 값이 포함되어 있으며, 이를 통해 로봇이 주변 환경을 인식하고 있다​​.

ROS 메세지의 Python 시각화 코드

import matplotlib.pyplot as plt
import numpy as np

# 파일에서 LiDAR 데이터 로드
with open("Lidar_Data.txt", "r") as file:
    lines = file.readlines()
    angle_min = float(lines[6].split(": ")[1])
    angle_max = float(lines[7].split(": ")[1])
    angle_increment = float(lines[8].split(": ")[1])
    ranges = eval(lines[13].split(": ")[1])

# 각도와 거리를 기반으로 x, y 좌표 계산
angles = np.arange(angle_min, angle_max, angle_increment)
x = [r * np.cos(a) for r, a in zip(ranges, angles)]
y = [r * np.sin(a) for r, a in zip(ranges, angles)]

# 2D 스캔 시각화
plt.figure(figsize=(10, 10))
plt.plot(x, y, 'o')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('2D LiDAR Scan')
plt.grid(True)
plt.axis('equal')
plt.show()

ROS 메세지 시각화 결과

위 Python 코드를 활용하여 확보한 데이터를 시각화 하여 보았다. 360도 모든 방향에 대한 정보를 포함하고 있으며, 2D 데이터로 여러 벽과 통로를 포함한 곳에 있음이 확인 된다.

결론

라이다(LiDAR) 센서와 ROS(Robot Operating System)를 활용한 환경 인식 기술은 로봇과 자율 주행 차량의 개발에 있어 핵심적인 역할을 하고 있다. LiDAR 센서를 통해 주변 환경의 정밀한 데이터를 수집하고, ROS를 이용해 이 데이터를 처리하고 분석함으로써 로봇이나 차량이 주변 환경을 인식하고 안전하게 탐색할 수 있게 된다. 본 포스트에서 살펴본 바와 같이, ROS에서 LiDAR 데이터를 효과적으로 다루는 것은 로봇 공학과 자율 주행 기술의 발전에 있어 중요한 기반이 된다. 앞으로도 이러한 기술의 발전은 더욱 정교하고 안전한 로봇 및 자율 주행 시스템의 개발로 이어질 것으로 기대된다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다