PinkLAB - 민형기 ROS2 응용 실습 2일차 - 패키지 실행+노드작성

안상훈·2024년 6월 3일
0

ROS2 실습

목록 보기
6/13
post-thumbnail

본 블로그 포스팅은 https://www.youtube.com/@pinklab_studio/playlists
에서 현재 강의 중에 있는

ROS2 무작정 따라하기강의의 내용을 필자가 다시 복기하여 기록하는 내용에 관한 것이다.


1. 패키지 실행하기

앞서 ~/ros2_workspace/src 폴더에서 ros2 pkg create --build-type ament_python --node-name my_first_node my_first_package명령어를 통해 my_first_package을 생성했다면 해당 패키지의 노드 파일인 my_first_node.pyVScode으로 열어보자
코드가 뭐라 쓰여있는지는 나중에 해석하고 중요한것만 본다면
my_first_node.py 파일이 실행된다면 왠지

"Hi from my_first_package."

라는 구문을 출력할 것 같은 느낌적인 느낌이 든다.

그럼 아래의 명령어를 수행해서 생성한 Package를 빌드해보자

$ cd ~/ros2_workspace
$ colcon build

여기서 colcon build명령어의 수행은 ~/ros2_workspace/src 폴더가 아닌 ~/ros2_workspace 에서 해야한다.

위 사진처럼 buil를 수행하면 my_first_package패키지 내 코드에 문제가 없다면 정상적으로 build가 완료될 것이고, 문제가 있으면 해당 에러를 팝업할 것이다.

추가사항
향후 여러가지 Package를 작업공간에 배치한 상태라면 매번 모든 패키지를 빌드하는 비 효율이 발생할 수도 있다.
이럴때는 특정 패키지만 선택해서 빌드할 수 있는데
아래의 명령어 코드를 수행하면 된다
$ colcon build --packages-select [빌드하고 싶은 패키지]

빌드도 완성했으니 코드를 실행해보자

$ ros2 run my_first_package my_first_node

아마 위 명령어를 치면서 먼가 쎄 한 느낌을 받았을 것이다.

아래 그림처럼 Package 'my_first_package' not found라는 문구가 터미널에 떠야 정상이다.

이것은 왜 그런가?
마치 ROS코드를 작성하려고 터미널에서 VScode을 실행했을 때
위 사진처럼 나는 분명히 ROS설치를 완료했지만 왜 ROS-python라이브러리인 rclpy 모듈이 없다는 이런 불길한 메세지를 보여주는가?

라는 느낌을 받는 것일까?

물론 위 문제는 .bashrc에 등록한 humble 라는 명령어를 통해
/opt/ros/humble/setup.bash 파일을 실행하라는 기능이 동작하면 위 문제는 사라진다.

.bashrc파일에 등록한 ROS의 환경설정에 관한 정보인 /opt/ros/humble/setup.bash을 실행하라는 명령어를 수행하고 다시 VScode를 실행하면 rclpy모듈을 정상적으로 찾을 수 있다.

$ ros2 run my_first_package my_first_node라는 명령어 실행 후 맞이한 Package 'my_first_package' not found도 동일한 개념이다.

어떤, 그러니까 패키지 등록 및 실행에 관한 bash파일이 실행이 안된 것이다.

위 사진처럼 install폴더에 있는 local_setup.bash파일이 실행이 되어야 한다.

$ source ./install/local_setup.bash

현재의 터미널에서 local_setup.bash를 실행하고 그 결과를 바로 반영하라는 뜻

$ ros2 run my_first_package my_first_node

local_setup.bash실행을 통해 새로이 빌드된 my_first_package이 패키지 리스트에 등록이 되었으니 노드 실행이 가능해진다.

이제 실행결과인 Hi from my_first_package라는 단어를 터미널에서 볼 수 있을 것이다.


1-1. 패키지 실행 간소화 절차

우분투의 터미널은 새로운 터미널을 열 때마다 .bashrc에 등록되어 있는 다양한 초기화 작업을 수행함은 이전 포스팅을 통해 알았을 것이다.

그럼 이 패키지를 등록하는 과정을 좀 간단한 명령어로 만들어 보자

.bashrc파일에 아래의 명령어 등록

alias r2pkgsetup='humble; source ~/ros2_workspace/install/local_setup.bash; \
    echo "new ros2 package is activated!."'

이후 .bashrc파일 저장

현재의 터미널에서 변경한 .bashrc를 바로 반영하고 싶다면 아래 명령어를 수행하면 된다.

$ source ~/.bashrc

위 과정을 수행했다면 빌드한 신규 패키지의 등록을 r2pkgsetup라는 명령어로 간단하게 수행할 수 있을 것이다.


2. 신규 노드 작성(subscriber)

이제 my_first_package 패키지에 신규 노드를 하나 더 추가하여, 추가한 신규 노드를 실행하는 실습을 진행해보자.

