10. 3 2
• 3 ) Ot h r c
$ ros2 pkg create –build-type ament_python YOUR_AWESOME_PACKAGE
u lnkc / 2 ) / g ws_rt c
• 2 ) .32uo_ k c nkkx t mP u
• r a u
• ( yu .32 t r / le snk
(SRt cs s s .32 rgp (
13. ; =fR
• 2 2 m si a 2 . S _
R S Rc a
• 2 S d_ . . o ld O
• . 3 2 P b a R3 3 prl ba
$ ros2 run examples_rclpy_topics publisher
• O
• c e u“ fys m =;2 c _b a
• c ; p s e “ lays m ai t m _a
=;2 c . . / . ; ; 2 S
• ha ys fr mP S ai
1 ld
14. ,
• h . 2 v x i , egkm 2h
O rs PChy o n o
• _h . ,. , e h x O rs a oLR y h
o n v xo n e MSe
find_package(std_msgs REQUIRED)
find_package(action_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/SetMessage.srv"
"action/Fibonacci.action"
DEPENDENCIES std_msgs action_msgs
)
ament_export_dependencies(rosidl_default_runtime)
ament_package()
,
16. import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher = self.create_publisher(String, 'chatter')
self.timer = self.create_timer(0.5, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = 'Hello World!'
self.publisher.publish(msg)
self.get_logger().info(msg.data)
_e
.
c
. dea
R . .
R N
. R
.
R _e
R
26. import time
from example_interfaces.action import Fibonacci
import rclpy
from rclpy.action import ActionServer, CancelResponse, GoalResponse
from rclpy.callback_groups import ReentrantCallbackGroup
from rclpy.executors import MultiThreadedExecutor
from rclpy.node import Node
class MinimalActionServer(Node):
def __init__(self):
super().__init__('minimal_action_server')
self._action_server = ActionServer(
self, Fibonacci, 'fibonacci',
execute_callback=self.execute_callback,
callback_group=ReentrantCallbackGroup())
_e _
b ec
b aec
27. def destroy(self):
self._action_server.destroy()
super().destroy_node()
async def execute_callback(self, goal_handle):
self.get_logger().info('executing...')
msg = Fibonacci.Feedback()
msg.sequence = [0, 1]
for i in range(1, goal_handle.request.order):
if goal_handle.is_cancel_requested:
goal_handle.canceled()
self.get_logger().info('goal_canceled')
return Fibonacci.Result()
msg.sequence.append(msg.sequence[i] + msg.sequence[i-1])
self.get_logger().info('feedback:{}'.format(msg.sequence))
goal_handle.publish_feedback(msg)
time.sleep(1) # dummy job
. /
/ PdI
c
w sn i
f a h f
. i
f f
t t Oe
5 3
Pd
f f
t
f f
28. goal_handle.set_succeeded()
result = Fibonacci.Result()
result.sequence = msg.sequence
self.get_logger().info('result:{}'.format(result.sequence))
return result
def main(args=None):
rclpy.init(args=args)
minimal_action_server = MinimalActionServer()
executor = MultiThreadedExecutor()
rclpy.spin(minimal_action_server, executor=executor)
minimal_action_server.destroy()
rclpy.shutdown()
if __name__ == '__main__':
main()
E
E
29. from action_msgs.msg import GoalStatus
from example_interfaces.action import Fibonacci
import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
class MinimalActionClient(Node):
def __init__(self):
super().__init__('minimal_action_client')
self._action_client = ActionClient(self, Fibonacci, 'fibonacci')
31. def get_result_callback(self, future):
status = future.result().action_status
if status == GoalStatus.STATUS_SUCCEEDED:
self.get_logger().info('result:{}'.format(
future.result().requence))
rclpy.shutdown()
def send_goal(self):
self.get_logger().info('waiting...')
self._action_client.wait_for_server()
goal_msg = Fibonacci.Goal()
goal_msg.order = 10
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)
ca _
b
b 3
b c
b