3 분 소요

ROS공부를 다시 시작하다!(1)

현재 내가 하고 있는 프로젝트를 진행하기 위해서는 자율주행기술이 일부 들어가야 한다. 이를 흉내 내기 위해서는 ROS를 알아야 하는 것이 필수적이다. 그리고 여기서 배운 것들을 추후에 라즈베리파이에 넣을 것이다.

이를 위해 블로그 사이트(링크)를 참고하여 캣킨과 작업공간, 패키지에 대해서 알아보았다.

1.캣킨에 대해 알아보자!

ros에서는 다양한 패키지들을 지원한다. 5월1일에 진행된 국제EV 자율주행경진대회를 회고해보자면 우리가 흔히 알고 있는 시뮬레이션 패키지인 Gazebo, Rviz뿐만 아니라 터틀봇이 있으면 해당 로봇이 주행하는데 있어 필요한 맵, 이 맵을 딸수 있는 mapping 패키지랑 해당 그려진 맵을 최단거리로 이동할 수 있도록 경로를 플래닝 해주는 planning 패키지 등을 제공해준다. 근데 이 패키지라고 하는게 결국은 소스코드를 깔쌈하게 묶어놓은 거란 말이지!

따라서! 위와 같이 해당 패키지를 서비스로 이용하려면 중간에 빌드라는 과정이 필수적이다. 역으로 ROS는 빌드한 결과물을 호출해와서 내가 만들려는 프로그램에 사용할 수 있도록 지원해준다고 볼수가 있겠다. 바로 이때! 사용하는 시스템이 바로 캣킨이라고 하는 것이다.

위키에 따르면, 캣킨을 이용해서 간단한 개발을 하려는 유저의 수준에서는 두가지 파일만 알고 있으면 된다고 한다.

2.작업공간에 대해 알아보자!

나는위 링크를 기반으로 chatGPT의 형님의 도움을 받아가면서 라즈비안 OS 위에 ROS Noetic을 설치하고 있다. 그 과정에서 현재까지 작업된 디렉토리에 대해 나타내자면 다음과 같다.

POWERPNT_rbMsb41fP6

여기서 우리가 주목할 부분은 우선 ros_catkin_ws이다. (물론 다른 것도 중요하지만, 일단은 요것만 설명하기로 한다.)

그리고 한가지 해명 아닌 해명을 하나 하자면, ros는 우분투와 호환성이 높다. 따라서 예전에 Ubuntu 22.04환경에서 ros환경 작업을 진행할때는 ~/catkin_ws으로 나름 단순하게? 작업환경을 구축해 놓았다. 하지만 내가 찾아본 바로 라즈비안OS에서 ROS환경을 설정할때는 좀 복잡한 것 같다고 판단된다. 따라서 다음과 같이 ros_env라는 이름의 독립적인 가상환경을 구축해놓고 해당 환경 안에서 ros작업환경을 구축하는 시니리오로 진행하게 되었다.

이를 위한 명령어는 다음과 같다.

1)가상환경 생성 및 활성화

# virtualenv 패키지 설치
sudo apt-get install python3-venv
​
# 가상환경 디렉토리 생성
python3 -m venv ros_env
​
# 가상환경 활성화
source ros_env/bin/activate

위와 같이 파이썬 가상환경 구축용 패키지를 다운받고 가상환경 생성하고 활성화를 통해 가상환경에 진입했다.

2)가상환경 사용

가상환경에 진입하면 커서 앞에 내용이 살짝 바뀐다. 원래 pi@raspbianos였다면, (ros_env)pi@raspbians로 바뀌게 된다.

이 독립된 환경에서 pip 또는 apt를 써서 패키지 설치를 진행하는게 가능하다.

3)가상환경 비활성화

deactivate

