코딩일지(2024-07-22)
MORAI에서 RosBag을 생성하였다.
Ning선배님이 주신 요구사항에 맞춰 RosBag을 생성하기로 했다.
우분투에서 X11 설치하기
Ubuntu GUI Server, X11 Forwarding 설정 가이드 - 출처
sudo apt-get update
sudo apt-get install -y ubuntu-desktop xorg xrdp xserver-xorg mesa-utils xauth gdm3
sudo dpkg-reconfigure xserver-xorg
왜 Docker에서 ROS를 돌려야만 할까?
어디서 주워들은 거지만 이 질문에 대해 상당히 납득이 되서 정리해놓으려고 한다.
ROS는 기본적으로 시스템 위에 설치되어야 하는 소프트웨어이다. 근데 이제 우리가 SLAM을 돌려본다고 치자. 그러면 SLAM을 공부하면서 여러 오픈소스들을 돌려보게 될 것이다. 이 SLAM 알고리즘들이 공개된 시기에 따라 ROS 디펜던시 즉, 의존성 패키지 들의 버전이 제각각 다르다.
아래의 조합들을 살펴보자.
- Ubuntu 14.04 + ROS Indigo
- Ubuntu 16.04 + ROS Kinetic
- Ubuntu 18.04 + ROS Melodic
- Ubuntu 20.04 + ROS Noetic
만약! 한 컴퓨터 안에 ROS를 두개 깔면 어떻게 될까”?” 뭐긴 바로 충돌일어나서 복구조차 힘들어진다.
뿐만 아니라, ROS위에 OpenCV난 아이겐(Eigen)같은 것도 올려줘야 하는데, 이것들도 충돌이 불가피하게 일어날 것이다.
“따라서, 이런 일이 발생하지 않도록 각각의 알고리즘마다 독립된 가상환경을 만들어주는 것이 정신건강에 이롭다.”
닝선배 요구사항
MORAI에서 ROSBAG 생성할 것. 방법은 구글링해서 알아서 찾아볼것
이때 ROSBAG을 그냥 만드는게 아니라 Body(Vehicle)위에 라이다와 카메라 6개를 달아서 로스백 형태로 Recording을 따라고 한 것이었다.
그리고 선배님이 해당 링크를 보내주며 여기를 참고하라고 했다.
링크에는 아래 사진이 있었다. 이를 참고하였다.
그래서 나는 위 사진을 참고해서 나는 아래와 같이 모델을 구축했다.
센서정보 칼리브레이션 파일(+경로)>
/home/jacksmith/playground/morai-workspace/MoraiLauncher_Lin/MoraiLauncher_Lin_Data/SaveFile/Sensor/24.R1.0
rqt_graph에 인스턴스를 생성하려고 한다
이슈>
해결>
# 일단 도커 밖으로 나와 호스트시스템에서 x11에 접근권한 부여
jacksmith@jacksmith-desktop:~/playground/morai-workspace/MoraiLauncher_Lin$ xhost +local:docker
# 컨테이너 실행시 X11 설정 추가
docker run -it --name morai-container \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ros:noetic-ros-base-focal \
/bin/bash
근데 위 컨테이너 실행방식에는 네트워크에 물리는 옵션이 없었다. 그래서 아래와 같이 명령어를 개량했다.
# 기존 도커런 명령어에 네트워크 연결 옵션도 추가함(중요!)
docker run --network host \
-it --name morai-container \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/jacksmith/playground/morai-workspace:/home/jacksmith/playground/morai-workspace \
ros:noetic-ros-base-focal /bin/bash
그리고 이어서 유틸리티 설치로 이어갔다.
# (컨테이너 안에서)라이브러리 설치 및 rqt그래프 실행
sudo apt-get update
sudo apt-get install ros-noetic-rqt-graph
rqt_graph
환경변수 설정
윈도우에는 환경변수 설정을 해주는 유틸리티 프로그램이 따로 있다. 하지만 리눅스에서는 그딴거 없고, 홈디렉토리 바로 아래에 .bashrc
라고 하는 파일이 존재하는데, 이 파일에다가 setup.bash라고 하는 배시파일을 자동으로 적용해서 실행할 수 있도록 환경변수를 설정해주는 것이다.
# MORAI 환경변수 설정:
echo "source /home/jacksmith/playground/morai-workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc
첫번째 명령어는 새로운 터미널을 열 때마다 모라이 작업공간의 환경설정을 자동으로 적용하깅 위한 것이다. 이 스크립트는 로스 패키지들이 올바르게 빌드되고 실행할 수 있도록 환경변수를 설정한다.
# ROS1 Noetic 환경변수 설정:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
두번째 명령어는 새로운 터미널을 열 때마다 ROS1 Noeitc의 환경설정을 자동으로 적용하기 위한 것이다. 이 스크립트는 ROS Noetic 환경을 설정하여 ROS명령어들과 패키지들이 올바르게 동작하도록 한다고 한다.
# 편집한 환경번수 설정 적용
source ~/.bashrc
세번째 명령어는 추가된 환경변수 설정들을 즉시 적용 및 반영한다.
칼리브레이션 정보 저장할때 주의할점
기껏 칼리브레이션하고 JSON파일을 만들고 나서, 내가 별도로 주석을 달아주었더니 해당 파일을 load하지 못하는 이슈가 발생함.
root@jacksmith-desktop:/home/jacksmith/playground/morai-workspace/updates# rosbag record \ #로스백 파일 생성을 위한 녹화시작
-O my_bag_record.bag \ #저장할 파일의 이름설정
/rosout /rosout_agg /statistics #토픽들
GAZEBO 설치
sudo apt-get update
sudo apt-get install gazebo
sudo apt-get install ros-noetic-gazebo-ros
source /opt/ros/noetic/setup.bash
이후 catkin_ws디렉토리로 가서 다음 명령어를 쳤더니 제대로 동작을 하더라.
root@jacksmith-desktop:/home/jacksmith/playground/morai-workspace/catkin_ws# roslaunch \
morai_standard morai_standard.launch
result>
본격적으로 rosbag을 생성해보았다.
1.토픽 나열하기
rostopic list
현재 실행중인 토픽(내가 녹화해할 토픽):
- /rosout
- /rosout_agg
- /statistics
2.bag 파일의 이름 지정해 저장하기
rosbag info my_bag_record.bag
3.bag 파일 실행
rosbag play my_bag_record.bag
4.rqt 그래프 그려보기
rqt_graph
(체크박스 해제여부를 꼭 아래와 같이 맞춰줄것)
위 흑백그림에서 사각형으로 된 블럭이 토픽인 것을 알 수 있다. (그러면 당연히 타원형으로 된 것들은 모두 노드인 것을 알수있다)
5.토픽 반복재생하기
rosbag play -l my_bag_record.bag
6.특정 토픽만 재생하기
- /rosout 토픽만 실행하기
root@jacksmith-desktop:/home/jacksmith/playground/morai-workspace/my_pkg/rosbag# rosbag play my_bag_record.bag --topics /rosout
- /statistics 토픽만 실행하기
root@jacksmith-desktop:/home/jacksmith/playground/morai-workspace/my_pkg/rosbag# rosbag play my_bag_record.bag --topics /statistics
- /rosout_agg 토픽만 실행하기
root@jacksmith-desktop:/home/jacksmith/playground/morai-workspace/my_pkg/rosbag# rosbag play my_bag_record.bag --topics /rosout_agg
roslaunch파일 분석하기
-
rosbag을 사용하려는 이유는 다음고 같이 정리할 수 있겠다. 자율주행 알고리즘을 테스트할때, 정확히는 Vehicle위에 다양한 센서들을 붙이고 각각의 센서들이 토픽통신을 할 수 있게끔 구축하고 여기서 중앙을 수집한 통신정보들을 기반으로 다양한 알고리즘을 테스트해야할때가 있다. 그렇게 하면 센서 데이터를 실제 데이터와 유사하게 적용해볼 수 있다. 즉, 알고리즘을 검증할 수 있는 것이다.
- 이를 위해 우리는 센서노드들을 launch파일에 선언해주고(.bashrc파일에 환경변수 선언해주는 것과 유사하다), roslaunch 명령어 단 한줄의 코드만으로 모든 노드를 깔쌈하게? 작동시킬 수 있겠다.
- 근데 이때, 여기서 rosbag까지 사용한다면 몇줄의 명령어가 더 필요하려나 보면은, 총 2줄의 명령어가 더 필요하겠다.
- 첫번째는 바로 핵심인스턴스를 가동하는 명령어인
roscore
(나는 영화’아이언맨’에 나오는 핵심코어 정도로 비유해서 여기고 있다.) 명령어를 실행하고, 두번째는 로스백 녹화를 하는rosbag play
이다.
그런데 말이다. 저 rosbag사용할때 필요한 명령어도 launch파일을 수정하여 명령어 치는 것을 생략할 수 있다.
(아래는 원래 launch파일의 예시이다)
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<!--sensors-->
<!--LiDAR-->
<node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
<param name="serial_port" type="string" value="/dev/ttyLiDAR"/>
<param name="serial_baudrate" type="int" value="256000"/>
<param name="frame_id" type="string" value="laser"/>
<param name="inverted" type="bool" value="false"/>
<param name="angle_compensate" type="bool" value="true"/>
<param name="scan_mode" type="string" value="Stability"/>
</node>
<!--GPS-->
<include file="$(find ntrip_ros)/launch/ntrip_ros.launch"></include>
<!--IMU-->
<node pkg="myahrs_driver" type="myahrs_driver" name="myahrs_driver">
<param name="port" value="/dev/ttyIMU" />
<param name="baud_rate" value="115200" />
</node>
<!--scripts--> <!-- 센서의 raw 데이터를 조작하는 스크립트 -->
<node pkg="my_pkg" type="lidar_filter.py" name="lidar_filter" respawn="true" output="screen"/>
<node pkg="my_pkg" type="heading_calculator.py" name="headingCalculator" respawn="true"/>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_pkg)/rviz/rviz_setting1.rviz" />
<node name="rqt" pkg="rqt_graph" type="rqt_graph"/>
</launch>
위 런치파일의 구조만 살펴보면 다음과 같다.
각각의 노드들은 특정 기능을 독립적으로 수행한다. 그리고 launch파일을 통해 이 노드들을 한번에 실행할 수 있게 된다.
(조금 더 알아보장~)
1. launch
launch파일 안에는 최상위 요소로 <launch>
가 있다. 이는 ROS Launch파일을 나타낸다. 이 노드 이 노드(파일)안에 여러 노드와 파일들을 포함하고 있어, 복잡한 ROS 시스템을 쉽게 실행할 수 있도록 한다.
2.sensors
- 다양한 센서노드들이 여기에 포함되어 있다. 이들은 각기 다른 센서 데이터를 수집하고 처리하는 역할을 한다.
- node(LiDAR): LiDAR 데이터를 처리하는 노드
- include(GPS): GPS데이터를 처리하는 노드
- node(IMU): IMU데이터를 처리하는 노드
3.scripts
- Lidar_filter, HeadingCalculator와 같은 스크립트 노드들이 여기에 포함되어 있다. 이들은 특정 알고리즘을 실행하거나 데이터를 처리하는데 사용된다
- node(lidar_filter): LiDAR 데이터를 처리하는 노드
- node(HeadingCalculator): 해당(방향) 계산을 수행하는 노드
- node(rviz): ROS시각화 도구인 RViz를 실행하는 노드
- node(rqt): ROS의 그래픽 인터페이스 도구인 rqt를 실행하는 노드
한가지 넉두리…
분명 나는 자율주행을 공부하고 참여하러 왔는데, 더이상 내가 뭐하고 있는지 모르겠다.
catkin_make를 시도하려는데, 분명 아까까지 도커위에 설치한 패키지가 또다시 없다고 하질 않나,
도커를 빠져나왔다가 다시 연결하니 아까 다운받은 roslint가 또 없어졌다고 하지를 않나,
수십번도 더 깔았던 socketcan_msgs가 또 없다고 하지를 않나
자율주행에 들어가기에 앞서 그 앞에 백그라운드로 깔려있어야 할 지식이 너무 많다고 느껴진다.
너무 먼길을 와서 돌아갈 수 없게 된게 아닐까 하는 생각이 불연듯 스쳐지나 간다..
댓글남기기