Nav2 Navigation Stack - humble  humble
ROS 2 Navigation Stack
example_waypoint_follower.py
1 #! /usr/bin/env python3
2 # Copyright 2021 Samsung Research America
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from geometry_msgs.msg import PoseStamped
17 from nav2_simple_commander.robot_navigator import BasicNavigator, TaskResult
18 import rclpy
19 from rclpy.duration import Duration
20 
21 """
22 Basic navigation demo to go to poses.
23 """
24 
25 
26 def main():
27  rclpy.init()
28 
29  navigator = BasicNavigator()
30 
31  # Set our demo's initial pose
32  initial_pose = PoseStamped()
33  initial_pose.header.frame_id = 'map'
34  initial_pose.header.stamp = navigator.get_clock().now().to_msg()
35  initial_pose.pose.position.x = 3.45
36  initial_pose.pose.position.y = 2.15
37  initial_pose.pose.orientation.z = 1.0
38  initial_pose.pose.orientation.w = 0.0
39  navigator.setInitialPose(initial_pose)
40 
41  # Activate navigation, if not autostarted. This should be called after setInitialPose()
42  # or this will initialize at the origin of the map and update the costmap with bogus readings.
43  # If autostart, you should `waitUntilNav2Active()` instead.
44  # navigator.lifecycleStartup()
45 
46  # Wait for navigation to fully activate, since autostarting nav2
47  navigator.waitUntilNav2Active()
48 
49  # If desired, you can change or load the map as well
50  # navigator.changeMap('/path/to/map.yaml')
51 
52  # You may use the navigator to clear or obtain costmaps
53  # navigator.clearAllCostmaps() # also have clearLocalCostmap() and clearGlobalCostmap()
54  # global_costmap = navigator.getGlobalCostmap()
55  # local_costmap = navigator.getLocalCostmap()
56 
57  # set our demo's goal poses to follow
58  goal_poses = []
59  goal_pose1 = PoseStamped()
60  goal_pose1.header.frame_id = 'map'
61  goal_pose1.header.stamp = navigator.get_clock().now().to_msg()
62  goal_pose1.pose.position.x = 1.5
63  goal_pose1.pose.position.y = 0.55
64  goal_pose1.pose.orientation.w = 0.707
65  goal_pose1.pose.orientation.z = 0.707
66  goal_poses.append(goal_pose1)
67 
68  # additional goals can be appended
69  goal_pose2 = PoseStamped()
70  goal_pose2.header.frame_id = 'map'
71  goal_pose2.header.stamp = navigator.get_clock().now().to_msg()
72  goal_pose2.pose.position.x = 1.5
73  goal_pose2.pose.position.y = -3.75
74  goal_pose2.pose.orientation.w = 0.707
75  goal_pose2.pose.orientation.z = 0.707
76  goal_poses.append(goal_pose2)
77  goal_pose3 = PoseStamped()
78  goal_pose3.header.frame_id = 'map'
79  goal_pose3.header.stamp = navigator.get_clock().now().to_msg()
80  goal_pose3.pose.position.x = -3.6
81  goal_pose3.pose.position.y = -4.75
82  goal_pose3.pose.orientation.w = 0.707
83  goal_pose3.pose.orientation.z = 0.707
84  goal_poses.append(goal_pose3)
85 
86  # sanity check a valid path exists
87  # path = navigator.getPath(initial_pose, goal_pose1)
88 
89  nav_start = navigator.get_clock().now()
90  navigator.followWaypoints(goal_poses)
91 
92  i = 0
93  while not navigator.isTaskComplete():
94 
99 
100  # Do something with the feedback
101  i = i + 1
102  feedback = navigator.getFeedback()
103  if feedback and i % 5 == 0:
104  print('Executing current waypoint: ' +
105  str(feedback.current_waypoint + 1) + '/' + str(len(goal_poses)))
106  now = navigator.get_clock().now()
107 
108  # Some navigation timeout to demo cancellation
109  if now - nav_start > Duration(seconds=600.0):
110  navigator.cancelTask()
111 
112  # Some follow waypoints request change to demo preemption
113  if now - nav_start > Duration(seconds=35.0):
114  goal_pose4 = PoseStamped()
115  goal_pose4.header.frame_id = 'map'
116  goal_pose4.header.stamp = now.to_msg()
117  goal_pose4.pose.position.x = -5.0
118  goal_pose4.pose.position.y = -4.75
119  goal_pose4.pose.orientation.w = 0.707
120  goal_pose4.pose.orientation.z = 0.707
121  goal_poses = [goal_pose4]
122  nav_start = now
123  navigator.followWaypoints(goal_poses)
124 
125  # Do something depending on the return code
126  result = navigator.getResult()
127  if result == TaskResult.SUCCEEDED:
128  print('Goal succeeded!')
129  elif result == TaskResult.CANCELED:
130  print('Goal was canceled!')
131  elif result == TaskResult.FAILED:
132  print('Goal failed!')
133  else:
134  print('Goal has an invalid return status!')
135 
136  navigator.lifecycleShutdown()
137 
138  exit(0)
139 
140 
141 if __name__ == '__main__':
142  main()