나는 환경설정이 정말 싫다.
별거 아닌거 같지만 생각보다 어렵고 .. (뭐 하나 잘못 건드리면 되던 것도 안됨.. 뭐 하나 안맞으면 바로 버전 충돌... 그리고 무한 굴레에 갖히게 됨) 시간 많이 잡아먹고 스트레스 받는다
어~ 그래 억까해봐~ 처음부터 다시하면 그만이야~
그래서 라이브러리 뭐 하나 툭 건들였다 호환성 꼬여서 폭망할 위험을 줄여주는 도커 환경에서 작업하는 걸 좋아한다.
아무튼.. 그래서 도커에서 zed랑 lidar 세팅을 했는데, zed 세팅에서 생각보다 삽질을 많이해서 나중에 또 그러지 말자고 세팅 일지를 정리해본다.
Devices
- LiDAR : Hesai 128 channel
- Stereo Camera : ZED 2
Docker env
- ubuntu 20.04
- cuda 11.8
- ros-noetic
도커 이미지 실행 시 run file 만들어두면 편하다.
#!/bin/bash
docker run -it --rm \
--gpus all \
--name zed \
--cpus=0.0 \
--shm-size=4G \
--net host \
--ipc=host \
-v ${HOME}:/mnt:rw \
-v /media:/media:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v ${HOME}/.Xauthority:/root/.Xauthority:rw \
-v /dev/bus/usb:/dev/bus/usb \
-v /dev/video0:/dev/video0 \
-v /dev/video1:/dev/video1 \
-v /dev/video2:/dev/video2 \
-v /dev/video3:/dev/video3 \
-v /dev/video4:/dev/video4 \
-v /dev/video5:/dev/video5 \
-v /dev/video6:/dev/video6 \
-v /dev/video7:/dev/video7 \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
--device=/dev/bus/usb/002/004 \
--device=/dev/bus/usb/001/004 \
--privileged stereolabs/zed:4.0-devel-cuda11.8-ubuntu20.04
--device
는 lsusb 해서 나온 zed 경로 추가했고, privileged 옆에 docker image:tag
랑 --name
만 수정해서 써도 된다.
원래 처음에는 기존에 쓰던 ROS 환경이 있어서 (melodic) 다시 환경 세팅하기는 번거로우니까 여기서 하려고 했는데, cuda 때문에 Zed sdk 깔고 ros-wrapper 빌드하는데 여러 번 실패해서 결국 cuda docker를 새로 받았다.
근데 cuda docker에서도 설치가 잘 안돼서 결국 sdk 달린 docker image를 받았다.
zed SDK가 설치된 docker image는 여기서 확인할 수 있다.
처음에 cuda-runtime-11.8
tag를 pull 받았는데 이거 함정임. 🤬🤬 cuda에 bin 파일이 없어서 ros-wrapper 빌드하다가 toolkit 못찾고 에러난다.
절.대. cuda-devel-11.x
tag pull 받으시오.. 그리고 zed-ros-wrapper가 SDK 4 이상 요구하니까 SDK 4 이상 깔린 tag로 빌드해라.
나처럼 아무거나 받다가 소중한 시간 날리지 마시오................
# 참고로 내가 받은 도커 이미지는..
$ docker pull stereolabs/zed:4.0-devel-cuda11.8-ubuntu20.04
ros 는 안 깔려있으니까 따로 설치 해줘야 된다.
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt install curl # curl이 이미 설치되어 있지 않은 경우
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo apt update
$ sudo apt install ros-noetic-desktop-full
# < 설치 중간에 언어 설정 해주는 키보드 입력이 있다>
~/.bashrc에 source /opt/ros/noetic/setup.bash
추가하여 도커 이미지 로드할때마다 자동으로 ros 실행
$ source ~/.bashrc
$ sudo apt install python3-rosdep
$ sudo rosdep init
$ rosdep update
$ sudo apt install python3-catkin-tools -y
$ sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y
stereolabs github 에 있긴 한데 패스하면 성의 없어 보이니깐 대략적으로 정리해 봄
$ mkdir -p zed_ws/src
$ cd ~/zed_ws/src
$ git clone --recursive https://github.com/stereolabs/zed-ros-wrapper.git
$ cd ../
$ rosdep install --from-paths src --ignore-src -r -y
$ catkin_make -DCMAKE_BUILD_TYPE=Release
$ source devel/setup.bash
제대로 빌드 완료되면 런치하면 된다.
$ roslaunch zed_wrapper zed2.launch
결국 너무 보고 싶었던 성공화면 띄움 !!
나는 삽질했지만 위에 docker image 받아서 ros 깔고 wrapper 빌드만 하면 문제없이 잘 될 것이다.
LiDAR를 PC에 연결 후, ifconfig 를 실행한다.
$ ifconfig
Lidar가 pc에 잘 연결이 됐으면 enpXs0 가 뜰텐데 IP 주소를 다음과 같이 configure 해주면 된다
$ sudo ifconfig enp5s0 192.168.1.100
내 PC에는 enp5s0으로 떠서 숫자는 뜬대로 변경해주면 된다. 설정할 주소는 192.168.1.100 이다.
잘 연결됐는지 확인하려면, http://192.168.1.201/ 에 접속해보면 된다.
접속이 잘 되었다면 아래와 같은 lidar status가 뜬다.
추가로 데이터가 잘 들어오고 있는지 확인해 보고 싶다면, whireshark
를 통해서 볼 수 있다.
# wireshark 설치
$ sudo apt install wireshark-qt
# wireshark 실행
$ wireshark
데이터가 잘 들어오고 있다면, source는 192.168.1.201
(lidar ip)이고, UDP protocol
로 설정되어 있을 것이다.
여기까지 잘 됐으면 ros에서 build를 진행하면 된다.
~64 channel은 여기의 메뉴얼을 따르면 되고, 128 channel은 여기의 메뉴얼을 따르면 된다.
나는 128채널을 사용해서 swift를 빌드했고, roslaunch 후에 rviz에서 시각화를 할 수 있었다.
$ roslaunch pandar_pointcloud PandarSwift_points.launch
이 lidar의 fixed frame은 PandarSwfit이다.