최근 저는 광운대에서 ROS 기초 수업을 진행했습니다. 해당 수업은 제가 ROS 기초를 진행하고 마치면, 그 다음 다른 분이 이어서 실제 주행로봇을 가지고 프로젝트를 진행하는 방식이었습니다. 그래서 제 뒤에 이어지는 수업에서 ROS melodic 버전을 사용하기 때문에 저도 수업을 melodic으로 진행을 했죠. 근데 melodic 버전에서 제가 블로그에서 YOLO pkg를 소개했던 적이 있습니다.
위 글인데요. 위 글의 내용을 수강생들에게 소개하고 재미삼아 YOLO ROS pkg 설치하고 잠시 즐거운 시간을 보냈죠. 근데 제가 수업중에 간단히 저 패키지의 노드가 발행하는 토픽을 구독해서 여러 class를 인식하지만 사람(person)이 인식되면 몇 명이 인식되었는지 카운트해서 화면에 프린트하는 코드를 작성해 보라는 숙제를 주었죠.
근데 수업이 진행되면서 제가 그 과제를 주었는지 잊어버린.ㅠㅠ. 종강하던 날 한 학생이 해당 숙제를 제가 풀어주지 않았다고 알려주더군요. 그래서 부랴부랴~~ 숙제 풀이를 해서 이렇게 공개합니다.ㅠㅠ. 아무튼 오늘 글은 YOLO가 중요한게 아니라 어떤 노드가 발행하는 토픽을 구독하는 방법을 유심히 보면 좋겠습니다.
앞에서 언급한 ROS Melodic용 YOLO를 설치하고 위 그림처럼 roscore를 실행합니다.
그리고 cv_camera를 실행하구요~
그리고 yolov3_pytorch_ros 패키지의 detector.launch를 실행합니다.
rqt_image_view를 실행해서 detection_image_topic을 지정하면 인식이 된다는 것을 압니다. 저는 맥을 사용하는데 패러럴즈로 우분투를 실행했기 때문에 yolov3-tiny 버전을 실행했습니다.
이제 토픽을 구독하고 뭔가 하기 위해 detected_objects_in_image 토픽의 정보(info)를 조회해보면 해당 토픽이 BoundingBoxes라는 메세지로 되어 있음을 알 수 있습니다.
그래서 BoundingBoxes를 rosmsg info 명령으로 조회하면 BoundingBox라는 이름으로 배열로 되어 있구요. 그 이름은 bounding_boxes입니다.
일단 간단히 코드만 집중하려고 이미 설치한 yolo 패키지에 scripts라는 폴더를 만들고 그 안에 코드를 작성했습니다.
#! /usr/bin/env python
import rospy
from yolov3_pytorch_ros.msg import BoundingBoxes
def callback(data):
cnt = 0
for each in data.bounding_boxes:
if each.Class == "person":
cnt = cnt +1
print "person count : " + str(cnt)
rospy.init_node("count_classes", anonymous=False)
rospy.loginfo("--> Start Count Classes Node")
rospy.Subscriber("detected_objects_in_image", BoundingBoxes, callback)
rospy.spin()
위 코드는 detected_objects_in_image 토픽을 구독해서, 그 안에 bounding_boxes에서 Class에 person이 관찰되면 카운트(cnt)를 수행하도록 했습니다. 저렇게 보면 쉽죠^^. 아래에 공개한 영상을 보면서 어떻게 작성했는지 흐름을 봐주세요~
그리고 꼭 chmod 명령으로 실행권한을 추가해야 합니다. 아래 그림처럼 그리고 아까 말한 해당 코드를 실행합니다.
이제 그 결과는 영상에서 사람의 수를 카운트 해줍니다.
'Robot > Robot Program - ROS' 카테고리의 다른 글
ROS2에서 OpenCV를 사용할 때 numpy 관련 에러가 난다면 (0) | 2023.10.27 |
---|---|
ROS2 colcon build에서 SetuptoolsDeprecationWarning 대응법 (0) | 2023.10.25 |
ROS2 humble을 설치하고 공부하는데 필요한 설정 (4) | 2023.08.24 |
ROS 카메라 캘리브레이션 수행하기 (12) | 2021.04.27 |
ROS 토픽을 터미널에서 그래픽하게 보여주는 rosshow (2) | 2021.03.21 |
ROS에서 odom 정보를 기초로 로봇에 위치 명령 인가하기 (10) | 2021.03.14 |
Ubuntu 20.04에서 ROS1 Noetic과 ROS2 Foxy 같이 설치하기 (12) | 2021.02.22 |