본문 바로가기

Robot/Robot Program - ROS

[R2R] 1-2 usb_cam pkg로 USB 카메라 활성화하기 2

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

https://youtu.be/2GVgBY3g6ag?feature=shared

 

이번에는

[ R2R 실전편, usb_cam pkg로 USB 카메라 활성화하기 2 ] 위 강의를 듣고 내용 정리 해 봤어요.

DOMAIN_ID도 , LOCAL_HOST_ONLY 도 터미널 마다 확인을 해 봐야해요.

확인을 할 게 너무 많아요!

이럴 때 해 주는게 있어요.

bashrc에 작업을 더 넣어주는거죠. 지금 이 화면은 vs code 에요.

강사님은 vs코드를 ssh 로 접근 한 거에요.

여러 영상에서 언급 되었지만, 강사님은 mac 을 주 pc로 사용하시고, ubuntu를 개발용 pc 로 사용하시는데,

그 사이를 ssh로 연결하는거에요.

ubuntu pc에 직접 모니터, 마우스, 키보드를 연결해서 쓰시는 분들은 이런 거 고민 안 하셔도 되고요.

ssh이건 아니건! bashrc를 열어요.

그런데, 지난번 영상에서 bashrc를 직접 작업하는게 아니라

alias_setting.sh 파일을 열기로 했잖아요.

여기에 이렇게 코드를 넣어둔 거에요.

ROS_DOMAIN_ID가 없다면 0,

그리고 ROS_DOMAIN_ID가 있다면 , 표기해라

그리고 ROS_LOCAL_HOST_ONLY가 없으면,

0이다. 통신을 다른 pc와 하겠다는거에요.

= topic을 주고받겠다는거에요!

 

그게 있다면 (1밖에 없지만) 표현을 해라, 하고 

함수로 만들었어요. get_status 라는 함수!

그게 이 내용이에요.

잠시 타이핑을 해 보신 다음에..

bashrc를 읽고,

get_status 해 보시면 된답니다!

실제로 터미널 화면에서 적어봐요.

너의 ROS_DOMAIN_ID는 13이고 LOCAL_HOST_ONLY는 0이네 하고

이런걸 하나 함수를 만들어 두면, 매번 입력할 필요는 없는거죠.

*참고!

echo$ ROS_LOCAL_HOST_ONLY 이것도 입력 해 두면 편해요.

데이터 정말 많아요. 그래서 실제로는 줄여도 초당 기기 둘만 통신을 해도 1메가는 돼요.

그게 아무리 줄여도 10대의 디바이스가 가져간다 하면 초당 10메가인거죠.

그런데 인터넷 속도 말구요, 공유기가 커버할 수 있는 용량이 생각보다 높지 않아요.

그러니까 네트워크 즉 공유기가 느려지는거죠. 이럴때 보통 많이 하는게..

강의실에서 다수의 팀이 프로젝트를 한다고 하면

팀마다 공유기를 주면 된다 해요. 팀별로 이 공유기에서 활동을 하라는거죠.

근데 그러면 강의실을 운영하시는 시설 팀이 스트레스를 좀 받으신대요.

왜냐하면, 공유기 라인이 하나 들어오는데, 팀별 지급된 공유기랑 엮어야 되거든요.

이것도 보통 일이 아니래요. 네트워크 관리가 되게 어려워져서요.

그래서 카메라에 대해서만은 토픽을 안 쓰는 분들도 되게 많아요.

topic list 에서 상세히 보면

image_raw도 있구요, image_compressed 도 있고 그래요.

그리고 여기 보면 이미지의 데이터 타입이 이미지인 것도 있어요.

이제 이걸 보고 간단하게 패키지 하나 만들어 봐요.

jazzy 부르고 mkdir 명령어로 my_opencv_tutorials, ( 이제부터는 한동안 opencv를 이야기해요. )

src 폴더 만들구요,

거기로 이동해서 pkg create 명령어로 패키지를 만들어 볼 거에요.

일단 강사님은 카피.... (우리는 타이핑!)

 

mkdir 명령어 다음 -p (p 옵션을 주고)

