본 블로그 포스팅은 https://www.youtube.com/@pinklab_studio/playlists
에서 현재 강의 중에 있는
ROS2 무작정 따라하기강의의 내용을 필자가 다시 복기하여 기록하는 내용에 관한 것이다.
앞서 ~/ros2_workspace/src
폴더에서 ros2 pkg create --build-type ament_python --node-name my_first_node my_first_package
명령어를 통해 my_first_package을 생성했다면 해당 패키지의 노드 파일인 my_first_node.py을 VScode으로 열어보자
코드가 뭐라 쓰여있는지는 나중에 해석하고 중요한것만 본다면
이 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
라는 단어를 터미널에서 볼 수 있을 것이다.
우분투의 터미널은 새로운 터미널을 열 때마다 .bashrc
에 등록되어 있는 다양한 초기화 작업을 수행함은 이전 포스팅을 통해 알았을 것이다.
그럼 이 패키지를 등록하는 과정을 좀 간단한 명령어로 만들어 보자
.bashrc
파일에 아래의 명령어 등록alias r2pkgsetup='humble; source ~/ros2_workspace/install/local_setup.bash; \ echo "new ros2 package is activated!."'
이후
.bashrc
파일 저장
현재의 터미널에서 변경한 .bashrc
를 바로 반영하고 싶다면 아래 명령어를 수행하면 된다.
$ source ~/.bashrc
위 과정을 수행했다면 빌드한 신규 패키지의 등록을 r2pkgsetup
라는 명령어로 간단하게 수행할 수 있을 것이다.
이제 my_first_package 패키지에 신규 노드를 하나 더 추가하여, 추가한 신규 노드를 실행하는 실습을 진행해보자.
신규노드는 turtlesim 패키지의 turtlesim_node노드가 실행되면
해당 노드에서 Publish하는 Topic인 turtle1/pose
를 Subscribe하여 토픽에 담긴 메세지를 출력하는 작업을 수행한다.
이제 코드를 차례차례 실행순서에 맞춰 코드리뷰를 수행하겠다.
라이브러리는 총 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()
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가지 항목으로 나누어 코드 리뷰를 이미지에 첨부 식으로 설명을 진행했다.
노드 작성을 완료했으니 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!
를 터미널 창에 보여라
이다.