[ROS2] YDLiDAR TG50 연결하여 정보 받아오기

YJ·2024년 6월 15일

ROS2

목록 보기
9/9

ubuntu 22.04, ROS2 humble을 기준으로 작성하였습니다.

오늘은 YDLidar TG50을 통해 scan 정보를 받아오고, 그 정보가 무엇을 의미하는지 확인하고, 가시화하는 과정을 거쳐보도록 하겠다.

드라이버 설치 및 연결

ydlidar-SDK 설치

우선 ydlidar-SDK를 설치해야 한다. 찾기 쉽게 그냥 home에 설치하도록 하자.
다음 코드를 입력하면 ydlidar-SDK를 설치할 수 있다.

cd && git clone https://github.com/YDLIDAR/YDLidar-SDK.git
cd ~/YDLidar-SDK/cmake
cmake ..
make
sudo make install
sudo apt-get install python swig # humble에선 안됨
sudo apt-get install python-pip
cd .. && pip install .

ydlidar-SDK github을 clone하고(github id + 연결 필요), cmake로 build하는 과정이다.

ydlidar-driver 설치

mkdir -p my_ws/src
cd my_ws/src
git clone -b humble https://github.com/YDLIDAR/ydlidar_ros2_driver.git
cd .. && colcon build --symlink-install

사용할 workspace의 src에서 ydlidar_ros2_driver를 humble 버전으로 clone해준다.
pkg 파일을 받아온 것이므로 workspace에서 build해주면 사용할 수 있다.

parameter 설정

cd ~/my_ws/src/ydlidar_ros2_driver/params

driver에 있는 params 폴더에서 parameter 파일을 자신의 모델에 맞게 설정해야한다.
ydlidar.yaml에 있는 값이 실제로 사용될 값이며, 여기에 자신의 모델에 맞는 parameter 파일을 복사해 넣으면 된다. 내가 사용할 TG.yaml 파일은 아래와 같다.

ydlidar_ros2_driver_node:
  ros__parameters:
    port: /dev/ttyUSB0
    frame_id: laser_frame
    ignore_array: ""
    baudrate: 512000
    lidar_type: 0
    device_type: 0
    sample_rate: 20
    abnormal_check_count: 4
    fixed_resolution: true
    reversion: true
    inverted: true
    auto_reconnect: true
    isSingleChannel: false
    intensity: false
    support_motor_dtr: false
    angle_max: 180.0
    angle_min: -180.0
    range_max: 50.0
    range_min: 0.01
    frequency: 10.0
    invalid_range_is_inf: false

이 param은 ydlidar가 보내는 데이터와 관련이 있는데, 중요한 값에 대해서는 뒤에서 설명하도록 하겠다.

create serial port alias

