Message 살펴보기 연습문제 정답
시행일·최종 수정일: 2026년 9월 1일
정답을 보기 전에
먼저 각 문제에 자신의 말로 답해본 뒤 해설과 비교해 보세요. 표현이 달라도 핵심 개념과 계산 과정이 맞으면 정답으로 볼 수 있습니다.
1. Topic 이름이 같고 Field 구조가 같아 보여도 서로 다른 Message Type이 연결되지 않는 이유는 무엇인가요?
정답과 해설
ROS Type 계약에는 Field뿐 아니라 Package와 Interface Type의 Identity가 포함됩니다. geometry_msgs/msg/Twist와 같은 구조의 Custom Type은 별도 Type Support를 가지므로 DDS Endpoint의 Type이 일치하지 않습니다.
2. .msg, .srv, .action의 구분자와 용도를 설명하세요.
정답과 해설
.msg는 하나의 Data 구조입니다. .srv는 --- 하나로 Request와 Response를, .action은 두 개로 Goal·Result·Feedback을 나눕니다. 각각 Topic Stream의 자료형, 짧은 요청·응답, 취소와 진행률이 필요한 장시간 작업에 사용합니다.
3. 고정 배열, 무제한 가변 배열과 상한 있는 가변 배열의 문법과 차이를 쓰세요.
정답과 해설
int32[5]는 항상 5개인 고정 배열, int32[]는 길이 제한 없는 가변 배열, int32[<=5]는 최대 5개인 가변 배열입니다. 상한은 Worst-case Memory와 Serialized Size를 계획하는 데 도움이 됩니다.
4. Message 상수와 일반 Field는 전송 관점에서 어떻게 다른가요?
정답과 해설
일반 Field 값은 Message Instance마다 저장되고 직렬화되어 전송됩니다. 상수는 생성된 Type에서 참조하는 고정값이며 Instance Payload에 매번 포함되는 Data Field가 아닙니다.
5. Header.stamp에 Callback 수신 시각을 넣으면 움직이는 Robot에서 어떤 문제가 생길 수 있나요?
정답과 해설
측정부터 수신까지의 지연이 숨겨집니다. TF2나 Sensor Fusion이 과거 측정치를 수신 시점의 Robot Pose로 변환하여 Scan·Point Cloud가 어긋나고 지도, Localization과 추정 결과가 흔들릴 수 있습니다.
6. frame_id가 비어 있거나 TF Tree와 다르면 어떤 증상이 나타날 수 있나요?
정답과 해설
Data의 기준 좌표계를 알 수 없거나 해당 Frame으로 변환할 경로가 없어 RViz 표시와 Sensor 변환이 실패합니다. 이름이 비슷해도 대소문자, 앞쪽 Slash와 Namespace가 다르면 다른 Frame입니다.
7. 처음 보는 /points Topic의 Type과 구조를 확인하는 명령 순서를 쓰세요.
정답과 해설
ros2 topic list -t 또는 ros2 topic type /points로 Type을 찾고, 그 결과를 ros2 interface show TYPE에 넣습니다. 이어서 ros2 topic info /points --verbose로 Endpoint·QoS를 확인합니다.
8. Image와 PointCloud2에서 전체 배열을 바로 echo하지 않아야 하는 이유와 대안을 설명하세요.
정답과 해설
거대한 data 배열 출력이 Terminal과 CLI에 부하를 주고 필요한 Metadata를 찾기 어렵게 합니다. --no-arr, --field header처럼 배열을 제외하거나 특정 Field만 한 번 확인합니다.
9. 사용자 Message Package에서 rosidl_default_generators와 rosidl_default_runtime은 각각 어떤 단계에 필요한가요?
정답과 해설
rosidl_default_generators는 Build 시 Interface로부터 언어별 Code와 Type Support를 생성하는 데 필요합니다. rosidl_default_runtime은 생성된 Interface를 실행·사용하는 Package에 필요한 Runtime 의존성입니다.
10. Build가 성공한 Custom Message를 새 Terminal에서 찾지 못할 때 가장 먼저 확인할 것은 무엇인가요?
정답과 해설
source ~/ros2_ws/install/setup.bash로 해당 Overlay를 Source했는지 확인합니다. 이어 Package가 실제 설치되었는지, Underlay·Overlay 순서와 새 Interface 변경 후 재Build 여부를 확인합니다.
11. Subscriber가 percentage와 Timestamp를 검증해야 하는 이유를 설명하세요.
정답과 해설
Type은 값의 의미와 신선도를 보장하지 않습니다. Percentage가 0~1 범위인지, NaN이 아닌지 확인하고 Timestamp로 오래됐거나 미래에서 온 Data를 거부해야 잘못된 Battery 판단과 위험한 운전을 막을 수 있습니다.
12. LaserScan의 ranges[i]에 대응하는 Beam Angle 계산식을 쓰세요.
정답과 해설
angle = angle_min + i × angle_increment입니다. 해당 Beam의 거리는 ranges[i]이며 사용 전에 Range 범위와 NaN·Infinity 처리 규칙을 확인합니다.
13. PointCloud2를 data 배열만 보고 해석할 수 없는 이유를 네 가지 Field와 함께 설명하세요.
정답과 해설
data는 Packed Byte 배열입니다. fields의 이름·Offset·Type·Count, Point 하나의 크기인 point_step, 행 크기인 row_step, Byte 순서인 is_bigendian을 함께 알아야 합니다. 검증된 Iterator나 sensor_msgs_py를 사용하는 편이 안전합니다.
14. 640×480 RGB8 Image를 30 Hz로 한 Remote Subscriber에게 보낼 때 Pixel Payload 대역폭을 계산하세요.
정답과 해설
한 Image는 640×480×3=921,600 byte입니다. 초당 27,648,000 byte, 즉 약 27.65 MB/s 또는 221.18 Mbit/s입니다. Header, 직렬화와 Network Protocol Overhead는 별도이므로 실제 사용량은 더 클 수 있습니다.
15. 실제 Robot의 Sensor Message를 이름·Type부터 Bag 기록까지 진단하는 순서를 설명하세요.
정답과 해설
Topic 이름과 Type을 확인하고 Interface 구조를 읽습니다. 다음 Endpoint·QoS, Metadata·값 범위, Stamp·Frame·Simulation Time, Hz·대역폭을 차례로 검사합니다. 마지막으로 Sensor와 /tf·/tf_static·/odom을 Bag에 함께 기록해 재현합니다.
학습 마무리
틀린 문제는 강의의 관련 장을 다시 읽고, 용어뿐 아니라 각 개념이 실제 로봇에서 어떤 역할을 하는지 설명해 보세요.