우리가 최종적으로 만들 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
ultralytics를 ROS 시스템 Python에 그냥 pip install하면 numpy 버전이 바뀌면서 cv_bridge가 깨지는 경우가 많다. 그래서 이렇게 나누어 진행합니다.
python3 -m venv --system-site-packages로 ROS 패키지를 보이게 한 venv, 또는 처음부터 ONNX/TensorRT로 변환해서 ultralytics 의존성 없이 돌리기공통 설치
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 맨 아래에 추가: