Updated:

Create Package

파이썬 패키지로 간단한 publisher와 subscriber를 만들어 본다. /colcon_ws/src/ros2comm/ 아래에 서버와 클라이언트 역할을 할 두 패키지를 만들 것이다.

$ cd /colcon_ws/src
$ mkdir ros2comm
$ cd ros2comm

# ros2 pkg create --build-type {빌드 타입} --node-name {노드명} {패키지명}
$ ros2 pkg create --build-type ament_python --node-name serverRun ros2server
$ ros2 pkg create --build-type ament_python --node-name clientRun ros2client

아래와 같이 패키지가 생성된다.

pkg

우리가 직접 코드를 짤 부분은 ros2server, ros2client 폴더 내부에 있다.

/colcon_ws/ros2comm/ros2server/ros2server

/colcon_ws/ros2comm/ros2client/ros2client

ros2server

먼저 서버 부분에 클래스를 생성하고 노드를 만들어본다.

/colcon_ws/ros2comm/ros2server/ros2server

해당 위치에 comm.py라는 파일을 만들어 클래스를 생성해준다.

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class ServerPublisher(Node):
    def __init__(self):
        super().__init__('server_publisher')
        self.publisher = self.create_publisher(String, 'server2client', 10)
        
    def MessagePublish(self, sendMsg):
        msg = String()
        msg.data = sendMsg
        self.publisher.publish(msg)
        self.get_logger().info('Publishing: %s' % msg.data)
        
class ServerSubscriber(Node):
    def __init__(self):
        super().__init__('server_subscriber')
        self.subscriber = self.create_subscription(String, 'client2server', self.callback_subscribe, 10)
        
    def callback_subscribe(self, msg):
        self.get_logger().info('Received Message: %s' % msg.data)     

이제 위 클래스를 사용해 subscribe 하는 내용을 메인문에 작성해준다. 아래 코드는 패키지를 만들때 생성한 serverRun.py 에 작성한다.

import rclpy
import ros2server.comm as comm

def main(args=None):
    rclpy.init(args=args)
    print("Server Run!")
    server_subscriber = comm.ServerSubscriber()
    
    rclpy.spin(server_subscriber)
    server_subscriber.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

ros2client

comm.py

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class ClientPublisher(Node):
    def __init__(self):
        super().__init__('client_publisher')
        self.publisher = self.create_publisher(String, 'client2server', 10)
        
        timer_period = 0.5
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.i = 0
        
    def timer_callback(self):
        msg = String()
        msg.data = 'Hello Server! %d' % self.i
        self.publisher.publish(msg)
        self.get_logger().info('Publishing: %s' % msg.data)
        self.i += 1
        
class ClientSubscriber(Node):
    def __init__(self):
        super().__init__('client_subscriber')
        self.subscriber = self.create_subscription(String, 'server2client', self.listener_callback, 10)
        
    def listener_callback(self, msg):
        self.get_logger().info('Subscribed: %s' % msg.data)

clientRun.py

import rclpy
import ros2client.comm as comm

def main(args=None):
    rclpy.init(args=args)
    client_publihser = comm.ClientPublisher()
    
    rclpy.spin(client_publihser)
    client_publihser.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

Build & Run

$ cd ~/colcon_ws && colcon build

# terminal 1
$ ros2 run ros2server serverRun

# terminal 2
$ ros2 run ros2client clientRun

Tags:

Categories:

Updated:

Comments