my_opencv_tutorials 에 src 폴더를 만들어라 했어요.

cd my_opencv_tutorials/src/ 여기까지 간 다음에

jazzy는 불렀지만 한번 더 부를게요.

(아직 humble 쓰시는 분들은 humble 하시면 된답니다!)

그리고

ros2 pkg create --build-type ament_python my_opencv_tutorials

(-> ros2 pkg create / --build-type은 ament_python으로 잡았구요, / my_opencv_tutorials 라는 이름으로 만들었다는 뜻이에요.)

ls 해서 보시면 나와있어요.

만들어 졌어요.!

이제 이 상태에서, launch 랑 config 폴더를 만들 거에요.

launch랑 config 폴더를 my_opencv_tutorials로 가서 만들어요.

 

my_opencv_tutorials로 가겠습니다.

여기에서 mkdir 명령어로 launch 폴더랑 config 폴더가 여기에 만들어져 있어요.

 

이 상태에서, 아직은 config 폴더에 뭘 넣을 것이 아니라서, launch 폴더만 대응을 하도록 할거에요.

이 코드는 우리가 예전에 가지고 왔던 예전 응용편에서 많이 쓰던 코드에요.

 

여기에 my_opencv_tutorials 가 있죠.

 

여기에 setup.py가 있습니다. 여기에 data_files 가 있죠.

 

