19 from rclpy.duration
import Duration
22 Basic recoveries demo. In this demonstration, the robot navigates
23 to a dead-end where recoveries such as backup and spin are used
31 navigator = BasicNavigator()
34 initial_pose = PoseStamped()
35 initial_pose.header.frame_id =
'map'
36 initial_pose.header.stamp = navigator.get_clock().now().to_msg()
37 initial_pose.pose.position.x = 0.0
38 initial_pose.pose.position.y = 0.0
39 initial_pose.pose.orientation.z = 0.0
40 initial_pose.pose.orientation.w = 1.0
41 navigator.setInitialPose(initial_pose)
44 navigator.waitUntilNav2Active()
46 goal_pose = PoseStamped()
47 goal_pose.header.frame_id =
'map'
48 goal_pose.header.stamp = navigator.get_clock().now().to_msg()
49 goal_pose.pose.position.x = 8.21
50 goal_pose.pose.position.y = 1.3
51 goal_pose.pose.orientation.w = 1.0
53 go_to_pose_task = navigator.goToPose(goal_pose)
56 while not navigator.isTaskComplete(task=go_to_pose_task):
58 feedback = navigator.getFeedback(task=go_to_pose_task)
59 if feedback
and i % 5 == 0:
61 f
'Estimated time of arrival to destination is: \
62 {Duration.from_msg(feedback.estimated_time_remaining).nanoseconds / 1e9}'
66 print(
"Robot hit a dead end (let's pretend), backing up...")
67 backup_task = navigator.backup(backup_dist=0.5, backup_speed=0.1)
70 while not navigator.isTaskComplete(task=backup_task):
72 feedback = navigator.getFeedback(task=backup_task)
73 if feedback
and i % 5 == 0:
74 print(f
'Distance traveled: {feedback.distance_traveled}')
77 print(
'Spinning robot around...')
78 spin_task = navigator.spin(spin_dist=3.14)
81 while not navigator.isTaskComplete(task=spin_task):
83 feedback = navigator.getFeedback(task=spin_task)
84 if feedback
and i % 5 == 0:
85 print(f
'Spin angle traveled: {feedback.angular_distance_traveled}')
87 result = navigator.getResult()
88 if result == TaskResult.SUCCEEDED:
89 print(
'Dead end confirmed! Returning to start...')
90 elif result == TaskResult.CANCELED:
91 print(
'Recovery was canceled. Returning to start...')
92 elif result == TaskResult.FAILED:
93 (error_code, error_msg) = navigator.getTaskError()
94 print(f
'Recovering from dead end failed!:{error_code}:{error_msg}')
95 print(
'Returning to start...')
97 initial_pose.header.stamp = navigator.get_clock().now().to_msg()
98 go_to_pose_task = navigator.goToPose(initial_pose)
99 while not navigator.isTaskComplete(task=go_to_pose_task):
105 if __name__ ==
'__main__':