chmod 777 src/ydlidar_ros2_driver/startup/*
sudo sh src/ydlidar_ros2_driver/startup/initenv.sh

startup 디렉토리 안의 파일에 대한 권한을 허용하고, initenv.sh를 실행시킨다.
이는 드라이버를 초기화하고 설정하는 작업을 포함한다.

여기까지 하면 설치가 완료되었다.



실행하고 확인하기

연결하기


lidar의 선을 어댑터에 연결하고, 어댑터를 usb port를 이용해 컴퓨터와 연결하면 된다.

연결 확인은 lsusb 명령어로 한다.

연결 전후로 lsusb를 입력한 결과를 비교하면 된다.
연결한 후 005번 port에 Silicon Labs CP210x UART Bridge라는 장비가 연결되었다고 뜸을 확인할 수 있다.

ros launch를 이용해 실행하기

cd my_ws
. install/setup.bash
ros2 launch ydlidar_ros2_driver ydlidar_launch.py 

위와 같이 workspace에서 sourcing 후 launch하면 node를 실행시킬 수 있다.

[INFO] [ydlidar_ros2_driver_node-1]: process started with pid [3930]
[INFO] [static_transform_publisher-2]: process started with pid [3932]
[ydlidar_ros2_driver_node-1] [INFO] [1712976244.100225368] [ydlidar_ros2_driver_node]: [YDLIDAR INFO] Current ROS Driver Version: 1.0.1
[ydlidar_ros2_driver_node-1] 
[ydlidar_ros2_driver_node-1] [YDLIDAR] SDK initializing
[ydlidar_ros2_driver_node-1] [YDLIDAR] SDK has been initialized
[ydlidar_ros2_driver_node-1] [YDLIDAR] SDK Version: 1.2.4
[static_transform_publisher-2] [INFO] [1712976244.105728699] [static_tf_pub_laser]: Spinning until killed publishing transform from 'base_link' to 'laser_frame'
[ydlidar_ros2_driver_node-1] [YDLIDAR] Lidar successfully connected [/dev/ttyUSB0:512000]
[ydlidar_ros2_driver_node-1] [YDLIDAR] Lidar running correctly! The health status: good
[ydlidar_ros2_driver_node-1] [YDLIDAR] Baseplate device info
[ydlidar_ros2_driver_node-1] Firmware version: 2.1
[ydlidar_ros2_driver_node-1] Hardware version: 1
[ydlidar_ros2_driver_node-1] Model: TG50
[ydlidar_ros2_driver_node-1] Serial: 2023080200100009
[ydlidar_ros2_driver_node-1] [YDLIDAR] Get origin sample rate code: 20
[ydlidar_ros2_driver_node-1] [YDLIDAR] Get sample rate: 20.00K
[ydlidar_ros2_driver_node-1] [YDLIDAR] Current scan frequency: 10.00Hz
[ydlidar_ros2_driver_node-1] [YDLIDAR] Successfully obtained the corrected offset angle[-5.250000] from the lidar[2023080200100009]
[ydlidar_ros2_driver_node-1] [YDLIDAR] Lidar init success, Elapsed time 915 ms
[ydlidar_ros2_driver_node-1] [YDLIDAR] Create thread 0x66671700
[ydlidar_ros2_driver_node-1] [YDLIDAR] Successed to start scan mode, Elapsed time 2061 ms
[ydlidar_ros2_driver_node-1] [YDLIDAR] Fixed Size: 2020
[ydlidar_ros2_driver_node-1] [YDLIDAR] Sample Rate: 20.00K
[ydlidar_ros2_driver_node-1] [YDLIDAR] Successed to check the lidar, Elapsed time 0 ms
[ydlidar_ros2_driver_node-1] [2024-04-13 11:44:07][info] [YDLIDAR] Now lidar is scanning...

마지막의 Now lidar is scanning...이 뜨면 scan이 성공적으로 되고 있는 것이다.

RVIZ2로 확인하기

다른 터미널을 열고 RVIZ2를 입력한다.

왼쪽 아래의 ADD > BY TOPIC > Laserscan을 추가해 라이다가 보내는 topic을 받아오도록 한다.
fixedframe - laser_frame으로 설정하고 왼쪽의 laserscan topic에서 reliability policy를 best effort로 설정하면, laserscan을 받아올 수 있다.
(팁: File →save as config(또는 Ctrl + S) 하면 매번 설정할 필요 없음)

요리조리 움직이며 주변 scan을 잘 받아오는지 확인하자.



Laserscan 정보

라이다에서 받아오는 scan 값은 어떤 정보로 되어있는지 알아보자.


이렇게 ydlidar는 오른손 좌표계를 기준으로 하고, 연결선의 반대 부분이 0도이다.

0도가 되는 부분을 앞으로 가게 설치하면, -180~180도의 정보를 쉽게 가공할 수 있다.

frequency는 10hz,
sensor_msgs/laserscan 형식으로 받아온다. laserscan을 살펴보면

Header header            # timestamp in the header is the acquisition time of 
                         # the first ray in the scan.
                         #
                         # in frame frame_id, angles are measured around 
                         # the positive Z axis (counterclockwise, if Z is up)
                         # with zero angle being forward along the x axis
                         
float32 angle_min        # start angle of the scan [rad]
float32 angle_max        # end angle of the scan [rad]
float32 angle_increment  # angular distance between measurements [rad]

float32 time_increment   # time between measurements [seconds] - if your scanner
                         # is moving, this will be used in interpolating position
                         # of 3d points
float32 scan_time        # time between scans [seconds]

float32 range_min        # minimum range value [m]
float32 range_max        # maximum range value [m]

float32[] ranges         # range data [m] (Note: values < range_min or > range_max should be discarded)
float32[] intensities    # intensity data [device-specific units].  If your
                         # device does not provide intensities, please leave
                         # the array empty.

ydlidar TG50의 값은

angle_min: -180 [degree]

angle_max: 180 [degree]

angle_increment: 0.003[rad]

range_min = 0.01

range_max = 50.0

ranges: range_min부터 range_max까지 각을 angle_increment만큼씩 증가시키면서 그 각도에서 측정된 거리의 배열.

intensities: 그 각도에서 측정된 intensity, TG50에서는 intensity를 측정하지 않으므로 무의미한 값이다.
lidar가 다르다면 github에서 ydlidar를 검색해서 나오는 레포지토리에서 확인하면 된다.

2개의 댓글

comment-user-thumbnail
2025년 3월 18일

. install/setup.bash 이부분이 오류가 뜹니다

1개의 답글