센서 통신 프로토콜
이 섹션에서는 센서의 검출 데이터를 외부로 전송하기 위한 ROS, UDP와 같은 센서 통신 프로토콜 정보를 설명한다.
센서 종류 별로 지원하는 통신의 메시지 프로토콜 및 데이터 구조에 대해 설명한다.
Camera
시뮬레이터에서는 카메라 센서의 통신으로 ROS, UDP, Apollo 를 지원한다.
ROS
카메라 센서에서 전송하는 ROS 메시지의 프로토콜 정보는 아래와 같다.
Default Topic Name : /image_jpeg/compressed
Message: sensor_msgs/CompressedImage (sensor_msgs/CompressedImage Documentation)
FrameID : Camera
카메라의 Depth 이미지는 다른 GT 타입과 달리 ROS 메시지가 아래와 같다.
Default Topic Name : /image
Message: sensor_msgs/Image (http://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/Image.html)
FrameID : Camera
UDP
카메라 센서에서 전송하는 UDP 메시지 프로토콜 정보는 아래와 같다.
23.R1.0 에서는 카메라 센서의 UDP 패킷 구조가 아래와 같이 바뀌었다.
Timestamp (8 bytes) 정보 추가
Raw Image Data를 JPEG 압축하여 전송. 같은 Resolution이더라도 매번 Packet의 크기, 개수 변동이 생길 수 있음
JPEG Packet의 크기가 64987 Byte가 넘어가면 64987Byte씩 여러 Packet으로 나누어 전송
데이터 패킷 구조
카메라 센서 데이터를 전송하는 일반적인 UDP 패킷 구조는 아래와 같다.
Header (3byte) : Packet Header 값. “MOR”
Timestamp (8byte) : TotalSecond(4byte) + Nanosecond(4byte) 24.R1.0 UPDATE
Index (4byte) : 해당 Packet 내 JPEG Data Block의 순서
Size (4byte) : 해당 Packet 내 JPEG Data Block의 크기
Partial JPEG Data (가변, 최대 64,979byte) : JPEG 압축된 이미지의 일부 데이터 24.R1.0 UPDATE
Tail (2byte) : Packet의 Tail 값. “AI”. 마지막 Packet인 경우 “EI”
2D/3D BBox 데이터 패킷 구조
23.R1.0 에서는 카메라 센서의 2D/3D BBox 데이터를 UDP 전송 기능을 제공한다.
Traffic Light을 제외한 Vehicle, Pedestrian, Obstacle 객체에 대한 2D/3D BBox 데이터 정보가 하나의 UDP 패킷에 가 함께 전송된다.
해당 객체가 카메라 뷰에 존재하는 경우에만 송신된다.
ObjectX Data에 해당하는 Packet의 크기가 64987 Byte가 넘어가면 64987Byte씩 여러 Packet으로 전송

UDP Packet Field (총 (115 x N) + 13 byte)
Header (3byte) : Packet 데이터 종류 설명
“BOX” 로 고정 값
Timestamp (8byte) : TotalSecond(4byte) + Millisecond(4byte)
Index (4byte)
Size (4byte)
Object1 Data Block (96 + 16 + 3 = 115 byte) : Object 별 정보가 담긴 Block
3D BBOX (4x3x8 = 96 byte) : 3D BBOX의 8-point 코너값 출력
2D BBOX (4x4 = 16 byte) : 2D BBOX의 표현 값 출력
Class (3 byte) : 해당 Object의 Tag 정보
Tail (2byte) : Packet의 Tail 값. “EO”
2D LiDAR
시뮬레이터에서는 2D 라이다 센서의 통신으로 ROS, UDP를 지원한다.
ROS
설정 방법은 카메라와 동일하며 아래와 같은 메시지 프로토콜을 따른다.
Message Type : sensor_msgs/LaserScan (https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/LaserScan.html)
Default Topic Name : /lidar2D
FrameID : Lidar2D-1
UDP
2D LiDAR 에서 전송하는 UDP 메세지 프로토콜 정보는 아래와 같다.
2D LiDAR 센서 프로토콜은 각 제조사 별로 상이하다.
2D LiDAR를 전송하는 UDP 패킷 구조는 아래와 같다.
2D LiDAR Model
MORAI LiDAR
데이터 패킷 구조
MORAI LiDAR
Total Size : 1107 byte
Payload Size : 1080 byte
Name | Value | Type | Field | Len [byte] | Description | Units | ||
---|---|---|---|---|---|---|---|---|
1 | start_indicator | 0x23 | byte | 0 | 1 | “#” |
| |
2 | header_name | “2DLidar” | byte[7] | 1-7 | 7 |
|
| |
3 | doller_indicator | 0x24 | byte | 8 | 1 | “$” |
| |
4 | data_length | 1080 | uint32_t | 9-12 | 4 |
|
| |
5 |
aux_data | tx |
| float | 13-16 | 4 |
|
|
6 | ty |
| float | 17-20 | 4 |
|
| |
7 | heading |
| float | 21-24 | 4 |
|
| |
8 | Payload |
| byte[1080] | 25-1104 | 3 * 360 |
|
| |
9 | tail01 | 0x0D | byte | 1105 | 1 |
|
| |
10 | tail02 | 0x0A | byte | 1106 | 1 |
|
|
3D LiDAR
시뮬레이터에서는 3D 라이다 센서의 통신으로 ROS, UDP를 지원한다.
ROS
설정 방법은 카메라와 동일하며 아래와 같은 메시지 프로토콜을 따른다.
Message Type : sensor_msgs/PointCloud2 (https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/PointCloud2.html)
Default Topic Name : /lidar3D
Velodyne 공식 드라이버의 PointCloud2 정의와 동일
3D LiDAR ROS 데이터 수신 방법은 2가지가 있다. 24.R2.0 UPDATE
시뮬레이터에서 3D LiDAR을 설치 후, Sensor Network 를 ROS 로 설정하는 방법
시뮬레이터에서 3D LiDAR을 설치 후 Sensor Network 를 UDP 로 설정한 뒤, Velodyne pkg 를 이용해서 ROS 로 변환하는 방법
Velodyne_pointcloud 설치
$ sudo apt-get install ros-{$ROS_DISTRO}-velodyne
roslaunch 실행
VLP16인 경우
$roslaunch velodyne_pointcloud VLP16_points.launch
HDL32인 경우
$roslaunch velodyne_pointcloud 32e_points.launch
HDL64인 경우
$roslaunch velodyne_pointcloud 64e_S3.launch
3D LiDAR 설정 방법에 관련해서는 기존 Velodyne 공식 드라이버 대로 진행하되, HDL64에 한해서는 아래 Github링크 etc 폴더 내에 "64e_s3-xiesc.yaml" 파일을 사용한다.
HDL64 yaml 파일 24.R2.0 UPDATE
실행한 3D LiDAR의 pointcloud에 RPM값 입력하기 (예: HDL32)
roslaunch velodyne_pointcloud 32e_points.launch rpm:={RPM Value}
• {RPM Value} 는 설정한 Rotation Rate에 대응하는 값 입력
◦ RPM = Rotation Rate * 60e
◦ 예시) 5Hz 설정 시 → 300 입력
◦ RPM 미 입력 시 Default 값인 600 (10Hz)으로 설정됨
Veloview에서 RPM값 확인 시, Veloview의 버전에 따라 "No RPM" 현상이 발생할 수 있다. 24.R2.0 UPDATE
: 업데이트 된 Veloview 5.x 버전을 사용 시 RPM 값이 출력 되지 않을 수 있으나, Veloview 4.1.3 버전에서는 정상 출력 되는 것을 확인
UDP
시뮬레이터에 제공하는 3D LiDAR Protocol은 아래의 Velodyne의 Protocol을 그대로 따른다.

