SLAM


GMAPPING 


로봇을 적당한 곳에 두고 ssh로 접속합니다. 

[내 PC] roscore를 실행하고, 

[로봇] roslaunch omo_r1mini_bringup omo_r1mini_robot.launch 도 실행하고 

ssh로 로봇에 한 번 더 들어가서 

[로봇] roslaunch omo_r1mini_slam omo_r1mini_slam.launch 을 실행하고,  

[내 PC] roslaunch omo_r1mini_slam omo_r1mini_slam_rviz.launch 를 실행해줍니다. 

그러면 rviz(알비즈)가 뜹니다. 

[내 PC] roslaunch omo_r1mini_teleop omo_r1mini_teleop_key.launch 를 실행하고 

[내 PC] 키보드로 로봇을 움직여보면 RVIZ에서 map이 완성되는 것이 보입니다. 

다 완성했다 싶으면,

적당한 시점에 teleop.launch 를 중지해 맵 만들기를 멈추고, 

[내 PC] rosrun map_server map_saver -f map 으로 맵을 저장합니다. 

이제 터미널에서 실행 중인 모든 노드를 중단한 후에, 


  • 내 PC와 로봇의 모든 터미널, 즉 roscore까지 전부 중단해주세요. 

[내 PC] map.pgm 파일과 map.yaml 파일을 omo_r1mini/ omo_r1mini_navigation/maps 에 복사해줍니다. 


sudo cp map.pgm map.yaml catkin_ws/src/omo_r1mini/omo_r1mini_navigation/maps


  • 잘 따라하셨다면 내 PC의 홈(cd ~)에 파일이 있습니다.

다시 내 PC에 roscore를 실행하고 로봇에서 roslaunch omo_r1mini_bringup omo_r1mini_robot.launch을 실행하고 난 후,

내 PC에서 roslaunch omo_r1mini_navigation omo_r1mini_navigation.launch를 실행해주세요. 

[내 PC] roslaunch omo_r1mini_navigation omo_r1mini_navigation_rviz.launch도 실행해줍니다. 

그러면 rviz에서 이런 화면이 뜨는 걸 확인할 수 있습니다. 

RVIZ의 상단 메뉴에서 2D pose estimation버튼을 클릭하여 초기 위치를 잡아주세요. 

그리고 2d new goal을 이용해서 목표 지점을 알려줍니다. 

그러면 로봇이 스스로 목표 지점까지 가는 것을 확인할 수 있습니다. 

기어비 수정


내 PC와 로봇의 터미널 모두를 omo_r1mini 폴더까지 이동한 후 

git pull로 당겨주세요 


  • 기존에 다운 받은 패키지들을 업데이트하기 위해서입니다.

그 후, 다음 과정을 수행하면 됩니다. 


  • 내 PC에서 roscore 
  • 로봇에서 roslaunch omo_r1mini_bringup omo_r1mini_motor_setting.launch
    • 이 때 로봇 모터가 자동으로 회전하기 때문에, 로봇 본체 아래에 무언가 받쳐두는 방식 등으로 로봇 바퀴를 지면에서 띄워 두어야 합니다. 
  • 모터의 동작이 끝나면 로봇을 재부팅 합니다. 

Previous Story 


이제 로봇을 장애물이 없는 적당한 곳에 위치 시키고, 

내 PC에서는 roscore를, 로봇에서는 


  • 까만색 HLDS 라이다를 가진 분들은 omo_r1mini_robot_hlds.launch 
  • 파란색 YD 라이다를 가진 분들은 omo_r1mini_robot.launch

를 실행합니다.

혹시 화면에 데이터가 몇 개 나오다가 멈추면 

ctrl + C로 중단하고 

다시 omo_r1mini_robot_hlds.launch를 실행해줍니다. 


  • 파란색 ydlidar를 가지고 있는 분들은 omo_r1mini_robot.launch 실행해주세요. 

이제 로봇에서 omo_r1mini_slam.launch를 실행하고 

내 PC에서 omo_r1mini_slam_rviz.launch를 실행해주면 

rviz에서 이런 화면이 나타나는걸 볼 수 있습니다. 

이 상태에서 내 PC에서 새 터미널을 띄우고, 

omo_r1mini_teleop_key.launch로 

로봇을 조종해서 맵을 넓혀주세요. 

얼추 다 만들어 졌다면 teleop을 중단한 뒤, 

로봇에 ssh로 접속하고 

만든 map을 저장합니다. 

그러면 이렇게 map으로 시작하는 파일이 2개 생성됩니다. 

아래 명령으로 해당 경로에 복사해주세요~ 

실행 중이던 내 PC와 로봇의 터미널을 전부 종료하고~ 

내 PC와 로봇에 각각 이렇게 실행합니다. 


  • 프롬프트 이름을 잘 확인하세요.
  •  여기선 pw = 내 PC / r1mini = 로봇 입니다. 

그 후에 뜨는 이런 화면에서 

2D pose estimation으로 자기 위치를 잡아주시구요. 

잘 맞추었다면 

가고 싶은 곳과 자세를 지정하면 됩니다. 

그럼 좀 다른 방식으로 가볼까? 


amcl_pose 토픽을 열람해봅시다.  

현재 좌표와 자세가 나오는데요. 

지난번 설치한 jupyter notebook을 실행하고, 

화면도 적당히 배치하고, 

새 파일을 만들고, 


  • Jupyter 다루기 참고
  • 이미 실행한 파일이 있을 경우, 메뉴의 Kernel - Restart & Clear Output 선

필요한 모듈을 import 하고, 


import rospy

import actionlib

from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal

from math import radians, degrees

from actionlib_msgs.msg import *

from geometry_msgs.msg import Point

node를 초기화하고, 


rospy.init_node('map_navigation', anonymous=False)

ac = actionlib.SimpleActionClient("move_base", MoveBaseAction)

현재 위치를 읽어줍니다. 


저는 이제 현재 위치에서 x 방향으로 한 20cm 정도 앞으로 가는 것을 목표로 잡았습니다. 

가야 할 위치를 지정해주고요. 


goal = MoveBaseGoal()

goal.target_pose.header.frame_id = "map"

goal.target_pose.header.stamp = rospy.Time.now()


goal.target_pose.pose.position = Point(0.45, -0.777, 0)

goal.target_pose.pose.orientation.x = 0.0

goal.target_pose.pose.orientation.y = 0.0

goal.target_pose.pose.orientation.z = 0.0

goal.target_pose.pose.orientation.w = 0.0

아래처럼 시작하라는 명령을 줍니다. 


ac.send_goal(goal)

움직이고 싶은 각도를 결정하고 quaternion으로 변경해볼까요. 

변경했습니다. 

그러면 회전만 일어나네요^^ 

추가 사항 


하나 덧붙일 것은, 회전 중심이 여기에 위치 하는 줄 알았는데  

로봇의 무게로 눌러져서 아래 이미지가 회전 중심이 됩니다. ㅠㅠ 

혹시 라이다에 의해 그려지는 지도가 회전하는 문제가 발생하면, 

튜닝 하실 때 휠 사이 간격을 138mm (최대 150mm) 로 바꾸어 보시는 것도 하나의 방법이 될 것 같습니다.