카테고리 없음

패스트캠퍼스 환급챌린지 41일차 : 자율주행 로봇을 위한 ROS2 & Nav2 한번에 끝내기 강의 후기

연두부진 2025. 4. 14. 23:40

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

오늘은 AMCl 기반 Localization을 수행할 때는

초기 위치를 정해줘야 하며

그 초기 위치를 정하는 여러 가지 방법에

대해서 실습을 통해 알아보았다.

 

[오늘의 수강 영상]

 

[오늘의 실습]

 

초기 위치를 설정하는 방법에는 3가지가 있다.

 

1. YAML 파일에서 초기 위치 설정하기

 

이거는 우리가 어제 봤던 YAML 파일에서

위치를 수정하는 방법이다.

 

YAML 파일에 아래와 같은 부분이 있는데

 

이 상태에서 AMCL을 켜면 아래와 같은 위치에 있다.

 

그러고 나서 x = 5.0, y = 5.0, yaw = -3.141592로 바꾸고 나서

 

AMCL을 재시작하면 아래와 같은 위치로 바뀐 걸 알 수 있다.

이때 grid 한 칸이 1m이다.


여기에서 어제 배웠던 dynamic reconfigure를

사용하여 실시간으로 위치를 바꿔보려고

시도했더니 움직이지 않는 걸 확인할 수 있었다.

 

강사님께 여쭤보니 초기 위치 같은 경우에는

프로그램을 처음 시작했을 때 로드되고

계속해서 확인하지 않기 때문에

실시간으로 변경하는 것이 불가능하다는 것을

알게 되었다.


2. 터미널에서 초기 위치 설정하기

 

이는 명령어를 사용해서 초기 위치를 변경하는 방법이다.

 

초기 위치를 명령어에 입력을 해주려면

로봇을 이동시키고자 하는 위치의 좌표를 알아야 한다.

 

이를 알아내기 위해서 2가지 방법을 사용할 수 있다.

 

1) initialpose 토픽 사용하기

 

이는 Rviz2에서 2D Pose Estimate를 사용하여

초기 위치를 지정할 때 Rviz2는 initialpose라는 토픽에

메시지를 publish 하게 된다.

 

이를 통해서 우리가 지정한 초기위치를 확인할 수 있다.

 

이를 확인할 수 있는 명령어는 아래와 같다.

$ ros2 topic echo /initialpose

 

이를 아래와 같이 실시하면

 

아래와 같이 반환되는 것을 볼 수 있다.

 

이런 식으로 계속 2D pose estimate를 진행하면

아래와 같이 값들이 계속 쌓이는 것을 볼 수 있다.

 

2) clicked_point 토픽 사용하기 

 

이는 Rviz2에 있는 Publish Point를 사용하여

원하는 부분을 찍으면 clicked_point라는 토픽에

메시지를 publish 하게 된다.

 

Publish Point는 아래와 같이 생겼다.

 

이를 확인하기 위해서는 아래와 같은 명령어를 사용한다.

$ ros2 topic echo /clicked_point

 

이를 수행하면 Publish Point를 사용해서

원하는 곳을 클릭하면 그 장소의 좌표를 알 수 있게 된다.

 

이를 수행하면 아래와 같다.


이 두 가지 방법을 사용해서

어떤 한 점의 위치를 알게 된다면

 

이제 아래에 써져 있는 명령어를 사용하여

위치를 publishing 하면 초기위치를 설정할 수 있다.

$ ros2 topic pub -1 /initialpose geometry_msgs/msg/PoseWithCovarianceStamped "

{header: {stamp: {sec: 0}, frame_id: 'map'}, pose: {pose: {position: {x: 5.0, y: 0.0, z: 0.0}, orientation: {w: 1.0}}}}"

 

여기에 원하는 위치, 방향을 입력하면 되고

frame_id에 map이 써져 있는 것은 map 기준으로

뒤에 있는 좌표를 설정한다는 뜻이다.

 

이것들을 사용해서 실제로 실습을 진행해 보면

우리가 원하는 위치를 Publish Point로 찍어보니 아래와 같이 나왔다.

 

그래서 위에 알려준 명령어를 사용하여 초기 위치를 설정해 보았다.

 

그랬더니 (0,0)에 있던 로봇이 (5.0, -5.0)으로 이동하였다.


이 방법에 대한 설명을 들었을 때

명령어를 사용하여 초기 위치를 설정하는 것보다

 

2D pose estimate나 Publish Point를 사용해서

publish 된 값들을 직관적으로 알 수 있다는 것이

더 기억에 많이 남았다.

 

왜냐하면 실제로 localizationd을 진행할 때

로봇의 초기 위치를 설정하는 건 무척 중요한데

grid가 없는 부분은 정확한 좌표를 사람눈으로는

알 수 없으니 이 방법들을 사용하면 너무 편하게 할 수 있겠다는

생각이 들었기 때문이다.

 

그리고 여기에 있는 {stamp: {sec: 0}라는 것이

궁금해서 알아보았다.

 

{stamp: {sec: 0}는 geometry_msgs/msg/PoseWithCovarianceStamped에 있는

time stamp라는 메시지에 들어가는 것이고

이는 이 메시지가 언제 생성되었는지를 나타내는 시간정보이다.

 

이를 sec : 0으로 두면

이는 Unix 시간 기준 1970년 1월 1일 00:00:00 UTC를 

의미하며 sec는 다른 센서 데이터들과

동기화하기 위해서 사용된다.

 

그래서 더 알아보았더니

sec를 publish 할 때 생략하게 되면

자동적으로 현재시각으로 설정되므로

이 방식을 추천한다고 한다.


3. 코드 상에서 초기 위치 설정하기

 

위 두 가지 방식으로 초기위치를 설정해도 되지만

 

첫 번째 방법은 정확한 초기위치를 설정하기 어렵고

두 번째 방법은 과정을 여러 개 거쳐서 위치를 설정해야 하기 때문에 번거롭다.

 

따라서 Publish Point로 어떤 포인트를 찍었을 때 해당 좌표를

출력해 주면서 바로 그 좌표를 초기위치로 하여 로봇을 이동시켜 주는 코드를

작성하여 초기 위치를 설정하도록 한다.

 

코드 상에서 초기 위치는 이와 같이 설정하고

완전 초기 위치를 publish 할 때는 initialpose 토픽을

사용해서 위에 포즈를 publish 해준다.

 

timer_callback을 사용해서 초기 위치를 trial_count 수만큼

여러 번 보내주면서 초기 위치를 설정해 준다.

 

이렇게 하는 이유는 좌표를 코드로 한 번만 보냈을 때

제대로 publishing 되지 않는 상황이 가끔 발생하기 때문에

여러 번 보내줘서 이 상황을 해결하기 위해서 이다.

 

그러고 나서 설정하고자하는 초기위치를 rviz2에서 Publish Point로

설정하면 clicked_point를 통해 값이 코드로 publish 된다.

 

그러면 그 값을 받아 quaternion으로 변환시켜

다시 initialpose 토픽으로 그 값을 rviz2로 publish 해서

새로운 초기위치로 로봇을 이동시켜 준다.

 

이를 수행하기 위해 아래 명령어를 사용해서 실행해 보자.

$ ros2 run localizer_server init_pose

 

처음에 5번 우리가 직접 설정했던 pose를

보내주고 Publish Point로 원하는 장소를 찍었더니

아래와 같이 값이 주고받아지면서 로봇의 위치가 변경되었다.

 


이 방법에서 두 가지 토픽을 사용하여

우리가 더욱 편하게 초기위치를 설정할 수 있도록

코드를 짜고 진행하였는데

 

앞으로 코드를 통해 값들을 publish 하고

subscribe 하는 것이 많이 사용될 것이기 때문에

 

나중에 직접 코드를 짜야하는 상황이 왔을 때

이때를 생각하면서 잘 수행해 봐야겠다.

 

오늘 강의를 통해 다양한 방식으로 초기위치를 설정하는 방법을

알게 되었는데 필요한 순간에 필요한 방식을 사용할 수 있도록

잊지 않고 잘 기억하고 있어야겠다. 


공부 시작시간
공부 종료시간

 

#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완

https://bit.ly/4hTSJNB

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr