1. rebuilding workspace

우리가 최종적으로 만들 workspace의 구조는 다음과 같습니다.

~/seminar_ws/
├── src/
│   ├── seminar_camera/              # 센서 담당: 카메라 실행 + 캘리
│   │   ├── package.xml, setup.py
│   │   ├── config/
│   │   │   ├── ar0234.yaml
│   │   │   └── ar0234_calib.yaml
│   │   ├── launch/
│   │   │   └── camera.launch.py     # launch 파일만 둠
│   │   └── seminar_camera/
│   │       ├── __init__.py
│   │       └── cam_sub.py           # 디버그용 뷰어
│   │
│   ├── seminar_perception/          # YOLO 추론 노드 (새로 만듦)
│   │   ├── package.xml, setup.py
│   │   ├── config/yolo.yaml         # model_path, conf, imgsz, 토픽명
│   │   ├── launch/yolo.launch.py
│   │   ├── models/                  # 배포용 가중치 1개만 (best.pt / .onnx / .engine)
│   │   └── seminar_perception/
│   │       ├── __init__.py
│   │       └── yolo_node.py         # Image 구독 → Detection2DArray + 디버그 이미지 발행
│   │
│   └── seminar_bringup/             # 전체를 한 번에 띄우는 launch만 모아둠
│       └── launch/seminar.launch.py # camera + yolo include
│
├── training/                        # ROS 무관, COLCON_IGNORE
│   ├── datasets/gakmok_doll/
│   │   ├── images/{train,val}/
│   │   ├── labels/{train,val}/
│   │   └── data.yaml
│   ├── scripts/
│   │   ├── extract_frames.py        # bag → 이미지 추출
│   │   ├── split_dataset.py
│   │   ├── train.py
│   │   └── export.py                # onnx / TensorRT 변환
│   └── runs/                        # ultralytics 출력 (git 제외)
│
├── data/                            # 원본 데이터, COLCON_IGNORE
│   ├── bags/
│   └── calib_images/
└── .gitignore

주석을 잘 읽어보고 어떤 파일인지 파악하는게 중요합니다.

이번 차시에선 src 폴더 안을 수정할 예정입니다. seminar_camera는 5차시 그대로 사용합니다. seminar_perception은 yolo 추론 노드 입니다. 여기에는 yolo로 사물을 추론하는 노드 및 yolo 모델들을 담은 노드들입니다. yolo_node는 image를 구독하여 2d array를 감지하는 노드, models는 우리가 만들 모델, yolo.launch.py는 yolo를 실행하는 노드입니다. 기타 yaml같은 세팅할것들은 config에 넣습니다. training 폴더에는 데이터 셋들 및 사진 라벨들이 들어갑니다.

cd ~/seminar_ws
# 원본 데이터 / 학습 폴더
mkdir -p data/{bags,calib_images} training/{datasets/gakmok_doll/{images,labels}/{train,val},scripts,runs}
touch data/COLCON_IGNORE training/COLCON_IGNORE

# launch 폴더에 잘못 들어간 노드 파일 정리 (seminar_camera/seminar_camera/cam_sub.py가 원본인지 먼저 확인)
# rm src/seminar_camera/launch/cam_sub.py

# 새 패키지
cd src
ros2 pkg create seminar_perception --build-type ament_python \
  --dependencies rclpy sensor_msgs vision_msgs cv_bridge
ros2 pkg create seminar_bringup --build-type ament_python
mkdir -p seminar_perception/{config,launch,models} seminar_bringup/launch

# .gitignore
cd ~/seminar_ws
printf "build/\ninstall/\nlog/\ntraining/runs/\ntraining/datasets/\ndata/\n*.engine\n" > .gitignore

colcon build --symlink-install
  1. venv 가상 화면 시뮬레이션 + 세팅

ultralytics를 ROS 시스템 Python에 그냥 pip install하면 numpy 버전이 바뀌면서 cv_bridge가 깨지는 경우가 많다. 그래서 이렇게 나누어 진행합니다.

공통 설치

sudo apt install python3-venv python3-pip ros-humble-vision-msgs ros-humble-cv-bridge ros-humble-rqt-image-view
cd ~/seminar_ws
source /opt/ros/humble/setup.bash
python3 -m venv --system-site-packages .venv_ros
touch .venv_ros/COLCON_IGNORE
source .venv_ros/bin/activate
pip install -U pip

여기서 gpu 유무에 따라 갈린다. (nvidia-smi를 쳐서 표가 나오면 GPU 있음)

# GPU 없음
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
# GPU 있음
pip install torch torchvision

이후 공통설치를 이어 한다.

cd ~/seminar_ws
source /opt/ros/$ROS_DISTRO/setup.bash
python3 -m venv --system-site-packages .venv_ros
touch .venv_ros/COLCON_IGNORE          # ws 루트에 있으니 colcon이 뒤지지 않게
source .venv_ros/bin/activate
pip install -U pip
pip install "numpy<2" ultralytics      # Humble이면 numpy<2 고정 필수

# 한 번에 다 import 되는지 확인
python -c "import rclpy, cv_bridge, ultralytics, numpy; print('OK', numpy.__version__)"

1.x.x True(Gpu 있음)/False(없음) 뜨면 된다.

src/seminar_perception/setup.cfg 맨 아래에 추가: