YOGYUI

ROS2 + IgH EtherCAT Master 구동 환경 구축 본문

Software/ROS

ROS2 + IgH EtherCAT Master 구동 환경 구축

요겨 2023. 11. 10. 15:21
반응형

 

지난 포스팅에서 SBC 혹은 임베디드 PC에 Linux Ubuntu 22.04 LTS 운영체제 설치 후 PREEMPT_RT 커널 패치를 통해 Real-Time(리얼타임, 실시간) 구동 환경을 설정한 뒤 EhterLab의 IgH EtherCAT Master를 설치해 EtherCAT Master 디바이스로 구축하는 방법을 알아봤다

EtherCAT Master 환경 구축 - Ubuntu 22.04 LTS + PREEMPT_RT 커널 패치

 

EtherCAT Master 환경 구축 - Ubuntu 22.04 LTS + PREEMPT_RT 커널 패치

Setting EtherCAT Master Environment - Ubuntu 22.04 LTS + PREEMPT_RT Kernel Patch ROS2에서 EtherCAT 기반 서보모터, IO보드 등을 제어하기 위해 사용할 수 있는 유용한 플러그인 EtherCAT Driver ROS2 Stack는 EtherLab의 IgH EtherCAT

yogyui.tistory.com

이번 글에서는 ROS2 (Robot Operating System 2)에 IgH EtherCAT Master를 연동해 EtherCAT 기반으로 구동되는 로봇을 ROS2와 연동하기 위한 환경 설정 방법을 알아본다

1. ROS2 (Humble) 설치

EtherCAT Driver ROS2 Stack은 2023년 11월 현재 ROS2 Humble (Humble Hawksbill) 버전을 지원한다 (Iron버전은 소스 코드 수정 필요)

 

우분투에 설치하는 방법은 2가지 방법이 있는데, ROS2의 소스코드를 수정 혹은 디버깅하며 사용할 것이 아니라면 APT를 이용한 패키지 설치방법을 권장한다

https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

 

Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentation

You're reading the documentation for an older, but still supported, version of ROS 2. For information on the latest version, please have a look at Iron. Ubuntu (Debian packages) Debian packages for ROS 2 Humble Hawksbill are currently available for Ubuntu

docs.ros.org

APT로 설치가능한 패키지 업데이트

$ sudo apt update

 

로케일(locale)을 설치하고 PC의 언어 설정 및 텍스트 인코딩을 바꿔준다

$ sudo apt install locales
$ sudo locale-gen en_US en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8

 

 

ROS2 패키지가 존재하는 GPG key를 가져와 APT 저장소에 추가해준 뒤 업데이트

$ sudo apt install software-properties-common
$ sudo add-apt-repository universe
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
$ sudo apt update

 

이제 APT로 ROS humble을 설치해주면 된다 (설치는 꽤 오래 걸리니 커피타임 추천)

$ sudo apt install -y ros-dev-tools
$ sudo apt install -y ros-humble-desktop

 

ROS 패키지는 /opt/ros 경로에 설치된다 

$ ls /opt/ros/humble

1.1. 동작 테스트

터미널 등에서 ROS 커맨드라인을 사용하려면 환경설정을 위한 배쉬 쉘 스크립트를 호출해줘야 한다

$ source /opt/ros/humble/setup.bash

 

정상적으로 설정되었으면 환경변수에 'ROS_VERSION', 'ROS_DISTRO' 등이 추가된 것을 알 수 있다

$ printenv | grep -i ROS

 

간단한 토픽 발행(퍼블리시, publish) 예제를 실행해보자

$ ros2 run demo_nodes_cpp talker

 

위와 같이 DDS(Data Distribution Service)를 통한 토픽 퍼블리시 메시지가 나오면 ROS가 정상적으로 동작하는 것이다 (키보드 'Ctrl + C' > sigterm 시그널로 종료하면 된다)

1.2. 개발용 패키지 설치

아래 패키지들은 내가 ROS2 관련 개발하면서 필요로 했던 것들인데, 설치해주도록 하자

(본인의 개발 프로세스에 따라 더 필요한 것들이 있을 수도 있고, 여기서 필요없는 것들이 있을 수도 있다)

$ sudo apt update
$ sudo apt install -y libbullet-dev python3-flake8 python3-pip python3-colcon-common-extensions python3-pytest-cov python3-rosdep python3-setuptools python3-vcstool
$ sudo apt install --no-install-recommends -y libasio-dev libtinyxml2-dev libcunit1-dev tree
$ python3 -m pip install -U argcomplete flake8-blind-except flake8-builtins flake8-class-newline flake8-comprehensions flake8-deprecated flake8-docstrings flake8-import-order flake8-quotes pytest-repeat pytest-rerunfailures pytest

 

특히, MoveIt을 사용하려면 DDS 미들웨어를 CycloneDDS로 교체하는 것이 권장되니 미리미리 설치해주자

$ sudo apt install -y ros-humble-rmw-cyclonedds-cpp

 

ROS 프로젝트 패키지 구성 시 Xacro를 사용한다면 필요한 패키지도 설치해주자

$ sudo apt install ros-humble-xacro

1.3. ROS 작업경로 설정

ROS 입문자들은 반드시 한번은 해본 작업경로 설정 ㅋㅋ (colcon)

나는 개인적으로 ~/ros2_ws 경로를 선호하는 편이다

$ mkdir ~/ros2_ws
$ cd ~/ros2_ws
$ mkdir src
$ colcon build --symlink-install

