docker를 사용해서 ros detection 예제를 돌려보고자 한다.
우선 나의 jetpack version에 맞는 docker image를 다운받아야하는데
L4T 35.4.1 이거에 맞게 docker 이미지를 골라서 다운받아줘야한다.
이대로 진행해보니
docker/run.sh --ros=foxy 명령어를 사용하는과정에서 오류가 났다. (= 나는 foxy버전이므로 foxy로 함)
이러한 이미지가 없다고 뜸
근데 docker hub에서 이미지를 찾아보니
가장 최신에 나온 docker가 35.3.1버전밖에 없다..
docker/run.sh --ros=foxy 이 명령어 대신에
cd jetson-inference
docker/run.sh -c dustynv/ros:foxy-pytorch-l4t-r35.3.1 이렇게 쳐줘야함 (--> 이걸 쳐주면 알아서 컨테이너에 들어가지는듯함)
ros2 확인
colcon 확인
build & install
container에 접속후 ROS 버전확인
container setup file 위치
$ source /opt/ros/foxy/install/setup.bash
$ cd ros_deep_learning
$ ls
$ colcon build --symlink-install --packages-select
실행예제
1. zed camera 실행
$ cd ros_deep_learning
$ ros2 launch ros_deep_learning video_viewer.ros2.launch input:=v4l2:///dev/video0 output:=file://my_video.mp4
2. zed camera detection
gstreamer로 streaming
<container>
$ cd /ros_deep_learning
$ ros2 launch ros_deep_learning detectnet.ros2.launch input:=v4l2:///dev/video0 output:=rtp://192.168.0.18:5001
<windows terminer>
>gst-launch-1.0 udpsrc port=5001 ! application/x-rtp,clock-rate=90000,payload=96 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! queue ! autovideoconvert ! fpsdisplaysink
https://www.stereolabs.com/docs/ros2/zed-node#published-topics
ZED Camera의 왼쪽 영상과 depth 영상 받아오기
ZED Camera는 왼쪽영상을 기준으로 depth영상을 출력해준다. 그래서 원본 rgb영상과 depth영상을 매칭시키려면
왼쪽 영상을 받아와야한다.
https://github.com/stereolabs/zed-ros2-examples/tree/master/zed_display_rviz2
zed-ros2-examples를 활용해서 ZED카메라 토픽을 ROS를 이용해서 docker에 날려준다.
<jetson xavier>
$ cd ~/ros2_ws
$ ros2 launch zed_display_rviz2 display_zed_cam.launch.py camera_model:=zed
<docker>
* docker에서 토픽이 받아지는지 확인
/detectnet/image_in --> /zed/zed_node/left/image_rect_color 로 바꿔준다 (=들어가는 이미지의 형태를 바꿔줌)
$ cd /ros_deep_learning
$ ros2 launch ros_deep_learning detectnet.ros2.launch input:=v4l2:///dev/video0 output:=rtp://192.168.0.18:5001 model_name:=peoplenet-pruned
<windows>
> gst-launch-1.0 udpsrc port=5001 ! application/x-rtp,clock-rate=90000,payload=96 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! queue ! autovideoconvert ! fpsdisplaysink
사람 객체 인식률 높이기
기본 default model (= "ssd-mobilenet-v2")는 91개의 coco 클래스로 학습했으므로 사람데이터가 부족할 수 있다. 실제로 test해본결과 사람인식률이 너무 떨어졌고 다른 모델을 찾아야 했다.
jetson-inference에서 제공하는 모델중에 사람 인식률을 높일수 있는 모델이 있는데 PeopleNet이다.
이전에 디폴트로 사용한 모델은 사람 인식률이 현저히 낮지만 peoplenet을 쓴 영상을 보면 사람을 중점적으로 훈련했기 때문에
정확도가 상승한것을 볼 수있다.
ros_deep_learning 쪽에가서 디폴트 값을 수정해서 써보겠다.
실행하는 쪽의 launch 파일을 수정해주면 된다.
<container>
$ cd /ros_deep_learning
$ ros2 launch ros_deep_learning detectnet.ros2.launch input:=v4l2:///dev/video0 output:=rtp://192.168.0.18:5001 model_name:=peoplenet-pruned
(--> peoplenet-pruned 모델이 잘되는거 같음)
<windows terminer>
> gst-launch-1.0 udpsrc port=5001 ! application/x-rtp,clock-rate=90000,payload=96 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! queue ! autovideoconvert ! fpsdisplaysink
Detection msg 값을 subscribe하는 코드
https://velog.io/@choonsik_mom/ROS-python-zed-camera%EB%A1%9C-depth-%EC%B6%94%EC%A0%95%ED%95%98%EA%B8%B0