GPS
설정 방법은 카메라와 동일하며 아래와 같은 메시지 프로토콜을 따른다.
ROS
Message Type : morai_msgs/GPSMessage
Default Topic : /gps
타입 설명 : GPS 정보
UDP
설정 방법은 카메라 센서와 동일하며 아래와 같은 프로토콜을 따른다.


NMEA0183 Protocol을 따르고, RMC/GGA sentence 두 가지 format으로 동시에 들어온다.
Format Type(char): GPRMC/GPGGA. Format의 종류를 나타낸다.
Time(float) : GPS 정보가 들어올 때의 time stamp.
차량 위치 정보(Lat/Long/Alt, float) : GPS 센서에서 측정한 위도/경도/고도
IMU
ROS
설정 방법은 카메라와 동일하며 아래와 같은 메시지 프로토콜을 따른다.
Message Type : sensor_msgs/Imu (sensor_msgs/Imu Documentation (ros.org))
Default Topic : /Imu
타입 설명 : IMU 정보
UDP 24.R2.2 UPDATE
설정 방법은 카메라 센서와 동일하며 아래와 같은 프로토콜을 따른다.

UDP Packet Field (총 107 byte)
Header (9 byte) : Packet Header 값. “#IMUData$“
Size (4 byte) : 해당 Packet 내 IMU Data 의 크기 값. “80“
Aux Data(12 byte) : 추가 데이터 필드. 고정 값 “0”
IMU Data(32 + 24 + 24 = 80 byte) : IMU Data Block
Orientation (8 x 4 = 32 byte) : IMU Sensor 의 자세값. Quaternion으로 표현
Angular Velocity (8 x 3 = 24 byte) : IMU Sensor 의 각속도 값. (rad/s)
Linear Acceleration (8 x 3 = 24 byte) : IMU Sensor 의 선가속도 값. (m/s²)
Tail (2 byte) : Packet 의 Tail 값. “0x0D, 0x0A“
Radar
ROS
Message Type : morai_msgs/RadarDetections.msg
Default Topic : /radar
타입 설명 : radar정보
Header header
uint16 point_id
float32 x
float32 y
float32 z
float32 azimuth
float32 rangerate
float32 rcs
Radar(for RVIZ visualization)
Message Type : sensor_msgs/PointCloud
Default Topic : /radar
타입 설명 : radar pcd 정보