본문 바로가기
ros2_python/Ros2 msg,srv,action,parm

spin_until_future_complete 예제

by 알 수 없는 사용자 2022. 9. 15.

https://github.com/ros2/rclpy/issues/585

 

`MultiThreadedExecutor:spin_until_future_complete` can block when the future is ready · Issue #585 · ros2/rclpy

Bug report Required Info: Operating System: Ubuntu 20.04 Installation type: From source Version or commit hash: Foxy DDS implementation: Fast-RTPS Client library (if applicable): rclpy Steps to rep...

github.com

참고

callback 함수를 future 객체 ( 비동기 ) 로 사용하는 예제


import rclpy
from rclpy.executors import MultiThreadedExecutor, SingleThreadedExecutor
from rclpy.node import Node
from std_msgs.msg import String
from rclpy.qos import QoSProfile, QoSDurabilityPolicy
from rclpy.task import Future
import os

latching_qos = QoSProfile(depth=1,
                          durability=QoSDurabilityPolicy.RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL)


def main():
    rclpy.init()

    # Set up publisher
    pubnode = Node('pubnode_' + str(os.getpid()))
    pub1 = pubnode.create_publisher(String, 'topic1', latching_qos)
    msg1 = String()
    msg1.data = "hello1"
    pubnode.get_logger().info("Publishing hello1")
    pub1.publish(msg1)

    # Set up listener
    future_msgs = Future()
    subnode = Node('subnode_' + str(os.getpid()))
    subnode.create_subscription(String, 'topic1', lambda msg: ([
        subnode.get_logger().info("Received message on topic1"),
        future_msgs.set_result(msg)
    ]), latching_qos)

    # Start nodes
    exe = MultiThreadedExecutor()
    exe.add_node(pubnode)
    exe.add_node(subnode)

    future_msgs.add_done_callback(lambda fut: print("Future is done"))
    exe.spin_until_future_complete(future_msgs)


if __name__ == '__main__':
    main()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글