1. 서 론
시뮬레이션은 모든 자율주행 및 로봇 공학자의 필수 도구이다. 잘 설계된 시뮬레이터를 사용하면 알고리즘을 빠르게 테스트하고, 로봇을 설계하고, 회귀 테스트를 수행하고, 현실적인 시나리오를 사 용하여 시스템을 테스트 할 수 있다. Gazebo는 로봇 운영 체제(ROS)의 기본 시뮬레이터이다. 다 양한 물리 엔진, 고급 3D 그래픽, 센서 및 소음, 로봇용 플러그인(plugins), 사용할 수 있는 로봇 모델 중에서 선택할 수 있는 동적 시뮬레이션 환 경을 제공한다[1]. 자신이 작성한 패키지를 이용해 시뮬레이션을 실행하면 환경과 로봇에 대해 필요 한 모든 정보를 알 수 있으며, 디버깅을 통해 실 패 원인과 성능 개선 연구도 가능하다. 또한 특정 사례를 테스트하려는 경우 상황을 강요하고 필요 한 정보를 얻을 때까지 SW를 반복적으로 실행함 으로써 비용 절감과 개발시간 단축이 가능하다 [2][3].
이 연구에서는 실제 로봇을 통한 동작 구현에 앞서 open-source인 Gazebo 상에서 모의 로봇과 함께 라인 트레이서 환경(world)을 직접 구축하고 자 하였다. 이를 위해 실제 로봇 대신에 모의 로 봇을 사용해 다양한 시뮬레이션 환경에서 여러 제 어 방법 등을 통해 로봇을 제어하고 분석할 수 있 는 라인 트레이서 ROS 패키지를 구현하고 테스트 하고자 하였다. 그리고 이를 바탕으로 여러 인자 들이 로봇의 라인 트레이서 동작에 미치는 영향을 분석할 수 있는 시뮬레이션 환경을 개발하고자 하 였다. 여기서 사용한 시뮬레이션의 기본 환경은 다음과 같다.
- OS : Ubuntu 20.04
- ROS : Noetic
- Simulated Robot : Turtlebot3_burger
- Gazebo vesion : 11.11.0
2. 시뮬레이션 환경(GAZEBO WORLD)
Gazebo 세계(World)는 하늘, 주변 조명 및 지 면(ground)의 물리적 속성과 같은 전역 매개 변수 와 로봇 및 개체 모음을 사용해 시뮬레이션 전체 환경을 기술하는데 사용된다. 즉, 이것은 Fig. 1과 같이 실제 환경과 유사한 물리적 환경에서 로봇의 움직임을 시뮬레이션하기 위해 사용된다[4].
2.1 시뮬레이션 환경 구축
시뮬레이션에서 사용한 모의로봇은 ROBOTIS 사의 turtlebot3_simulation 패키지의 burger 모델을 사용 하였으며[5], turtlebot3_autorace_for_autorace.urdf. xacro 파일을 이용해 구현되었다. 다음 Fig. 2는 모의 로봇과 시뮬레이션 환경을 만들기 위한 launch 파일을 나타낸 것이다.
Fig. 1 Gazebo world example
Fig. 2 launch file for the construction of robot and simulation world
모의 로봇의 초기 위치와 방향과 함께 지도상에 노란색 라인을 표시하는 세계(lf1.world)를 지 정하였으며, 시뮬레이션 시작 조건을 중지(paused) 모드로 설정함으로써 비교 관찰이 용이하도록 하 였다. 또한 시뮬레이션은 ROS 환경에서 라인 트 레이서 모의를 위한 환경 구축과 태스트를 위한 것 으로써 주로 3 개의 센서 토픽(/odom, /cmd_vel, /camera/image)과 1개의 에러검출용 토픽을 사용 하였다. 여기서 /odom 토픽은 로봇의 위치(pose) 를 파악하기 위해, /cmd_vel 토픽은 로봇에 이동 명령을 전달하기 위해, 그리고 /camera/image 토 픽은 카메라 이미지를 모의하기 위해 사용하였으 며, 편의상 이름을 변경(remap) 하였다.
2.2 라인 및 Ground 변경하기
시뮬레이션 세계를 구축하기 위한 라인, 지면 등의 객체들은 sdf 파일을 통해 직접 설정하거나 또는 CAD 작업을 통해 작성된 도면을 STL 또는 DAE 파일로 변환해서 gazebo 상에 불러올 수 있 다. 또는 png 이미지 파일을 통해 지면 이미지를 구현할 수도 있다. 본 연구에서는 YugAjimera에 서 제공하는 XML 구문으로 작성된 세계를 본 연구 환경에 맞게 수정해서 사용하였다[6]. 먼저 여 기서 벽(wall)은 본 연구에서는 불필요하기 때문에 제거를 하였으며(향후 lidar를 모의할 경우에는 필 요함), 라인이 겹쳐지는 부분을 미세 조정해서 모 서리 부분을 가능한 한 줄이고자 하였다. 라인의 경우 선의 폭와 길이, 원점 위치 및 색상 등을 변 경할 수 있으며 지면(ground) 부분의 색상과 재질 도 변경이 가능하도록 하였다. 그 다음 링크(link), 시각(visual), 운동학(kinematic), 중력 및 포즈 (pose) 프레임과 같은 매개변수도 해당 world 파 일을 직접 설정함으로써 변경이 가능하다.
Fig. 3 Map configuration for line tracer(red: x-axis, green: y-axis, blue: z-axis)
Fig. 3은 본 연구에서 사용한 라인 구성의 예를 나타낸 것으로써 단순히 8 개의 직선을 사용해 구성하였다. 여기서 격자간 거리는 1 미터이다. 그림에서 녹색 사각형은 태양 조명을 모의한 것이 고, 원점 부분의 직선은 각각 x축(red), y축 (green), z축(blue) 방향을 나타낸다.
Fig. 4는 world 파일에 있는 8 개의 직선 중 6 번째 라인에 대한 설정 부분을 표시한 것으로 <collision>, <friction>, <geometry>, <material> 등을 설정할 수 있는 것을 알 수 있다. 여기서는 편의상 라인 폭을 10 cm로 설정하였다.
Fig. 4 line configuration example
Fig. 5 various line/ground examples (top left: Dark Yellow/ DarkGrey, top right: Yellow/Residential, bottom left: Yellow/Road, bottom right: Dark Yellow/ Asphalt)
본 연구에서는 조명 설정은 기본적인 값을 사 용하였지만 라인 색과 지면은 Gazebo에서 제공하 는 여러 재질(materials) 중에서 선택이 가능하도 록 하였다.
Fig. 5는 그 중 하나의 예시로써 라인색은 노란 색(Yellow)과 어두운 노란색(DarkYellow)를 사용 하였으며, 지면 재질은 다음 4 가지(DarkGrey, Road, Residential, Asphalt) 중에서 하나를 선택 해서 사용할 수 있도록 함으로써 시뮬레이션 환경 을 좀 더 다양화하고자 하였다.
3. 라인 트레이서 ROS 패키지
3.1 ROS 패키지 구성
ROS 환경에서 프로그램의 작성 단위는 패키지 (package)이며, 실행 단위는 노드(node)이다. 본 연구에서는 python(버전 3.8)을 사용해 라인 트레 이서 ROS 패키지를 구축했으며, 최종적으로 작성 된 패키지의 트리 구성은 Fig. 6과 같다. worlds 폴더에 있는 파일들은 world에 대한 구성 파일로써 라인 및 지면 특성 변경이 가능하도록 하였으며, test_world.launch 파일은 Fig. 3에 표시된 이미 지와 같이 로봇과 지도가 포함된 시뮬레이션 환경 을 생성하기 위한 launch 파일이다.
Fig. 6 ROS package configuration for line tracer
scripts 폴더에는 4개의 파일이 있으며, 이중에 서 move_robot.py는 시뮬레이션 환경에서 로봇 을 구동하기 위해 /cmd_vel 토픽을 게시(publish) 하기 위한 노드이며, 나머지 3 개의 python 파일 들은 라인 트레이서 카메라의 이미지 데이터에 대 한 이미지 처리와 제어(P 및 PID)를 담당하는 노드들이다.
이 중에서 line_follower_basics.py 파일은 수 신된 이미지 토픽에 OpenCV 이미지 처리함수를 적용해서 색상의 중심을 도출하고 표시함으로써 이미지 처리 과정을 확인하기 위한 노드이다. 그 리고 다른 2 개의 파일(follow _line_step_hsv_p. py, follow_line_step_hsv_ pid.py)은 색 중심과 이미지의 폭 중심까지의 거리를 기반으로 한 오차 를 추종하기 위해 각각 비례(P) 제어와 PID 제어 를 적용해 로봇을 구동하기 위한 노드들이다[7].
3.2 OpenCV를 이용한 라인 트레이서 노드
OpenCV는 컴퓨터 비전 및 기계 학습에 집중 된 오픈 소스 라이브러리로써 주로 이미지 처리, 비디오 캡처, 물체 및 얼굴 감지와 같은 동작을 수행할 때 사용된다. 하지만 OpenCV가 bgr8 인 코딩을 사용하는 반면에 ROS 이미지는 RGB 인 코딩이다. 따라서 먼저 burger 로봇에서 게시하는 이미지 토픽 데이터를 가져와서 OpenCV가 처리 할 수 있는 형식으로 변환해야 한다[8]. 이때 주로 사용되는 것이 CvBridge 클래스이다. 그 다음 ROS 이미지 데이터를 수신하는 수신자(subscriber)와 함 께 수신된 데이터를 처리하는 콜백(callback) 함수 를 선언한다. 주로 이 함수를 통해 원하는 작업을 수행하는 것이 일반적이다.
Fig. 7은 라인 트레이서 이미지처리 노드의 이미 지 처리 과정을 나타낸 개략도이다. 일반적으로 이 미지 크기는 컴퓨터 처리 속도에 크게 영향을 미치 기 때문에 이미지 자르기를 먼저 실시하였다. 그 다음 RGB 및 BGR 이미지 모두 채도(saturation) 에 매우 민감하기 때문에 BGR 이미지를 채도에 덜 취약한 HSV 이미지로 변환하였다. HSV의 기본 아이디어는 채도를 제거하는 것이며, HSV 값을 찾는 것은 쉽지 않기 때문에 ColorZilla와 같은 색상 선택기 도구를 사용해 RGB 값을 찾고 이를 HSV 로 변환한 후 HSV 색상의 상한 및 하한을 선택 하였다[6].
Fig. 7 Image processing for line tracer
HSV 임계값을 적용해 얻어진 이진 마스크 (binary mask)를 이용해 노란색이 아닌 모든 픽 셀을 제거한 후 모멘트(moment) 함수를 사용해 라인의 질량 중심(색 중심과 동일)을 계산하고 빨 간색 점으로 표시하였다[4]. 그 다음 로봇이 이 빨 간색 점을 추종할 수 있도록 이미지 너비 중심과 의 차이(오차에 해당)를 계산해서 비례(P) 또는 PID 제어를 통해 로봇을 제어하였다.
Fig. 8은 line_follower_basics.py 노드에 의해 Fig. 7의 처리 프로세스에 의해 얻어진 결과로써 라인 색은 노란색(Gazebo/Yellow)을, 지면은 아 스팔트(asphalt) 재질을 사용하였다. 그림의 우측 에 있는 이미지에서 볼 수 있듯이 원본 이미지 (Original, 640×480 pixels)와 함께 잘린 이미지 에 HSV 변환을 적용한 이미지(hsv), 마스크 이미 지(mask) 및 색 중심 이미지(res)가 적절히 얻어 지고 있는 것을 확인할 수 있다.
Fig. 8 Images obtained by line_follower_basics.py node
Fig. 9 Control code of PID for line tracer node
Fig. 9는 라인 트레이서의 제어 노드의 PID 제 어 코드 부분을 나타낸 것으로써 비례 제어 상수 (kp), 적분 제어 상수(ki), 이분 제어 상수 (kd)를 통해 제어를 실시하였으며, 전역 변수로써 설정하 였다. 그리고 다양한 값으로 변경해 보면서 적절 한 값을 찾는 작업(파라미터 튜닝)을 실시하였으 며, 변수를 줄이기 위해 ki 값은 Ziegler-Nichols 계수 조정법에 의해 얻어진 값을 사용하였다[9].
4. 시뮬레이션 결과
Fig. 10은 시뮬레이션을 실행했을 때의 노드 및 토픽을 나타낸 것으로써 gazebo의 이미지 토픽 (/camera/rgb/image_raw)을 PID 제어 노드가 수 신해서 이미지 처리/PID 제어를 실시한 후, 이를 바탕으로 로봇을 구동하기 위한 토픽(/cmd_vel)과 동작 특성을 파악하기 위한 에러 토픽(/error_x)을 게시되는 것을 확인할 수 있다.
Fig. 11은 컴퓨터에서 실제 라인 트레이서 시뮬 레이션을 실행했을 때의 화면으로써 지면 재질은 아스팔트, 라인 색은 노란색(Yellow), 로봇의 선속 도는 0.25 m/s인 경우이다. 우축에 있는 플롯 (rqt_plot)은 색 중심과 이미지 폭의 중심과의 차 이를 나타낸 오차 토픽 그래프로써 PID 계수를 추론하는데 활용하였다.
Fig. 10 Nodes/topics graph by rqt_graph command
Fig. 11 Display image when running line tracer simulation
Fig. 12는 위의 라인 트레이서 시뮬레이션 환경 에서 적절한 PID 계수를 찾기 위한 시뮬레이션 결과 중 하나로써 kd=0.15인 상태에서 kp 값을 0.002에서 0.016까지 변화시켜가며 오차 토픽 그 래프를 표시한 것이다.
그림에서 몇 개의 피크가 발생하는데 이것은 두 직선이 서로 연결된 곡선 부분을 로봇이 통과 할 때 발생하는 오차로써 상대적으로 큰 것을 알 수 있다. 또한 그림에서 알 수 있듯이 kp 값이 0.008보다 커지면 로봇이 순간적으로 진동이 발생 하며 불안정해지고 kp=0.016에서는 로봇이 라인 을 이탈하는 것을 볼 수 있다. 따라서 이 시뮬레 이션 결과에서는 kd=0.15인 경우에는 kp가 0.006 부근에서 상대적으로 안정한 동작을 하는 것을 알 수 있었다.
Fig. 12 Error graphs due to kp when kd=0.015 in case of PID control
Fig. 13 Error graphs due to kd when kp=0.006 in case of PID control
Fig. 14 Failure cases of line tracing due to kd and kp in case of PID control
Fig. 13은 Fig. 12의 경우와 반대로 kp=0.006 인 상태에서 kp 값을 0.005에서 0.02까지 0.005 씩 증가시켰을 때의 오차 토픽 그래프를 나타낸 것이다. 그림에서 알 수 있듯이 kd 값이 작을 때 는 비례제어 성분이 상대적으로 커서 진동이 발생 하지만 0.02 이상이 되면 순간적인 진동으로 인해 오히려 이탈가능성이 점점 커지는 것을 알 수 있 었다.
Fig. 14는 라인 트레이서가 경로에서 이탈하는 몇 가지 경우에 있어서 kp와 kd 값을 나타낸 것 이다. 이러한 올바른 PID 계수를 선정할 때 중요 한 지표가 될 수 있다[7,10].
Fig. 15는 한라대학교에서 제작한 경진대회용 트랙(race track)으로 경로 폭이 5 cm로 우리가 제작한 트랙의 1/2 수준이다. 기존 시뮬레이션 결 과와 비교하기 위해 이 트랙을 사용해 Fig. 12에서 수행된 것과 동일한 조건에서 시뮬레이션을 실시 했으며, 그 결과를 Fig. 16에 표시하였다. Fig. 12와 16을 보면 거의 유사한 결과가 얻어진 것을 알 수 있다. 따라서 본 연구에서 얻어진 라인 트레이 서 시뮬레이션 환경은 다른 gazebo world에서도 잘 적용될 수 있는 것을 알 수 있었다.
Fig. 15 Autonomous driving track (produced by Halla University)
Fig. 16 Error graphs due to kp when kd=0.015 in the autonomous driving track (PID control)
5. 결 론
본 연구에서는 ROS 환경에서 Gazebo world를 사용해 라인 트레이서 시뮬레이션 환경을 구축하 였으며, 라인 색과 지면 재질 등 여러 파라미터들 을 변경할 수 있도록 하였다. 이를 바탕으로 비례 (P) 또는 PID 제어를 통해 로봇을 구동할 수 있는 패키지를 제작하고 오차를 최소화하기 위한 PID 계수 조정을 실시하였다. 시뮬레이션 결과에 서 알 수 있듯이 자율주행 및 로봇 공학 분야에서 ROS 환경에서 Gazebo world를 이용해 패키지를 구축하고 이를 활용해서 코드를 분석 및 검증하는 모듈식 접근 방법은 비용 및 시간 측면에서 매우 효율적이다. 또한, 센서 판독과 속도 제어 등의 정보 표준화 등을 통해 프로그래머는 전적으로 알 고리즘개발에 집중할 수 있다는 장점도 있다.
향후에는 본 연구에 이어서 PNG 파일을 이용 한 추가적인 Gazebo 세계들과 함께 Lidar와 IMU 센서 등을 포함한 환경에서 로봇 제어 방법에 대 한 연구를 진행하고자 한다.
References
- 김학준, 강수민, 김동환, "Gazebo 시뮬레이터를 활용한 고층 건물에서의 이동 로봇 실내 자율주행 알고리즘 개발", Journal of Institute of Control, Robotics and Systems Vol. 28 No.8, pp.758-767, (2022). https://doi.org/10.5302/J.ICROS.2022.22.0093
- 정양근, 임오득, 김민성, 도기훈, 한성현, "휴머노이드 로봇 관절 아암의 운동학적 해석 및 모션제어에 관한 연구", 한국산업융합학회 논문집 제20권 1호, pp. 49-54, (2017). https://doi.org/10.21289/KSIC.2017.20.1.049
- 정양근, 심현석, 이우송, 한성현, "영상 피드백에 의한 4축 스카라 로봇의 실시간 궤적추적제어에 관한 연구", 한국산업융합학회 논문집 제17권 3호, pp. 136-144, (2014). https://doi.org/10.21289/KSIC.2014.17.3.136
- O. S. R. Foundation : Building a world, (2014) https://bit.ly/2HN90FI
- 표윤석, 조한철, 정려운, 임태훈: ROS 로봇 프로그래밍, 루비페이퍼, pp. 293-324, (2019).
- P. Shalini, P. M. Fani, E. M. Vela, "Line Detector ROS Node", ResearchGate (2019) DOI: 10.13140/RG.2.2.28947.94247
- Open Robotics, Pid (2018) http://wiki.ros.org/pid
- RaduBogdanRusu, cv bridge (2010) https://bit.ly/2EK1MAA
- Wikipedia, Ziegler-Nichols method https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method
- 김윤정, 김진산, 이선영, 민경원, "Gazebo와 ROS를 사용한 자율주행 제어 시스템 환경 구축", 2018년 대한전자공학회 추계학술대회 논문집, pp.621-624, (2018).