본 글은 제가 직접 쓴 글이 아니라, 저희 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로 카메라를 직접 핸들링하는 이야기는 다음에..
오늘은 여기까지.
이번시간도 고생하셨습니다아아 🥰
'Robot > Robot Program - ROS' 카테고리의 다른 글
[R2R] 1-1 usb_cam pkg로 USB 카메라 활성화하기 1 (1) | 2025.07.03 |
---|---|
[R2R] 1-0 또. 다시. 강조하는 bashrc (1) | 2025.06.30 |
ROS2 교육 유데미 유료 교육을 오픈했습니다. (8) | 2024.11.21 |
ROS2 무료 강의 R2R 응용편이 끝났습니다. (8) | 2024.11.11 |
Mac에서 ROS2 humble 설치 및 원격 설정 (5) | 2024.10.24 |
ROS2에서 rqt의 플러그인에서 TF tree가 시각화 되지 않을때 (2) | 2024.10.17 |
ROS2 유투브 강의 벌써 응용편으로 진입했습니다. -R2R- ROS2 강좌 (2) | 2024.06.13 |