https://docs.ros.org/en/eloquent/Tutorials/Actions/Writing-a-Py-Action-Server-Client.html
Writing an action server and client (Python) — ROS 2 Documentation: Eloquent documentation
You're reading the documentation for a version of ROS 2 that has reached its EOL (end-of-life), and is no longer officially supported. If you want up-to-date information, please have a look at Iron. Writing an action server and client (Python) Goal: Implem
docs.ros.org
기본구
# SERVER
import time
import rclpy
from rclpy.action import ActionServer
from rclpy.node import Node
from action_tutorials_interfaces.action import Fibonacci
class FibonacciActionServer(Node):
def __init__(self):
super().__init__('fibonacci_action_server')
self._action_server = ActionServer(
self,
Fibonacci,
'fibonacci',
self.execute_callback)
def execute_callback(self, goal_handle):
self.get_logger().info('Executing goal...')
feedback_msg = Fibonacci.Feedback()
feedback_msg.partial_sequence = [0, 1]
for i in range(1, goal_handle.request.order):
feedback_msg.partial_sequence.append(
feedback_msg.partial_sequence[i] + feedback_msg.partial_sequence[i-1])
self.get_logger().info('Feedback: {0}'.format(feedback_msg.partial_sequence))
goal_handle.publish_feedback(feedback_msg)
time.sleep(1)
goal_handle.succeed()
result = Fibonacci.Result()
result.sequence = feedback_msg.partial_sequence
return result
def main(args=None):
rclpy.init(args=args)
action_client = FibonacciActionServer()
rclpy.spin(action_client)
if __name__ == '__main__':
main()
# CLIENT
import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
from action_tutorials_interfaces.action import Fibonacci
class FibonacciActionClient(Node):
def __init__(self):
super().__init__('fibonacci_action_client')
self._action_client = ActionClient(self, Fibonacci, 'fibonacci')
self.tmp=True
def send_goal(self, order):
goal_msg = Fibonacci.Goal()
goal_msg.order = order
self._action_client.wait_for_server()
self.get_logger().warning(f"{1} << Goal Service : {'Request'}")
self._send_goal_future = self._action_client.send_goal_async(goal_msg, feedback_callback=self.feedback_callback)
self._send_goal_future.add_done_callback(self.goal_response_callback)
def goal_response_callback(self, future):
self.get_logger().warning(f"{2} << Goal Service : {'Response'} < response : {future.result()}")
goal_handle = future.result()
if not goal_handle.accepted:
self.get_logger().info('Goal rejected :(')
return
self._get_result_future = goal_handle.get_result_async()
self.get_logger().warning(f"{3} << Result Service : {'Request'} < {self._get_result_future}")
self._get_result_future.add_done_callback(self.get_result_callback)
def get_result_callback(self, future):
result = future.result().result
self.get_logger().warning(f"{5} << Result Service : {'Response'} < Result : {result.sequence}")
rclpy.shutdown()
def feedback_callback(self, feedback_msg):
if self.tmp is True:
self.get_logger().warning(f"{4} << Feedback Topic : {'TOPIC'}")
self.tmp = False
feedback = feedback_msg.feedback
self.get_logger().info('Received feedback: {0}'.format(feedback.partial_sequence))
def main(args=None):
rclpy.init(args=args)
action_client = FibonacciActionClient()
action_client.send_goal(10)
rclpy.spin(action_client)
if __name__ == '__main__':
main()
print out
'ros2_python > Ros2 msg,srv,action,parm' 카테고리의 다른 글
ros2 topic spin 중에 등록해도 동작할까 (0) | 2023.08.28 |
---|---|
ROS2 service blocking 피하는 방법 (0) | 2023.07.01 |
Service 비교 ROS1 vs ROS2 (spin돌려야되나?) (0) | 2023.07.01 |
Ros2 비동기적으로 spin( ) (0) | 2022.09.15 |
spin_until_future_complete 예제 (0) | 2022.09.15 |
댓글