자! 그래서 이렇게 가상환경 안에 작업공간을 만들어두었다. (근데 생각해보니 예전에 윈도우 환경에서 프로젝트를 진행하고자 가상환경을 진행할떄 프로젝트 바로 아래에 env폴더를 만들고, 이거는 별도로 두고 작업공간을 peer(또래)관계로 두었던 기억이 있다. 그렇다.. 지금 내가 한게 틀린 것 같다는 것을 지금 글을 쓰면서 자각하고 있다ㅋㅋㅋㅋㅋ)

그래서 일단 작업했던거를 밀고 아래와 같이 다시 작업환경을 구축하려고 계획하였다.

POWERPNT_Fw2fsdIP56

이제 위와 같이 설정을 해주었다고 가정하고, 서브 디렉토리에 대해 알아보자면,

  1. build 디렉토리: C++을 사용하면 라이브러리와 실행 프로그램과 같은 캣킨 작업 결과 중 일부를 저장하는 곳
  2. devel 디렉토리: 빌드된 결과물(빌드된 패키지)들이 위치하는 디렉토리로, source devel/setup.bash명령을 통해 ROS환경변수가 설정된다.
  3. src 디렉토리: 모든 ros패키지의 소스코드가 포함된 디렉토리로, 각 패키지가 이 디렉토리 내에 개별폴더고 구성된다.

3.사용방법에 대해 알아보자!

내가 터틀봇을 움직이기 위해 mapping한 맵을 띄운다던지 하는 프로그램을 짜야 한다고 가정하자. 그러면 나는 어디다가 코드를 짜서 넣어야 할까?

바로 아래와 같이 진행하면 된다.

POWERPNT_8TCJFdmSrg

  1. catkin_ws를 만들었으면, 그 아래 src디렉토리를 생성한다.
  2. src 디렉토리 안에 개발할 ROS 패키지들을 생성하거나 클론한다.
  3. 패키지를 개발할 떄는 패키지 의존성을 package.xml파일에 명시하고, CMakeLists.txt파일을 통해 빌드 설정을 정의한다.
  4. catkin_make 또는 catkin build 명령을 사용하여 패키지를 빌드한다.
  5. 빌드 후에는 source devel/setup.bash 명령으로 ROS 환경변수를 설정하여 작업한 패키지를 사용할 수 있다.

4.패키지에 대해 알아보자!

위에서 우리는 계속 Package를 클론한다느니 직접 만든다느니, 패키지에 대한 빌드 설정을 정의한다느니, 패키지를 빌드한다느니, 사용한다느니,, 계속 언급했다!

그래서 이 실체에 대해 알아보려고 한다!

아래 공식을 주목하자! 패키지는 아래와 같이 되어있다.

Code + Data + Doc => Package

~/catkin_ws/src 디렉토리 아래에 turtlebot3_lds, turtlebot3_slam등 여러 패키지 디렉토리가 존재하는데,

각 패키지 디렉토리는 안에는 공통적으로 CmakeLists.txt 파일과 package.xml 파일이 존재한다.

CMakeLists.txt 파일

목적: ROS빌드 시스템인 catkin을 설정하기 위함. 설정정보를 저장, 빌드방법, 의존성 패키지 목록, 빌드할 노드 및 실행 파일등을 정의

example>

cmake_minimum_required(VERSION 3.0.2)
project(pigeon_gpio)

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
find_package(catkin REQUIRED COMPONENTS
	ropcpp
)

find_package(Boost REQUIRED COMPONENTS system)
set (wiringPi_include "/use/local/include")

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)

## Uncomment this if the package has a setup.py. This macro ensure
## modules and global scripts declared therein get installed
## See http://ros.rog/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

package.xml 파일

목적: ROS패키지의 메타 데이터를 정의하기 위함. 패키지의 이름이라던자, 버전, 저자정보, 의존성 패키지 목록 등을 기술함

example>

<?xml version="1.0"?>
<package format="2">
  <name>my_first_package</name>
  <version>0.0.0</version>
  <description>The my_first_package package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="seopaul@todo.todo">seopaul</maintainer>

  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>

  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/test1</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>rospy</build_depend>
  <build_export_depend>rospy</build_export_depend>
  <exec_depend>rospy</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

댓글남기기