$ cd ~/baqu_ws/src
$ ros2 pkg create test_rclpy_pkg --build-type ament_python --dependencies rclpy std_msgs
version만 수정함
entry_points 옵션의 console_scripts 키를 사용한 실행 파일 설정
ex) helloworld_publisher와 helloworld_subscriber 콘솔 스크립트는 각각 test_rclpy_pkg.helloworld_publisher 모듈과 test_rclpy_pkg.helloworld_subscriber 모듈의 main 함수를 호출되게 한다
해당 설정을 통해 ros2 run 또는 ros2 launch 명령어로 해당 스크립트를 실행시킬 수 있다.
version과 entry_points만 수정함
해당 파일에서 주의할 점은 test_rclpy_pkg와 같이 패키지 이름을 기재해야한다는 것과 나중에 colcon을 이용하여 빌드하게 되면 "/home/[userName]/baqu_ws/install/test_rclpy_pkg/lib/test_rclpy_pkg"와 같은 지정 폴더에 실행파일이 생성된다는 점이다
퍼블리셔 노드의 파이썬 코드는 ~/baqu_ws/src/test_rclpy_pkg/test_rclpy_pkg/ 폴더에 helloworld_publisher.py 소스코드 파일을 직접 생성한다
# import 구문
# rclpy의 Node 클래스 사용 / 퍼블리셔의 QoS 설정을 위한 QoSProfile 클래스
# 메시지 타입은 std_msgs.msg 모듈의 String 메시지 인터페이스 사용
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String
# 이 노드의 메인 클래스는 HelloworldPublisher이고 Node 클래스를 상속해 사용할 예정
class HelloworldPublisher(Node):
# 클래스 생성자 정의
# 부모 클래스(Node)의 생성자를 호출하고 노드 이름을 helloworld_publisher로 지정
def __init__(self):
super().__init__('helloworld_publisher')
qos_profile = QoSProfile(depth=10)
# Nod 클래스의 create_publisher 함수를 이용해 helloworld_publisher를 설정함
# 매개변수로 토픽 메시지 타입은 String, 토픽 이름은 helloworld, QoS는 qos_prpfile
self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)
self.timer = self.create_timer(1, self.publish_helloworld_msg)
self.count = 0
# 앞에서 지정한 publish_helloworld_msg 콜백함수
# 실제 데이터는 msg.data에 저장
def publish_helloworld_msg(self):
msg = String()
msg.data = 'Hello World: {0}'.format(self.count)
self.helloworld_publisher.publish(msg)
self.get_logger().info('Published message: {0}'.format(msg.data))
self.count += 1
# rclpy.init을 이용해 초기화
def main(args=None):
rclpy.init(args=args)
# HelloworldPublisher 클래스를 node 변수로 생성
node = HelloworldPublisher()
try:
# rclpy.spin 함수를 이용하여 생성한 노드를 spin 시켜 지정된 콜백 함수가 실행될 수 있도록
rclpy.spin(node)
except KeyboardInterrupt:
node.get_logger().info('Keyboard Interrupt (SIGINT)')
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String
class HelloworldSubscriber(Node):
def __init__(self):
super().__init__('helloworld_subscriber')
qos_profile = QoSProfile(depth=10)
self.helloworld_subscriber = self.create_subscription(String, 'helloworld', self.subscribe_topic_message, qos_profile)
def subscribe_topic_message(self, msg):
self.get_logger().info('Reveived message: {0}'.format(msg.data))
def main(args=None):
rclpy.init(args=args)
node = HelloworldSubscriber()
try:
rclpy.spin(node)
except KeyboardInterrupt:
node.get_logger().info('Keyboard Interrupt (SIGINT)')
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
특정 패키지의 첫 빌드 후에는 환경설정 파일을 불러와서 실행 가능한 패키지의 노드 설정을 해줘야 빌드된 노드를 실행할 수 있다
->
$ . ~/baqu_ws/install/local_setup.bash
혹은
$ source ~/baqu_ws/install/local_setup.bah
해당 위치에 setup.bash는 setup.bash와 local_setup.bash가 있는데, local_setup.bash는 해당 폴더에 한정된 노드 설정을 해주는 반면 setup.bash는 전역적인 노드 설정을 해준다
아직 publisher를 실행시키지 않아 터미널에 아무 것도 뜨지 않는다
새로 터미널을 열면 다시 source ~/...를 통해 노드 설정을 해줘야 함..
잘 보고갑니다