Indoor 2D Navigation - 개요 & 좌표범위내 신호 출력 노드

2 minute read

프로젝트의 목적

본 프로젝트의 목적은 Kobuki 로봇을 사용하여 대학의 로봇관 건물을 자율주행 할 수 있도록 여러 SLAM 기법이나 Navigation 패키지를 사용해 보고, ROS 패키지를 제작하여 ROS와 우분투 환경에 익숙해지는 것입니다. 차후 있을 3D 라이다를 사용한 실내 자율주행 로봇 과제 등을 수행하기 위해 기본적인 사용법을 익히는 것을 목표로 하고 있습니다.

프로젝트 계획

프로젝트의 진행 계획은 다음과 같습니다. 이 계획은 진행 상황에 따라 수정될 수 있습니다.

  1. Kobuki 패키지 작성
  2. map에서 특정 좌표를 기준으로 일정 범위 내에 위치하면 신호 출력 노드
  3. 좌표를 파라미터화(yaml, dynamic_reconfigure)
  4. gmapping, cartographer mapping 실습
  5. amcl, cartographer pure localization을 사용한 localization
  6. move_base를 사용한 자율주행

패키지 작성 전 Prerequisite

1. Kobuki 패키지 설치

Kobuki 운용을 위해서는 Kobuki 패키지 설치를 해야합니다. 기존에 사용하던 catkin_ws를 사용해도 되지만 저는 새로운 작업공간 kobuki_ws를 생성했습니다.

$ mkdir -p kobuki_ws/src

그 후 src폴더에 Kobuki 패키지를 설치합니다.

$ cd kobuki_ws/src
$ git clone https://github.com/yujinrobot/kobuki.git

이때 이 Kobuki 패키지에 필요한 ROS 패키지들을 설치하기 위해 다음의 명령어를 통해 패키지들을 설치합니다.

$ sudo apt-get install ros-melodic-kobuki*
$ sudo apt-get install ros-melodic-ecl*

마지막으로 의존성을 설치하여 마무리합니다.

$ cd ~/kobuki_ws
$ rosdep install --from-paths src --ignore-src -r -y
$ catkin_make

2. Turtlebot3 패키지 설치 (선택)

패키지를 작성할 때 Turtlebot3 패키지를 참고할 일이 많기 때문에 Turtlebot3 패키지를 설치해 두는 편이 좋습니다. 직접적인 사용은 하지 않을 것이기에, 설치하기 싫다면 필요할 때마다 Turtlebot3 github 링크를 참고해도 괜찮습니다.

$ cd ~/kobuki_ws/src
$ git clone -b melodic-devel --single-branch https://github.com/ROBOTIS-GIT/turtlebot3.git
$ cd ~/kobuki_ws
$ rosdep install --from-paths src --ignore-src -r -y
$ catkin_make

map에서 특정 좌표 범위 내 위치시 신호 출력 노드

첫번째로 저희가 시도한 것은 map의 특정 좌표를 주고, 로봇이 그 좌표로부터 일정 범위 내에 들어가면 신호를 보내는 것이었습니다. map 좌표계로부터 로봇의 base_link(base_footprint) 좌표계로 transform(좌표계 변환)하여 map 좌표계를 기준으로 로봇이 어느 좌표에 있는지를 알 수 있습니다.

사실 조금 진행된 프로젝트라서 이미 앞서 정리할 여러 기능들이 추가되어 있습니다. 동영상에 나오는 기능은 신호 출력 노드와 dynamic reconfigure(동적 파라미터 수정), 그 외에 Kobuki를 조종하거나 lidar 동작 기능을 포함하였습니다.

좌표를 파라미터화 (yaml, dynamic reconfigure)

yaml 파일 작성

yaml 파일은 패키지의 설정값을 저장하는 파일입니다. 노드는 이 파일을 참고하여 소스에 값을 전달합니다. 예를 들어 point.yaml 파일의 내용물이 다음과 같다고 합시다.

x: 13
y: 20

저희가 만든 패키지의 소스에 필요한 특정 좌표 부분을 yaml 파일로 작성한 것입니다. 노드를 실행하였을 때, 자동으로 yaml 파일을 참고하여 $x$, $y$ 값을 가져오면, 매번 소스를 건드리지 않고도 설정을 바꿔 줄 수 있습니다. 하지만 yaml 파일을 수정할 때 마다 catkin_make를 다시 해 주어야 하니 번거롭기는 합니다.

dynamic reconfigure

dynamic reconfigure는 동적 파라미터 수정으로, 노드에 설정되는 파라미터를 수정해 줌으로서 프로그램 실행 중에도 계속 파라미터를 바꿀 수 있도록 하는 도구입니다. rosparam 명령어 또는 yaml 파일로도 계속하여 수정해 줄 수 있지만 매번 명령어를 치거나 catkin_make를 해야 하는 번거로움이 있습니다. dynamic reconfigure는 GUI를 지원하는 rqt를 통해 수정할 수 있습니다. 이번 프로젝트 같은 경우 처음에는 특정 좌표를 소스 상에서 설정해 주었으나, dynamic reconfigure 기능을 통해 좌표를 계속해서 재설정할 수 있도록 기능을 추가하였습니다. 소스는 다음과 같습니다.

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <indoor_2d_nav/dyn_reconfig_testConfig.h>

void callback(indoor_2d_nav::dyn_reconfig_testConfig &config, uint32_t level) {
    ROS_INFO("\nstr_posexy: %s", config.str_posexy);
}

int main(int argc, char **argv) {

    ros::init(argc, argv, "dynamic_reconfigure_test");

    dynamic_reconfigure::Server<indoor_2d_nav::dyn_reconfig_testConfig> server;
    dynamic_reconfigure::Server<indoor_2d_nav::dyn_reconfig_testConfig>::CallbackType f;

    f = boost::bind(&callback, _1, _2);
    server.setCallback(f);

    ros::spin();
    return 0;
}

다음 게시글

오랜만에 게시글을 수정하여 바뀐 점이 많습니다. 우선 다음 게시글에서는 Cartographer 사용법에 관하여 정리하도록 하겠습니다.

Refstop

Refstop

Deep Learning 및 SLAM을 공부하고 있습니다.

Comments

  Write a comment ...