ros2_python/Ros2 msg,srv,action,parm
spin_until_future_complete 예제
알 수 없는 사용자
2022. 9. 15. 10:34
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()