ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • _ROS1_sensors & IMU
    ROS/ROS1 2023. 10. 24. 16:25

    자율주행 기술을 구현하기 위해 기본적으로 다음의 센서들을 사용한다.

    • Depth Camera
    • Mono Camera
    • Lidar
    • Rader
    • Ultrasonic
    • IMU(Inertial Measurement Unit)

    Mono Camera sensor

    단안 카메라 센서는 로봇에게 이미지 또는 영상데이터를 주며 받은 데이터를 OpenCV로 처리하여 차선을 인식하거나 물체를 검출하는 용도등 다양하게 사용할 수 있는 센서이다.

    전통적인 방법으로는 특징점을 추출하는 방법들이 있으며, 아직도 AI와 함께 사용되는 경우가 있다.

     

    Depth Camera sensor

    Depth카메라는 두 카메라에서 얻은 이미지를 사용하고, 두 이미지의 거리차를 계산하여 물체의 거리 데이터를 얻을 수 있다.

    출처: 한국 디지털 학회 논문지 (http://journal.dcs.or.kr/_common/do.php?a=full&b=12&bidx=2026&aidx=24583)

    대표적으로 Intel realsense, Kinetic sensor가 있다.

     

    Lidar sensor

    라이다 센서는 레이저를 쏴서 현재 위치로부터 주변 장애물들 사이의 거리를 측정할 수 있는 센서이다.

    대표적으로 Sick, Hokuyo, Yujin에서 개발되는 라이다가 있으며 2D, 3D Lidar가 나오고 최근에는 4D Lidar도 나오고 있다.

    2D sick lidar: LMS1xx

     

    Ultrasonic

    초음파 센서는 초음파를 이용하여 센서로부터 사물까지의 직선 거리를 측정한다.

    아두이노를 실습하면 대표적으로 HC-SR04라는 초음파 센서를 사용하는데 센서의 동작은 다음과 같다.

    1. 송신부에서 초음파 발사
    2. 초음파가 물체에서 반사
    3. 반사된 초음파가 수신부에서 감지
    4. 송신과 수신 사이의 시간 간격을 기준으로 물체 까지의 거리 계산

     

    IMU(Inertial Measurement Unit)

    관성 측정 장치로 불리며 가속도계, 회전속도계, 자력계의 조합을 사용하여 물체에 가해지는 힘, 회전 각속도 등을 측정하는 장치이다.

    주로 가속도, 자이로, 지자기 센서가 함께 내포되어있다.

    가속도 센서는 물체의 가속도(움직임)를 감지

    자이로 센서는 각속도를 감지하여 회전 움직임을 감지

    지자기 센서는 N극 방향을 감지하여 동서남북 방위각을 감지

     

    자이로 센서는 다음과 같이 roll, pitch, yaw 축을 사용하여 각 축의 회전을 감지한다.

    출처:  Aircraft flight dynamics wiki


    IMU 데이터 시각화

    이번에는 주어진 IMU 데이터 파일로 시각화를 진행하려고 한다.

    주어진 IMU 플러그인을 사용하고 새롭게 rviz_imu package를 만들어 사용하였다.

    $ catkin_create_pkg rviz_imu rospy tf geometry_msgs urdf rviz xacro

     

    - imu_3d.launch

    <launch>
        <node name="rviz_visualizer" pkg="rviz" type="rviz" required="true"
            args="-d $(find rviz_imu)/rviz/imu_3d.rviz"/>
        <node name="imu_generator" pkg="rviz_imu" type="imu_generator.py"/>
    </launch>

     

    - imu_generator.py

    #!/usr/bin/env python
    
    import rospy, math, os, rospkg
    from sensor_msgs.msg import Imu
    from tf.transformations import quaternion_from_euler
    
    degree2rad = float(math.pi)/float(180.0)
    rad2degree = float(180.0)/float(math.pi)
    
    rospy.init_node("imu_generator")
    
    pub = rospy.Publisher('imu', Imu, queue_size=1)
    data = []
    path = rospkg.RosPack().get_path('rviz_imu')+"/src/imu_data.txt"
    f = file(path, "r")
    lines = f.readlines()
    
    for line in lines:
        tmp = line.split(",")
        extract = []
        for i in tmp:
            extract.append(float(i.split(":")[1]))
        data.append(extract)
    
    imuMsg = Imu()
    imuMsg.header.frame_id = 'map'
    
    r = rospy.Rate(10)
    seq = 0
    
    for j in range(len(data)):
        msg_data = quaternion_from_euler(data[j][0], data[j][1], data[j][2])
    
        imuMsg.orientation.x = msg_data[0]
        imuMsg.orientation.y = msg_data[1]
        imuMsg.orientation.z = msg_data[2]
        imuMsg.orientation.w = msg_data[3]
    
        imuMsg.header.stamp = rospy.Time.now()
        imuMsg.header.seq   = seq
        seq = seq + 1
    
        pub.publish(imuMsg)
        r.sleep()

    기록된  imu_data.txt 파일을 불러와서 해당 파일의 데이터로 rviz를 시각화 하였다.

    결과

     

    'ROS > ROS1' 카테고리의 다른 글

    _ROS1_ultrasonic  (0) 2023.10.27
    _ROS1_Lidar  (0) 2023.10.24
    _ROS1_rviz  (1) 2023.10.23
    _ROS1_노드 실습(2)  (1) 2023.10.17
    _ROS1_노드 실습(1)  (0) 2023.10.17
Designed by Tistory.