ROS2 create package
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
아래와 같이 패키지가 생성된다.
우리가 직접 코드를 짤 부분은 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
Comments