colcon 빌드 후 'build', 'install', 'log' 경로가 생성된다

$ cd ~/ros2_ws
$ tree

 

1.4. 환경변수 설정

이것도 ROS 입문자는 반드시 해본 절차 (쉘 로드시 자동으로 ROS 환경변수 설정)

$ sudo nano ~/.bashrc

 

기본적으로 아래 3줄을 추가해주면 된다

source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

 

터미널에서 ROS2를 입력하면 ROS 관련 커맨드 라인 툴 설명을 확인할 수 있다

$ ros2

2. ROS2 Control 설치

ROS2의 실시간 로봇 제어는 ros2_control 프레임워크를 통해 백엔드를 통해 구현할 수 있다 (ROS2 DDS는 실시간 제어에는 부적합하다)

 

ROS2 Control은 다루는 범위가 굉장히 넓은 프레임워크인데, 이 글에서 소개하기에는 내용이 너무 방대하니 관심있는 사람들은 아래 공식 문서를 참고하도록 한다

https://control.ros.org/master/index.html

 

Welcome to the ros2_control documentation! — ROS2_Control: Rolling Nov 2023 documentation

© Copyright 2023, ros2_control Development Team.

control.ros.org

 

설치 과정은 의외로 간단해서, APT를 통해 아래 세 패키지를 설치해주기만 하면 된다

필수 패키지느 ros2-controlros2-controllers

(gazebo-ros2-control은 ros2 control로 구현된 joint들을 gazebo와 연동하여 시뮬레이션하기 위해 반드시 필요한 패키지이니 미리미리 설치해주자)

$ sudo apt-get install -y ros-${ROS_DISTRO}-ros2-control
$ sudo apt-get install -y ros-${ROS_DISTRO}-ros2-controllers
$ sudo apt-get install -y ros-${ROS_DISTRO}-gazebo-ros2-control

 

설치 완료 후 ros2 커맨드라인에 'control' 플래그가 추가된다

입력해보면 ros2 control과 관련된 명령어들의 설명을 확인할 수 있다

$ ros2 control

3. EtherCAT Driver ROS2 Stack 설치

EtherLab의 IgH EtherCAT Master를 설치했다면, ROS2에서 이를 ros2_control과 연동하여 돌리기 위해서는 icube robotics에서 개발한 'EtherCAT Driver ROS2 Stack' 플러그인을 사용하는 것을 추천

https://icube-robotics.github.io/ethercat_driver_ros2/index.html

 

EtherCAT Driver ROS2 Stack — ethercat_driver_ros2 1.0.0 documentation

© Copyright 2023, ICUBE Laboratory, University of Strasbourg.

icube-robotics.github.io

이 방법 외에도 EtherCAT을 ROS2와 연동하는 방법은 몇가지 방법이 더 있는데, 개인적으로는 여기서 소개하는 방법이 제일 익숙하게 느껴진다

 

깃허브에서 소스코드를 ROS2 작업경로로 클론해온다

$ cd ~/ros2_ws
$ git clone https://github.com/ICube-Robotics/ethercat_driver_ros2.git src/ethercat_driver_ros2

 

소스코드 빌드 시 참조하는 etherlab 경로가 /usr/local 에 있어야 정상적으로 빌드되므로, /usr/local에 심볼링 링크를 생성해주자
(IgH EtherCAT Master 빌드 configuration시 나는 해당 경로를 /opt/etherlab으로 해뒀기 때문에 명령어는 아래와 같으며, 경로가 다르다면 명령어로 적절하게 바꿔줘야 한다)

$ sudo ln -s /opt/etherlab /usr/local

 

작업 경로로 가서 rosdep 을 업데이트해준다 (만약 rosdep 사용이 처음이라면 init 명령어를 우선 호출)

$ cd ~/ros2_ws
$ sudo rosdep init
$ rosdep update

 

이제 소스코드를 빌드해주면 된다

$ rosdep install --ignore-src --from-paths . -y -r
$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --symlink-install

 

C/C++ 표준 관련 경고(warning)들이 다수 발생하는데, 동작에는 큰 문제없으니 무시해준다

 

설치가 완료되면 위와 같이 13개의 패키지가 설치되었다는 완료 메시지를 볼 수 있다

3.1. 접근권한

EtherCAT Driver ROS2 Stack은 실시간성 확보를 위해 프로세스의 우선순위를 최대(99)로 설정하는 시도를 하게 되는데, super user 권한이 아니라면 권한 확보가 되지 않아 오류가 발생한다

 

따라서 현재 로그인된 유저에 해당 권한을 부여해주도록 한다

현재 로그인된 유저(나는 yogyui)에 'realtime'이라는 이름의 사용자 그룹을 추가해준다 

- 그룹 이름은 임의로 지정하면 되며, 사용자 이름도 적절하게 바꿔줘야 한다

$ sudo addgroup realtime
$ sudo usermod -a -G realtime yogyui

 

/etc/security/limits.conf 파일을 vim이나 nano같은 에디터로 열어준 뒤

$ sudo nano /etc/security/limits.conf

 

아래 6줄을 추가해준다

@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 102400
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 102400


이제 아래와 같이 환경 구축이 완료되었다

  • Linux Ubuntu 22.04.x LTS
  • Real Time Linux Kernel 5.15.xxx (PREEMPT_RT)
  • IgH EtherCAT Master
  • ROS2 Humble
  • ROS2 Control
  • EtherCAT Driver ROS2 Stack

끝~!

반응형