본문 바로가기

Robot/Robot Program - ROS

[R2R] 1-5 OpenCV에서 직접 받은 영상을 ROS2에서 FPS, size 조절하기

본 글은 제가 직접 쓴 글이 아니라, 저희 PinkLAB의 유투브 채널의 공개 강의 영상들을 읽고, 따라한 한 수강생의 글을 제 블로그에 공유한 내용입니다.

https://youtu.be/0ZqCdtP26dI?feature=shared

 

안녕하세요 ! Rush To Ros :) 

이번시간에는 [ OpenCV에서 직접 받은 영상을 ROS2에서 FPS, size 조절하기 ] 를 배워 봤어요.

지난 시간에 우리는 파라미터를 선언해서 이미지의 가로 세로 크기를 지정 할 수 있다는 접근을 한 번 했어요. 

그런데 아직 적용은 하지 않았어요. 

width, height라는 parameter를 선언하고 yaml 파일에서 가져오는 건 했는데,, 그걸 패키지 내에서 적용은 하지 않은거에요. 

이제 넘어 가 볼게요. 성공을 했으니.. 더 추가 해 봤어요.

이번에는 size.yaml에 가서, (그럼 이름이 size가 되면 안되는데.. camera.yaml 이어야하는데!) 

camera_device 지정하게 하구요, 

frame_rate 지정을 할 거에요. 

우리는 size.yaml 저기 클릭을 못 하잖아요 ! 

 

google 검색창에, pinkwink github 에 가셔서

 

Repositories에 들어가셔서 , for_ROS2_study 들어가셔서

여기에 실전 편 연습 코드에 들어가셔서 

img_pub_1 폴더에 들어가면

size.yaml이 있어요. 여기서 

요거 복사 해서 쓰면 된답니다! 

그리고 또 들어가서 보시면, 여기 launch 파일 있구요, 

setup.py도 혹시 몰라서 여기에 넣어 두셨대요. 이거 보고 학습을 하면 된답니다! 

그 다음에, img_pub.py 이것도 편집을 해야해요. 

일단은 width, height 가지고 왔던 부분은 여기에 있구요, 그 다음에 camera_device 가지고 오는 부분 여기에 있어요. 

camera_device , default 는 0 이구요, 

그 다음에 frame_rate 도 480 적혀있는데요, 틀렸어요! 30이 default에요. 

그러고 난 다음에 이제 뭐가 많아졌으니 get_logger은 여기에서 우루루 가지고 오는 걸로 두었답니다. 

그 다음에 여기 frame_rate 부분이 있어요.  타원형의 두 줄 이에요. 이게 뭐냐면! 

우리가 opencv에서 카메라를 열고 그 다음에 이 카메라에서 영상을 받아서 토픽으로 쏘는 작업을 하고 있어요. 

그 사이에 cv_bridge라는 걸 쓰고 있는거에요. 

그런데 이 때 여기 이 단에서 timer를 써서 일정 시간 간격으로 topic을 쏴 주고 있어요. 

이 때 이 타이머의 시간을 조정하면 된답니다!

타이머의 시간 간격을 조정하면, 초당 10번, 초당 20번, 초당 30번, 이렇게 맞추어 보낼 수 있게 되는거에요. 

여기서 이야기가 조금 길어지는데요, 

callback 부분에서 width랑 height를 넣은 이유img를 resize 하기 위해서였단 말이에요. 

그래서 opencv가 제공한 resize 함수를 쓰니까 '카메라가 원래 이 해상도를 지원하느냐, 아니냐' 하는 건

중요한 문제가 아니게 되어버렸죠. 내가 직접 하니까요. 

 

근데 단점이 뭐냐면.. opencv의 resize가 돌 만큼의 cpu 리소스를 빼앗아가요.

그러니까 카메라가 하드웨어적으로 지원을 하니까 설정을 바꾸는 건 내 pc의 내 cpu의 리소스를 먹지 않는단 말이에요.