('share/' + package_name, ['package.xml]'),
('share/' + package_name + '/launch', glob.glob(os.path.join('launch', '*.launch.*')))

여기에 share 의 pakage_name, '/launch' 잡아주시구요, 그리고 난 다음에 glob.glob 할건데,

그럼 glob을 불러와야죠.  --> import glob 부르구요,

glob에서 os 레벨 명령어도 쓸 거라서, --> import os도 이렇게 해요.

 

glob.glob(os.path.join('launch', '*.launch.*'))

os.path.join을 쓰면 운영체제에 맞는 경로 구분자를 자동으로 사용한다는 뜻이구요, 

전체는 launch 폴더 내에서 .launch.로 시작하는 확장자를 가진 모든 파일의 경로를 리스트로 반환한다는 뜻이에요. 

이 내용 타이핑 해서 넣었어요.

 

그리고 launch 폴더에 bringup_usb_cam.launch.xml 추가하도록 할게요.

 

이 내용이에요.

 

여기에서 launch 폴더에 new 파일을 하나 열고 bringup_usb_cam.launch.xml 을 만들거에요.

그러고 난 다음에 xml 이니까 xml 버전을 잡아줘야해요. 버전은 1.0 ! (코파일럿, 커서, 뭐가 되었든 괜찮아요.)

 

그리고 node 를 하나 실행 할 거에요. 괄호를 열고!

<launch>
	<node pkg="usb_cam" exec="usb_cam_node_exe" output=screen">

pakage는 어디냐하면 usb cam 에서 usb cam pkg 에요.

그리고 실행은 usb_cam_node_exe ( 직전에 ros2 run 하고 실행했던 그거에요! )

그리고 output은 screen으로 잡아주고요. 괄호를 닫아요. 

그 다음엔 

우르르 자동 완성이 되는데, 강사님은 몇 개 지우고 하셨어요.

<param name = "video_device" value="/dev/video0" />
<param name = "image_width" value="640" />
<param name = "image_height" value="480" />

파라미터를 미리 다 준 거에요. 

Q. 왜 파라미터를 미리 다 주나요? 라고 물어보면, 

A. 공식 홈페이지 가면 있어요. 

라고 답을 할 수 있지만, 

 

우리가 아까 실행했던 명령이 'ros2 run usb_cam 에 usb_cam_exe_node' 였잖아요.

이걸 실행 해 두고 난 다음에 다시 들어가서 

 

ros2 param list 한 번 해 보세요. 

usb param list 해 보면 여기 이제 수없이 많은 것 중에서 이런게 있어요. 

framerate 있구요, 그리고 이제 image_height 그리고 pixel_format 그리고 image_width

video_device 이런 것들이 보여요.

위의 것을 보고 내가 조정을 할 수 있도록 잡아 줄 수 있거든요.

 

이렇게 그리고 난 다음에 빌드 해야해요. 

우리도 빌드해요!  빌드는 어디에서 할까요 ? 

내가 src 폴더를 여기에 만들어 두었다는 건, 이게 work space 라는 거에요.

* work space 에서 colcon build를  해요. 

빌드를 했으면  그 다음은 !? 

다시 opencv_tutorials 환경을 source 명령어로 불러야해요. 

자 여기서 source 하고,  ./ 현재 폴더에 있는 install( tap 누르세요 ) 폴더에 있는 local setup.bash를 부른다.

방금 빌드한 환경을 터미널에서 읽어온거죠. 

이렇게 해 두고

 

이제 이렇게 해 두고, 아까 했던 ros2 launch 명령어로 my_opencv_tutorials에 있는 bringup_usb_cam.launch.xml 파일을 부르는거죠.

이렇게 하면 실행 결과는 똑같아요. 똑같이 실행하라고 했으니 ros2 launch my_opencv_tutorials에 있는 bringup_usb_cam을 실행해라. (node를 닫지 않아서 잠시 오류가 났어요. )

저장 잘 하고

colcon build 다시 하고

 (source ./install/local_setup.bash ) 환경 부르고

 ( ros2 launch my_opencv_tutorials bringup_usb_cam.launch.xml ) 실행을 다시 하면 카메라 노드가 실행이 잘 돼요.

 

rqt로 이미지를 보시면 돼요. 그러고 exit 하고 빠져나왔어요. 

지금 이 프롬프트는 강사님의 mac 프롬프트에요. mac에도 conda로 ros2를 설치하셨어요.

conda env list 하시면 conda를 볼 수 있어요. 보시면 ros2라고 적혀있잖아요. 그럼 conda activate ros2 하는거에요. 

강사님 mac에는 humble 버젼이에요. 강사님 mac의 가상 환경이 아니라 local에 깔려있는 건 ros2 humble 버젼이거든요. 

거기에서 export 명령어로 ROS_DOMAIN_ID=13으로 맞추고 난 다음에 rqt를 실행하면 나와요.

 

짜자아아아안 🤗

jazzy 든 humble 이든 galactic이든 datatype이 일치하고 같은 네트워크에 묶이면

ROS_DOMAIN_ID만 살짝 맞춰주면

서로 토픽을 주고받아요. 아직 익숙하지 않다면 Ubuntu에서만 봐주세요. 

이렇게 해서 rqt로 들어가보면 잘 보인다는 걸 확인했어요. 

다시 한번 더 강조하셨는데, 다 같이 공부하는 데서 네트워크가 느려진다 그러면 카메라를 꺼야한다 하셔요. 

아니면 ros local host 돌리던지.. 

그런데 그것도 아니라면 또 하나의 방법이 있어요. 뭐냐하면!

아까 launch 파일에서 우리가 파라미터를 잡아뒀잖아요. 여기에서 width나 height를 줄여요. 

딥러닝 쓰신다고 하면, 딥러닝 모델들이 그렇게 높은 해상도를 많이 받아가지는 않아요.

그래서 이 정도 잡아두시거나, 모니터링 용도로만 쓰시거나.

그리고 framerate를 떨어뜨려 보는 것도 괜찮다 하십니당..! 

로봇이 운전을 할 수 있는 범위 내에서요. 

그런데 막 떨어뜨릴 수 있는 건 아니니 조심해야해요! 무슨 이야기냐 하면..

아까 실행 할 때 보셨겠지만, 카메라별로 지원되는 옵션이 달라요. 

이 안에서만 할 수 있어요. 그러니까 usb cam package를 사용하는 경우에는 그래요.

그래서 강사님께서 가이드 하실 때는 opencv로 직접 카메라를 핸들링하자 하신대요.

네트워크 문제가 있기도 해서요!

topic으로 인해 time latency가 발생하면 그것도 위험하구요. 

그 이야기는 다음에 또 해 주신대요! 

ROS에서 opencv로 카메라를 직접 핸들링하는 이야기는 다음에.. 

오늘은 여기까지. 

 

이번시간도 고생하셨습니다아아 🥰

 

반응형