신규노드는 turtlesim 패키지의 turtlesim_node노드가 실행되면
해당 노드에서 Publish하는 Topicturtle1/poseSubscribe하여 토픽에 담긴 메세지를 출력하는 작업을 수행한다.

이제 코드를 차례차례 실행순서에 맞춰 코드리뷰를 수행하겠다.

2-1. 코드리뷰

라이브러리

라이브러리는 총 3개를 import한다.

import rclpy as rp
from rclpy.node import Node

from turtlesim.msg import Pose

from turtlesim.msg import Pose는 첨부한 그림으로 충분히 설명되는 것 같고

from rclpy.node import Node는 뒤에서 설명하겠다.

메인구문

def main(args=None):
    rp.init(args=args)

    turtlesim_subscriber = TurtlesimSubscriber()
    rp.spin(turtlesim_subscriber)

    #키보드 인터럽트(ctrl+c)들어오면 아래 명령이 실행됨
    turtlesim_subscriber.destroy_node()
    rp.shutdown()

if __name__ == '__main__':
    main()

sub노드 설정부

class TurtlesimSubscriber(Node):

    def __init__(self):
        #아래 super은 TurtlesimSubscriber의 부모 클래스인 Node에서
        #Node 클래스에 정의되어 있는 def __init__를 다 가져오란 뜻이고
        #Node 클래스 열어보면 노드명 기입부가 node_name: str 이케되어있음
        super().__init__('turtlesim_subscriber') #이게 노드명
        #sub노드의 할 일 정하기
        self.subscription = self.create_subscription(
            Pose,
            '/turtle1/pose',
            self.callback,
            10)

    def callback(self, msg):
        print(f"X: {msg.x:.2f},", end=' ')
        print(f"Y: {msg.y:.2f},", end=' ')
        print(f"theta: {msg.theta:.2f}")

모르겟는 내용이 있다면
https://docs.ros2.org/foxy/api/rclpy/api/init_shutdown.html
공식 도큐먼트를 항상 참조하자

아무튼 my_subscriber.py에 대한 설명을 3가지 항목으로 나누어 코드 리뷰를 이미지에 첨부 식으로 설명을 진행했다.


3. 신규 노드 패키지 등록

노드 작성을 완료했으니 my_first_package에 새로 작성한 노드인 my_subscriber.py이 있음을 알리고 패키지 빌드할 때 까먹지 말고
my_subscriber.py이 노드도 빌드에 추가시켜라

라고 알려줘야 한다

이 패키지 내 노드의 구성을 관리하는 파일은 setup.py이다.

entry_points 변수에
,
'my_subscriber = my_first_package.my_subscriber:main'
을 추가하자

setup.py파일에 대한 코드리뷰는 넘어가고
my_first_package에 새로운 노드를 추가했다면
위 사진과 코드 구문을 작성하여 기입하면 된다.

이때 ,콤마를 꼭 빼먹지 말고 기입하자


이제 위 사진처럼
패키지 빌드
패키지 등록
패키지 실행
을 수행하자

$ colcon build		패키지 빌드
$ r2pkgsetup		패키지 등록
$ ros2 run my_first_package my_subscriber
			패키지				노드 실행

위 사진처럼 my_subscriber.py가 실행되어 turtlesim_node이 발행하는 토픽을 받아 그 내용을 출력하는 함수가 잘 동작함을 확인 할 수 있다.


마지막으로 rqt_graph를 실행해서 노드, 토픽의 구성을 시각화하자.


빌드 꼬였을 때 대처방안


위 사진처럼 setup.py파일이나 my_subscriber.py파일 작성 중 버그발생, 혹은 여러가지 이유로 my_first_package 빌드 후 이상한 노드가 발생한다면

이를 코드 수정후에 다시 빌드 후 등록해도
이상한 노드 리스트가 사라지지 않고 계속 나타나는 경우가 있다.

이런 경우 빌드가 꼬임으로 볼 수 있으며,
한번 패키지 내 등록된 빌드 리스트를 클리어 해 줄 필요가 있다.

이 방법은 아래의 코드를 실행하면 된다.

$ sudo rm -r install/ build/ log

간단하게 패키지를 빌드하는 명령어인 colcon build를 통해서 생성되는
install
build
log
폴더 3개를 삭제해버리고 다시 colcon build를 수행하면 된다.

이 명령어는 기니까 좀 축약해서 등록을 해두자

alias r2pkgclear='sudo rm -r ~/ros2_workspace/install/ \
    ~/ros2_workspace/build/ \
    ~/ros2_workspace/log/ && \
    echo "ros2 package build list clear!"'

설명을 하자면
colcon build명령어를 통해 생성되는
~/ros2_workspace/폴더 내

install
build
log

3개의 폴더를 삭제하고

삭제가 성공한다면 ---> &&

성공한 것에 대한 응답 코드
ros2 package build list clear!
를 터미널 창에 보여라

이다.

profile
자율차 공부중

0개의 댓글

관련 채용 정보