로보쌤

사용자 정의 인터페이스 연습문제 정답

시행일·최종 수정일: 2026년 9월 1일

정답을 보기 전에

먼저 각 문제에 자신의 말로 답해본 뒤 해설과 비교해 보세요. 표현이 달라도 핵심 개념과 계산 과정이 맞으면 정답으로 볼 수 있습니다.

← 강의와 연습문제로 돌아가기

1. 자신의 Robot에서 Custom Type으로 만든 항목 중 표준 Type으로 대체할 수 있는 것을 조사하세요.

정답과 해설

이동 속도는 geometry_msgs/msg/Twist, Laser는 sensor_msgs/msg/LaserScan, 주행 추정은 nav_msgs/msg/Odometry, Battery는 sensor_msgs/msg/BatteryState를 우선 검토합니다. Field 의미·단위·Frame이 같고 기존 Tool 연동 이점이 있으면 표준 Type을 선택합니다.

2. GripperCommand의 Field별 단위·범위·Unknown 의미 표를 작성하세요.

정답과 해설

position_m은 m와 기구 Stroke 범위, max_effort_n은 N와 허용 힘 범위, speed_mps는 m/s와 최대 속도를 명시합니다. Mode는 상수로 허용값을 제한하고 측정 불가·미설정 값은 별도 valid Field나 명시된 Sentinel 정책으로 표현합니다.

3. 무제한 Sequence를 Bounded Sequence로 바꿀 때 최대값을 정하는 근거를 작성하세요.

정답과 해설

Sensor·Protocol의 물리적 최대, 최악 실행 시간, DDS Fragmentation, Memory 예산과 실측 분포를 근거로 정합니다. 정상 Peak에 여유를 더하되 초과 시 거부·분할·요약 중 어떤 정책을 쓸지도 계약에 포함합니다.

4. my_robot_interfaces Package의 전체 Folder와 네 Interface File을 만드세요.

정답과 해설

my_robot_interfaces/ 아래에 CMakeLists.txt, package.xml, msg/GripperCommand.msg, msg/GripperState.msg, srv/SetGripperMode.srv, action/GraspObject.action을 둡니다. 실행 Node와 분리한 ament_cmake Interface 전용 Package로 관리합니다.

5. CMakeLists.txt와 package.xml의 rosidl·외부 Type 의존성을 설명하세요.

정답과 해설

CMakeLists.txt에서 find_package(rosidl_default_generators REQUIRED)와 외부 Message Package를 찾고 rosidl_generate_interfaces에 File과 DEPENDENCIES를 선언합니다. package.xml에는 Generator의 build_depend, Runtime의 exec_depend, 외부 Type 의존성과 member_of_group을 선언합니다.

6. Build 후 interface show, proto와 Python Import를 검증하세요.

정답과 해설

colcon build --packages-select my_robot_interfaces 후 Overlay를 source하고 ros2 interface show my_robot_interfaces/msg/GripperCommand, 지원 시 ros2 interface proto ...를 실행합니다. 이어 python3 -c 'from my_robot_interfaces.msg import GripperCommand; print(GripperCommand())'로 생성 Module을 확인합니다.

7. 격리 Topic에 Python Publisher와 Safe Subscriber를 실행하세요.

정답과 해설

실제 Driver와 분리된 /lab/gripper/command를 사용하고 Publisher는 범위 안의 작은 값만 보냅니다. Subscriber는 NaN·범위·Mode·Timestamp Age를 검증하고 실패하면 Actuator로 전달하지 않으며 이유를 Throttle Log로 남깁니다.

8. SetGripperMode Service Server·Client Test 계획을 작성하세요.

정답과 해설

정상 Mode, 지원하지 않는 Mode, Hardware Busy, Timeout과 중복 요청을 시험합니다. Response의 success와 reason을 확인하고 실패 시 상태가 바뀌지 않는지, 요청 재시도가 안전한지, CLI와 Program Client 모두에서 같은 계약을 지키는지 검증합니다.

9. GraspObject Action의 Goal 수락·Feedback·Cancel·Result 안전 조건을 정의하세요.

정답과 해설

범위와 장치 준비 상태를 통과한 Goal만 수락합니다. Feedback에는 단계·현재 위치·힘을 주기적으로 제공하고 Cancel 시 구동을 감속·정지한 뒤 canceled 처리합니다. Result는 성공 여부와 Error Code를 포함하며 Timeout·Sensor 이상·E-stop에서는 안전 상태를 먼저 확보합니다.

10. 같은 Interface를 사용하는 C++ Consumer를 Build하세요.

정답과 해설

find_package(my_robot_interfaces REQUIRED)ament_target_dependencies(target rclcpp my_robot_interfaces)를 선언합니다. 생성 Header를 include해 Type을 사용하고 Clean Workspace에서 colcon build --packages-select로 누락된 Dependency가 없는지 확인합니다.

11. Field 추가가 필요한 V2 Migration과 변환 Node 구조를 설계하세요.

정답과 해설

호환되지 않는 변경이면 V2 Type이나 Package를 새로 만들고 V1↔V2 변환 Node를 둡니다. 일정 기간 Dual Publish하며 Consumer 사용량을 관찰하고 Bag·Bridge·Dashboard를 차례로 전환한 뒤 Rollback 기준과 V1 종료 일정을 공개합니다.

12. 이전 Version으로 기록된 Bag을 보존·분석하는 절차를 작성하세요.

정답과 해설

Bag와 함께 Interface Package Commit·Release, ROS Distribution, RMW와 Recording Metadata를 보존합니다. 원본은 변경하지 않고 해당 Version 환경에서 읽거나 명시적 변환 Tool로 새 Bag을 생성하며 변환 Log와 Hash를 남깁니다.

13. 잘못된 Mode·NaN·오래된 Timestamp를 Subscriber가 거부하는 Test를 만드세요.

정답과 해설

허용 Mode 경계값과 범위 밖 Mode, 각 Floating Field의 NaN·Inf, 현재 시각보다 오래된 Stamp와 미래 Stamp를 Parameterized Test로 넣습니다. 거부 시 Driver 호출이 0회이고 Error Code·Log가 기대값인지 확인하며 정상 경계값은 통과해야 합니다.

14. Robot 열 대의 Interface Package Version을 검사하는 배포 Checklist를 작성하세요.

정답과 해설

각 Robot의 Package Version·Git Commit·Type Hash, Consumer Version과 Container Image Digest를 Inventory로 비교합니다. 배포 전 Compatibility Matrix, 전환 순서, Bag·Bridge 영향과 Rollback Image를 확인하고 혼합 Version 상태에서 연결·안전 Test를 수행합니다.

15. Clean CI에서 Build·Test·Consumer Import·Compatibility Review를 자동화하세요.

정답과 해설

빈 Workspace에서 rosdep 설치와 Interface Build를 수행하고 lint·경계값 Test를 실행합니다. Python Import와 C++ Sample Consumer Compile, 생성 Type 확인, 이전 Release 대비 Interface Diff를 자동화하며 호환성 변경은 명시적 Review와 Version 정책을 통과해야 Merge되게 합니다.

학습 마무리

틀린 문제는 강의의 관련 장을 다시 읽고, 용어뿐 아니라 각 개념이 실제 로봇에서 어떤 역할을 하는지 설명해 보세요.

← 강의로 돌아가기

사용자 정의 인터페이스 연습문제 정답과 해설 | 로보쌤