본 블로그 포스팅은 https://www.youtube.com/@pinklab_studio/playlists
에서 현재 강의 중에 있는
ROS2 무작정 따라하기강의의 내용을 필자가 다시 복기하여 기록하는 내용에 관한 것이다.
이전 포스팅에서 생성한 my_first_package에 신규 노드 : my_subscriber.py를 작성했으니 이번에는 my_publisher.py을 작성하여 아래의 기능을 구현해 보도록 하겠다.
import rclpy as rp
from rclpy.node import Node
from turtlesim.msg import Pose
1번줄이랑 2번줄은 노드 설계시 항상 들어가는 라이브러리라 보면 되고, from turtlesim.msg import Pose
는 turtlesim_node
를 제어하려면 turtlesim_node
이 수신받을 수 있는 Subscriber topic을 살펴봐야 한다.
이 중 /turtel1/cmd_vel토픽이 터틀봇이 제어되는데 필요한 sub topic이니 이 토픽의 메세지 규격에 맞는 메세지 타입 라이브러리를 import한다.
def main(args=None):
rp.init(args=args)
turtlesim_publisher = TurtlesimPublisher()
rp.spin(turtlesim_publisher)
#노드 종료, 통신종료
turtlesim_publisher.destroy_node()
rp.shutdown()
if __name__ == '__main__':
main()
메인구문은 ROS통신 초기화, 노드객체 'turtlesim_publisher'인스턴스화, 노드객체의 반복실행 등의 기능을 수행한다.
class TurtlesimPublisher(Node):
def __init__(self):
super().__init__('turtlesim_publisher')
#pub 노드가 수행할 일 정하기
self.publish = self.create_publisher(
Twist,
'/turtle1/cmd_vel',
10
)
#발행 속도 정하기 -> timer이용
time_period = 0.5
self.timer = self.create_timer(
time_period,
self.timer_callback
)
def timer_callback(self):
msg = Twist()
msg.linear.x = 2.0
msg.angular.z = 2.0
#여기가 topic 발행하는 부분
self.publish.publish(msg)
VScode에 라이브러리 인포팅이 잘 되어 있다면
각 함수에 커서를 갖다대면 ROS공식 도큐먼트의 설명글을 참조 할 수 있다.
코드 작성을 완료했다면 , 'my_publisher = my_first_package.my_publisher:main'
구문을 setup.py에 꼭 작성하여 노드 등록을 완료하자
$ cd ros2_workspace $ colcon build
먼저 위 사진처럼 패키지 빌드을 수행한 뒤
1번 터미널 : 터틀심 노드 실행
$ humble $ ros2 run turtlesim turtlesim_node
2번 터미널 : Publisher.py 노드 실행
$ cd ros2_workspace $ r2pkgsetup $ ros2 run my_first_package my_publisher
3번 터미널 : Subscriber.py 노드 실행
$ cd ros2_workspace $ r2pkgsetup $ ros2 run my_first_package my_subscriber
위 3가지 명령어를 각각의 터미널에서 실행한다.
위 그림과 같이 pub, sub, 그리고 이에 의해 제어되는 turtlebot의 구동을 볼 수 있다.
이전 포스팅에서
colcon build
를 통해서 생성되는
install
build
log
이 3개의 폴더를 삭제해야 한다 언급했으나,
log
이 폴더 하나만 지우면 된다
따라서 이에 따른 개선된 .bashrc
코드를 첨부한다
alias r2pkgclear='sudo rm -r ~/ros2_workspace/log/ && \
echo "ros2 package build list clear!"'