๐ฃ 0. ์์ํ๊ธฐ ์ ์
ROS (Robot Operating System)๋ฅผ ํตํด 3D ์ฌ๊ตฌ์ฑ / ๊ฐ์ฒด ์ธ์ ๋ฑ์ ํ๊ธฐ ์ํ ์ฒซ๊ฑธ์์ผ๋ก
Ubuntu 20.04 + ROS Noetic + Realsense ์นด๋ฉ๋ผ + YOLO๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์๊ฐ ๊ฐ์ฒด ์ธ์๊น์ง ๊ฐ๋ ๊ณผ์ ์ ๊ธฐ๋กํ์ต๋๋ค.
๐ ๏ธ 1. ์ค๋น๋ ํ๊ฒฝ
- Ubuntu 20.04
- ROS Noetic ์ค์น
- ์ฌ์ฉ ์นด๋ฉ๋ผ: Realsense
- CUDA + cuDNN ์ค์น
๐งฉ 2. ์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
โ ๋ชฉํ
์นด๋ฉ๋ผ์ ๋ ์ฆ ์๊ณก ๋ณด์ ํ๊ธฐ โก๏ธ ์ ํํ 3D ์ฌ๊ตฌ์ฑ or ๋ฌผ์ฒด ํ์ง๋ฅผ ์ํด ํ์ํจ.
๐ ์งํ ์์
1. ์ฒด์ปค๋ณด๋ ์ถ๋ ฅ
- [์ฒด์ปค๋ณด๋ PDF ๋งํฌ]
- A4 ์ฉ์ง์ ์ฒด์ปค๋ณด๋ ํจํด ์ถ๋ ฅ
- A4์ฉ์ง์ 100% ๋น์จ(ํฌ๊ธฐ ์กฐ์ ์์ด)๋ก ์ธ์ํ๊ณ , ๋ฑ๋ฑํ ํ์ ๋ฑ์ ๋ถ์ธ๋ค.
- ๋ณดํต ๋ง์ด ์ฐ๋ ํจํด: 9x6 (์ฒด์คํ์ ๋ด๋ถ ์ฝ๋ ๊ธฐ์ค)
์ฃผ์์
- ์นธ ์๋ ๋ด๋ถ ์ฝ๋ ๊ฐ์๋ก ์ ๋ ฅํด์ผ ํจ. (9x6์ด๋ฉด ์ค์ ๊ฒฉ์๋ 10x7)
- ์ธ์ ํ์ง์ด ์ค์. ์๊ณก๋๋ฉด ์ ํํ ์บ๋ฆฌ๋ธ๋ ์ด์ ์ด ์๋.
2. ์นด๋ฉ๋ผ ๋ ธ๋ ์คํ
# realsense ์นด๋ฉ๋ผ ์์
roslaunch realsense2_camera rs_camera.launch
3. ์บ๋ฆฌ๋ธ๋ ์ด์ ๋๊ตฌ ์คํ
rosrun camera_calibration cameracalibrator.py \
--size 7x6 --square 0.024 \
--no-service-check \
image:=/camera/color/image_raw \
camera:=/camera/color
4. ์บ๋ฆฌ๋ธ๋ ์ด์ ๊ณผ์
- ์ฒด์ปค๋ณด๋๋ฅผ ์ฌ๋ฌ ๊ฐ๋์์ ๋ณด์ฌ์ค
- Success ๋ฉ์์ง๊ฐ ๋จ๋ฉด /tmp/calibrationdata.tar.gz ์ ์ ์ฅ๋จ
5. ๊ฒฐ๊ณผ ์ ์ฉ
- ์ ์ฅํ ๊ฒฐ๊ณผ ์์ถํ์ผ ํด์
cd /tmp
tar -xvzf calibrationdata.tar.gz
- yaml ํ์ผ์ camera_info์ ์ ์ฉํด์ผ ํจ (๋ ธ๋์์ ์ง์ ์ ์ฉ or launch ํ์ผ ์์ )
<!-- launch/realsense_with_calib.launch -->
<launch>
<node pkg="image_proc" type="image_proc" name="image_proc" output="screen">
<remap from="image" to="/camera/color/image_raw" />
<remap from="camera" to="/camera/color" />
<param name="camera_info_url" value="file:///home/your-name/realsense_calib.yaml" />
</node>
</launch>
๐ง 3. YOLO๋ก ์ค์๊ฐ ๊ฐ์ฒด ์ธ์
โ ๋ชฉํ
YOLO๋ฅผ ์ด์ฉํด ์นด๋ฉ๋ผ ์์ ์ ๊ฐ์ฒด๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ง
YOLO v5 ์ค์น
๐ YOLO ๋ ธ๋(Python) ์์
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import torch
class YOLODetector:
def __init__(self):
self.model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
self.bridge = CvBridge()
self.sub = rospy.Subscriber("/camera/color/image_raw", Image, self.callback)
self.pub = rospy.Publisher("/yolo_output", Image, queue_size=1)
def callback(self, msg):
img = self.bridge.imgmsg_to_cv2(msg, "bgr8")
results = self.model(img)
results.render()
img_out = self.bridge.cv2_to_imgmsg(results.ims[0], "bgr8")
self.pub.publish(img_out)
if __name__ == "__main__":
rospy.init_node("yolo_detector")
YOLODetector()
rospy.spin()
๐ launch ํ์ผ ์์
<launch>
<node pkg="3d_reconstruct" type="yolo_detector_node.py" name="yolo_detector" output="screen" />
</launch>
๐ง 4. ์๋ฌ์ ๋ฌธ์ ํด๊ฒฐ
โ Service not found
→ ์นด๋ฉ๋ผ๊ฐ ์์ง ์ ๋๋ก ์คํ๋์ง ์์๊ฑฐ๋ topic ์ด๋ฆ์ด ๋ค๋ฅผ ์ ์์
โ rqt_image_view์์ ์ด๋ฏธ์ง ์ ๋์ด
→ ์นด๋ฉ๋ผ ๋
ธ๋, ํ ํฝ ์ด๋ฆ ํ์ธ ํ์
→ image_raw ํ ํฝ์ด ์ ๋๋ก ํผ๋ธ๋ฆฌ์๋๊ณ ์๋์ง rostopic echo๋ก ํ์ธ
โ RLException launch ์ค๋ฅ
→ roslaunch๋ ํจํค์ง ๋ด๋ถ์ launch ํด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ํจ
→ ํด๋น ํ์ผ์ด ์ค์ ๋ก ์๋์ง ํ์ธํ๊ณ , catkin_make๋ก ๋ค์ ๋น๋ ํ์
โ 5. ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด ๊ธ์์๋ ROS์์ ์นด๋ฉ๋ผ ์บ๋ฆฌ๋ธ๋ ์ด์
์ ์์์ผ๋ก, YOLO๋ฅผ ์ด์ฉํด ๊ฐ์ฒด ์ธ์์ ์ค์๊ฐ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ๊น์ง ์ ๋ฆฌํด๋ดค์ต๋๋ค.
์ฒ์์๋ ์ด๋ ต์ง๋ง, ํ๋ค ๋ณด๋ฉด ์ฌ๋ฏธ๋ ์๊ณ ์ฑ์ทจ๊ฐ๋ ํฝ๋๋ค.
ROS + YOLO๋ฅผ ์ด์ฉํ๋ฉด ์นด๋ฉ๋ผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ค์ํ ์ฌ๋ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด ๋ณผ ์ ์์ต๋๋ค.
'ROBOTICS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ท๏ธ RealSense ์นด๋ฉ๋ผ๋ฅผ Ubuntu + ROS Noetic์์ ๋์ฐ๊ธฐ (feat. rviz๋ก ์์ ๋ณด๊ธฐ) (0) | 2025.04.17 |
---|