ROS2 클라이언트 라이브러리, 패키지
워크스페이스 만들기
워크스페이스는 ROS2 패키지들을 담고 있는 하나의 디렉토리다.
Overlay 라는 옵션이 가능한데, 이것은 두번째 워크스페이스에서 새로운 패키지를 추가하더라고 기존에 있던 워크스페이스와 어떤 간섭도 없을 것이라고 한다.
overlay, underlay 계층을 많이 쌓는것도 가능하다.
ROS2와 colcon, rosdep 을 깔아놔야 한다.
rosdep 은 이렇게 설치한다.
# ROS Noetic
sudo apt-get install python3-rosdep
# ROS Melodic and earlier
sudo apt-get install python-rosdep
아니면 pip 로 설치해도 된다.
sudo pip install -U rosdep
그리고나서 다음 두 줄을 적용해준다.
설치한 다음에 한번만 해주면 된다.
$ sudo rosdep init
$ rosdep update
$ mkdir ros2_dev_ws
$ cd ros2_dev_ws/
$ mkdir src
$ git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
그리고 dependency 문제가 있을 지도 모르기 때문에 다음을 해준다.
rosdep install -i --from-path src --rosdistro <distro> -y
항상 해주는게 좋다. 안그러면 빌드 문제가 있을 수 있기 때문에.
$ rosdep install -i --from-path src --rosdistro foxy -y
#All required rosdeps installed successfully
잘 됐다고 나온다.
이제 빌드 한다.
$ colcon build
Starting >>> turtlesim
Finished <<< turtlesim [11.9s]
Summary: 1 package finished [12.0s]
$ ls
합계 24
drwxrwxr-x 6 lionelj lionelj 4096 1월 11 15:48 ./
drwxr-xr-x 55 lionelj lionelj 4096 1월 11 15:01 ../
drwxrwxr-x 3 lionelj lionelj 4096 1월 11 15:48 build/
drwxrwxr-x 3 lionelj lionelj 4096 1월 11 15:48 install/
drwxrwxr-x 3 lionelj lionelj 4096 1월 11 15:48 log/
drwxrwxr-x 3 lionelj lionelj 4096 1월 11 15:01 src/
colcon build 의 다른 옵션들
--packages-up-to : 원하는 패키지와 관련된 모든것을 빌드한다. 전체를 다 하는것은 아님.
--symlink-install
--event-handlers console_direct+ : 빌드하는 동안 아웃풋을 콘솔에 보여줌. 이거 안쓰면 아웃풋이 log 디렉토리에 떨궈짐.
빌드된 후에 생긴 install 디렉토리에 있는 셋업파일을 쓰면 기존 환경에 자동으로 overlay 된다.
이런식으로 기본 setup 을 한다음에 새로 만든 것을 setup 적용해주면 된다.
$ source /opt/ros/<distro>/setup.bash
$ cd ~/ros2_dev_ws
$ source install/local_setup.bash
그리고 나서
$ ros2 run turtlesim turtlesim_node
이렇게 하면 터틀심이 뜨는데, 이게 underlay (기본으로 있는거) 인지 아니면 새로 만든 ovelay 에서 뜨는 터틀심인지 알아보기 위해서 수정해서 재빌드 하고 띄워본다.
~/ros2_dev_ws/src/ros_tutorials/turtlesim/src/turtlesim.cpp
를 수정한다.
몇개를 바꿔본다.
setWindowTitle("Lionel TurtleSim");
#define DEFAULT_BG_R 0x77
#define DEFAULT_BG_G 0x56
#define DEFAULT_BG_B 0xff
저장하고 colcon build 하고 나서 다시 실행하면 바뀐것을 확인 할 수 있다.
패키지 만들기
패키지는 ROS2 코드의 컨테이너라고 보면 된다.
만든 코드를 설치하거나 공유하려면 패키지로 만드는게 필요하다.
ROS2 에서 패키지 만들라면 ament 를 쓴다. 아니면 CMake 랑 python 으로 만들 수도 있다.
CMake 로 패키지 만들라면
package.xml 이랑 CMakeLists.txt 가 있어야 된다.
package.xml은 패키지의 메타정보가 들어있는것이고,
CMakeLists.txt 는 cmake 빌드방법 텍스트다.
간단히 이런 구성.
my_package/
CMakeLists.txt
package.xml
Python으로 만들라면
package.xml : 패키지의 메타정보.
setup.py : 인스톨 방법.
setup.cfg : 패키지 실행할 때, ros2 run 에서 찾게 해준다.
/<package_name> : 이건 디렉토리 인데 패키지 이름과 같아야 한다. ROS2 툴이 __init__.py 가 있는 것을 찾는다.
이런 구조로 되야 한다.
my_package/
setup.py
package.xml
resource/my_package
워크스페이스에서 패키지
한 워크스페이스가 많은 패키지를 포함 할 수 있다.
그리고 패키지마다 다른 빌드 타입을 쓸 수 있다. CMake 나 python 이나 ...
nested 패키지는 안됨.
젤 좋은 구성은 한 src 디렉토리에 들어있는 것이다.
이런 구조로다가....
workspace_folder/
src/
package_1/
CMakeLists.txt
package.xml
package_2/
setup.py
package.xml
resource/package_2
===
package_n/
CMakeLists.txt
package.xml
실습
$ cd ~/ros2_dev_ws/src
CMake 는 이렇게
ros2 pkg create --build-type ament_cmake <package_name>
python 은 이렇게.
ros2 pkg create --build-type ament_python <package_name>
$ ros2 pkg create --build-type ament_cmake --node-name my_node my_package
going to create a new package
package name: my_package
destination directory: /home/lionelj/ros2_dev_ws
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['lionelj <이메일@gmail.com>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp
이렇게 하면 my_package 가 생긴다.
~/ros2_dev_ws$ l
합계 16
drwxrwxr-x 4 lionelj lionelj 4096 1월 11 16:42 ./
drwxr-xr-x 55 lionelj lionelj 4096 1월 11 16:04 ../
drwxrwxr-x 4 lionelj lionelj 4096 1월 11 16:42 my_package/
drwxrwxr-x 3 lionelj lionelj 4096 1월 11 15:01 src/
~/ros2_dev_ws/src$ ros2 pkg create --build-type ament_cmake --node-name my_node my_package
~/ros2_dev_ws/src/my_package$ tree
.
├── CMakeLists.txt
├── include
│ └── my_package
├── package.xml
└── src
└── my_node.cpp
3 directories, 3 files
pytho 으로 하면 이렇게.
~/ros2_dev_ws/src$ ros2 pkg create --build-type ament_python --node-name my_node my_package2
~/ros2_dev_ws/src/my_package2$ tree
.
├── my_package2
│ ├── __init__.py
│ └── my_node.py
├── package.xml
├── resource
│ └── my_package2
├── setup.cfg
├── setup.py
└── test
├── test_copyright.py
├── test_flake8.py
└── test_pep257.py
3 directories, 9 files
이제 빌드 한다.
~/ros2_dev_ws$ colcon build
Starting >>> my_package
[0.143s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/lionelj/ros2_dev_ws/install/turtlesim' in the environment variable AMENT_PREFIX_PATH doesn't exist
[0.143s] WARNING:colcon.colcon_ros.prefix_path.catkin:The path '/home/lionelj/ros2_dev_ws/install/turtlesim' in the environment variable CMAKE_PREFIX_PATH doesn't exist
Starting >>> my_package2
Starting >>> turtlesim
Finished <<< my_package2 [0.41s]
Finished <<< my_package [0.78s]
Finished <<< turtlesim [11.7s]
Summary: 3 packages finished [11.8s]
패키지 하나만 빌드하고 싶으면 이렇게 한다.
colcon build --packages-select my_package
다시 setup 적용해주고
~/ros2_dev_ws$ . ./install/setup.bash
~/ros2_dev_ws$ ros2 run my_package my_node
hello world my_package package
~/ros2_dev_ws$ ros2 run my_package2 my_node
Hi from my_package2.
잘 된다.
package.xml 을 수정해서 써야한다.
<description> 이랑
<maintainer 이메일 부분
<license> 부분등을 수정해서 써야 한다.
태그들 중에 _depend 로 끝나는 것이 있는데 이것은 colcon 이 찾을 수 있는 dependency 를 나타낸다.
python 으로 하면 setup.py 에도 package.xml 이랑 동일하게 맞춰줘야 한다. 정확하게 일치하도록 써줘야 한다.
'Embeded > ROS' 카테고리의 다른 글
ROS2 간단한 publisher 와 subscriber 만들기 (C++) (1) | 2021.01.12 |
---|---|
ROS 1 연습 (0) | 2021.01.04 |
ROS2 install 및 기본 사용법. (0) | 2020.12.10 |