2391007 인공지능학과 김민정 · 2391017 인공지능학과 이윤지
주차 슬롯 유형(일반/장애인 전용) 분류와 사용자 자격 기반 필터링을 자율 주행·주차 파이프라인에 통합한 ROS 2 시뮬레이션 프로젝트입니다. 실제 실행되는 노드는 autonomous_parking/autonomous_parking/*.py에 있으며, setup.py의 console_scripts로 빌드됩니다.
ROS 2 Humble,
ament_python, Python 노드,colcon build --symlink-install,source install/setup.bash흐름을 따릅니다. 현재 시뮬레이션 구현은gazebo_ros플러그인과parking_lot.world를 사용하는 Gazebo Classic 기반입니다.
| 항목 | 버전/방식 |
|---|---|
| OS | Ubuntu 22.04 |
| ROS | ROS 2 Humble |
| 빌드 시스템 | ament_python |
| 시뮬레이터 | Gazebo Classic (gazebo_ros) |
| Python | 3.10 |
| 비전 | YOLOv8 선택 사용, 없으면 YAML fallback |
IL/
├── autonomous_parking/
│ ├── autonomous_parking/
│ │ ├── parking_node.py # 상태 머신 기반 주차 컨트롤러
│ │ ├── vision_node.py # 카메라/라이다 기반 슬롯 상태 발행
│ │ └── decision_node.py # 사용자 자격 기반 슬롯 선택
│ ├── config/
│ │ └── slot_metadata.yaml # 슬롯 좌표, 유형, ROI, 초기 점유 상태
│ ├── launch/
│ │ ├── parking_sim.launch.py # Gazebo + 전체 파이프라인
│ │ └── world_only.launch.py # Gazebo 월드만 실행
│ ├── models/ # ego_hatchback, 주차 차량, 방지턱 모델
│ ├── worlds/
│ │ └── parking_lot.world
│ ├── media/ # ISA 마커 텍스처
│ ├── setup.py
│ └── package.xml
├── build/ # colcon 산출물
├── docs/
│ └── images/ # README 이미지
├── install/ # colcon 산출물
└── log/ # 빌드 로그
현재 실행 경로는 ros2 run autonomous_parking <node> 또는 parking_sim.launch.py입니다.
빌드 후 install/setup.bash를 소싱하는 흐름을 기준으로 합니다.
cd ~/IL
colcon build --symlink-install
source install/setup.bash전체 파이프라인 실행:
ros2 launch autonomous_parking parking_sim.launch.py실행하면 먼저 설정 GUI가 열리고, 일반 슬롯 주차 또는 장애인 전용 슬롯 우선 배정을 선택할 수 있습니다. GUI 없이 바로 실행하려면 show_config_gui:=false를 사용합니다.
GUI 없이 일반 슬롯 주차:
ros2 launch autonomous_parking parking_sim.launch.py \
show_config_gui:=false \
user_credential:=generalGUI 없이 장애인 전용 슬롯 우선 배정:
ros2 launch autonomous_parking parking_sim.launch.py \
show_config_gui:=false \
user_credential:=handicappedYOLOv8 모델 사용:
ros2 launch autonomous_parking parking_sim.launch.py \
yolo_model:=/path/to/best.ptGazebo 월드만 확인:
ros2 launch autonomous_parking world_only.launch.py| 인자 | 기본값 | 설명 |
|---|---|---|
user_credential |
general |
general 또는 handicapped |
yolo_model |
"" |
YOLOv8 .pt 경로. 비어 있으면 YAML 메타데이터 사용 |
show_config_gui |
true |
실행 전 설정 GUI 표시 여부 |
상태 머신으로 관측, 슬롯 접근, 후방 주차를 수행합니다.
INIT → ENTER_LOT → OBS_DRIVE → OBS_WAIT
→ LANE_DRIVE → TURN_TO_SLOT → X_ALIGN → PARK_REVERSE → DONE
| 상태 | 설명 |
|---|---|
INIT |
첫 odometry 수신 대기 |
ENTER_LOT |
진입점 (-10.5, 0.0)으로 이동 |
OBS_DRIVE |
관측 포인트로 이동 후 양쪽 카메라로 슬롯 스캔 |
OBS_WAIT |
vision/decision 결과 대기 |
LANE_DRIVE |
y=0 레인을 따라 목표 슬롯 x좌표까지 이동 |
TURN_TO_SLOT |
후진 주차를 위해 슬롯 반대 방향으로 회전 |
X_ALIGN |
슬롯 중심 x좌표와 진입 yaw가 허용 오차 안인지 확인 |
PARK_REVERSE |
linear.x < 0로 후진 진입, 방지턱 접촉 지점에서만 주차 완료 |
DONE |
정지 유지 |
| 방향 | 토픽 | 타입 |
|---|---|---|
| Subscribe | /ego/odom |
nav_msgs/Odometry |
| Subscribe | /ego/scan |
sensor_msgs/LaserScan |
| Subscribe | /parking/target_slot |
std_msgs/String |
| Subscribe | /parking/no_slot |
std_msgs/Bool |
| Publish | /ego/cmd_vel |
geometry_msgs/Twist |
| Publish | /parking/obs_trigger |
std_msgs/Bool |
관측 트리거를 받으면 슬롯 상태를 발행합니다. YOLOv8 모델이 있으면 LiDAR로 점유 여부를 갱신하고 ISA 마크를 감지하며, 모델이 없으면 slot_metadata.yaml의 슬롯 유형과 점유 상태를 그대로 사용합니다.
| 방향 | 토픽 | 타입 |
|---|---|---|
| Subscribe | /ego/camera/image_raw |
sensor_msgs/Image |
| Subscribe | /ego/camera_left/image_raw |
sensor_msgs/Image |
| Subscribe | /ego/camera_right/image_raw |
sensor_msgs/Image |
| Subscribe | /ego/scan |
sensor_msgs/LaserScan |
| Subscribe | /ego/odom |
nav_msgs/Odometry |
| Subscribe | /parking/obs_trigger |
std_msgs/Bool |
| Publish | /parking/slot_states |
std_msgs/String JSON |
/parking/slot_states를 받아 사용자 자격에 맞는 빈 슬롯을 선택합니다.
| 방향 | 토픽 | 타입 |
|---|---|---|
| Subscribe | /parking/slot_states |
std_msgs/String JSON |
| Publish | /parking/target_slot |
std_msgs/String |
| Publish | /parking/no_slot |
std_msgs/Bool |
선택 순서:
- 점유 슬롯 제외
general사용자는 장애인 전용 슬롯 제외handicapped사용자는 장애인 전용 슬롯 우선- 진입점
x=-10.5와 가까운 슬롯 선택
실행 중인 노드와 토픽 연결 관계는 rqt_graph로 확인할 수 있습니다.
source ~/IL/install/setup.bash
ros2 run rqt_graph rqt_graph그래프가 복잡하면 /rosout, /parameter_events 같은 시스템 토픽을 숨기고, Nodes only 옵션은 끄면 노드 사이에 어떤 토픽이 오가는지 보기 쉽습니다.
터미널에서 토픽만 확인할 때는 아래 명령을 사용합니다.
ros2 topic list
ros2 topic info /parking/target_slot
ros2 topic echo /parking/target_slotego_hatchback은 /ego/cmd_vel을 받는 planar 이동 차량 모델입니다. 후진 주차 단계에서는 parking_node가 linear.x < 0을 발행하고, Gazebo 플러그인이 이를 차량 기준 후진 속도로 적용합니다.
| 센서 | 위치 | 토픽 |
|---|---|---|
| 2D LiDAR | 지붕, 360도 | /ego/scan |
| 전방 카메라 | 전방, 하향 틸트 | /ego/camera/image_raw |
| 좌측 카메라 | 좌측면 | /ego/camera_left/image_raw |
| 우측 카메라 | 우측면 | /ego/camera_right/image_raw |
| IMU | 차체 중앙 | /ego/imu |
- 총 16개 슬롯: A1-A8, B1-B8
- 장애인 전용: A1, A2, B1, B2
- 일반: A3-A8, B3-B8
- 초기 점유: A4, A7, B3, B6
A1 A2 A3 A4 A5 A6 A7 A8
HC HC GN [GN] GN GN [GN] GN
←━━━━━━━━━━━━━━━ 레인 (y=0) ━━━━━━━━━━━━━━━→
HC HC [GN] GN GN [GN] GN GN
B1 B2 B3 B4 B5 B6 B7 B8
cd ~/IL
colcon build --symlink-install
source install/setup.bash
ros2 launch autonomous_parking parking_sim.launch.py user_credential:=generalros2 topic echo /ego/cmd_vel
ros2 topic echo /ego/odom
ros2 topic echo /parking/target_slotpkill -f gazebo
pkill -f gzserver
pkill -f gzclient- Yoonji Lee (yoonjileedev@gmail.com)
- Minjeong Kim (laputais@ewhain.net)