( 아예 안 먹는건 아니겠지만, 그냥 안 먹는다고 가정했어요. )

근데 내가 opencv를 쓰기때문에 여기서 발생하는 약간의 cost는 생겨요. " cpu가 바쁘다 " 이 얘기라 합니당..!

 

img = self.cv_bridge.cv2_to_imgmsg(frame, "bgr8")

이건 resize를 시킨 아이를 opencv 에서 ros image로 data type을 바꾸는 거에요.  

이제 launch 파일 그대로에요. 

또 환경 부르고, 이렇게 우르르 나올거에요. 

 

실습 들어갑니당! 

 

이제 뭘 바꾸어야하냐면, 일단 size.yaml 갈게요. 

pinkwink github에 가서 

for_ROS2_study 찾고

R2R 실전편 연습 코드 찾으셔서 

img_pub_1 찾으신 다음에 

size.yaml 가셔서

여기 copy 버튼 누르시면 돼요. 

그래서 size.yaml 파일 여기에 paste! 붙여넣기 해요. 

붙여넣기 되었구요, 

space를.. Indent Using Spaces 클릭 ->

'4' 클릭! 네칸 잡아주었구요, 

정렬 한 다음에 

launch 파일은 손 댈 게 없구요, 

 

img_pub.py 이거 이제 바꿔줘야해요. 

그래서 여기에 가서..

img_pub.py 에서 이것만 긁어서 올게요. 

 

타이핑 하지 않고 여기 와서 class ImgPublisher(Node) 부분부터 

이렇게 붙여넣어줬어요. 

 

보시면 logger 엄청 보내고 있구요, 

 

타이머 부분 바꾼거 보이구요, 보이시죠!

남아있는게..  여기서 resize 한 번 해야해서요, 

 

그래서 여기서 이것도 긁어다가 timer_callback 부분도 가지고 올게요. 

가져왔구요, 

이렇게 해서 리사이즈 걸고 발행하도록 해 뒀어요. 

 

이제 다시 colcon build 하고

my_opencv_tutorials 로 환경 부르고 

ros2 launch my_opencv_tutorials bringup_cv.launch.xml로 런치파일 실행을 해요.

 

로그들이 일단 바뀌었어요. 

Frame Rate 도 바뀌었어요. FPS는 초당 프레임 숫자인데요, 30 fps 하던걸 초당 10fps로 강제로 수정을 했어요. 

 

my_opencv_tutorials 로 환경을 부르고

카메라에 손을 대고.

rqt  불러요. 

rqt에서는 frame rate 이 떨어지는게 그렇게 잘 보이지 않는데요, 30에서 10으로 바꾸어 보면 확실히 달라져요. 

 

ㅋ_ㅋ 🤭

이 상태에서 파라미터를 바꾸는 과정을 보여주셨어요. 

확실히 반영 된다는 걸 보여주기 위해 size.yaml 에서 초당 rate을 1로 바꿨어요. 저장하구요, (아 무섭습니다 ~ 라는 의미는.. 매우매우 느려진다는 뜻이겠죠!? )

colcon build 하구요, my_opencv_tutorials 환경 부르고 ros2 launch 로 실행 해 볼게요. 초당 한 번 쏘라는 거에요. 

 

그 다음에 rqt 실행을 해 봤어요. 

 

뚝 뚝 끊어져요. 어...!!!! 손으로 가린거 캡쳐 하려고 했는데 1로 하는바람에 끊어져버려서 !!! 🤗

이렇게 됩니당.. 

지금까지 해서 파라미터 수정하기를 해 봤어요. 

우리는 카메라 영상을 가지고 오고,

가지고 온 카메라 영상을 파라미터를 이용해서 영상의 설정을 바꿀 수 있다, 없다, 이런 이야기들을 해 봤어요.

고생하셨습니다 ^-^

눈운동 많이많이 하시고 다음시간에 만나요 ! 

반응형