9 from actionlib_msgs.msg
import GoalStatus
10 from geometry_msgs.msg
import Transform, TransformStamped, PoseStamped
11 from geometry_msgs.msg
import PoseWithCovarianceStamped, Quaternion
12 from move_base_msgs.msg
import MoveBaseAction, MoveBaseGoal, MoveBaseResult
37 rospy.Subscriber(
"/initialpose", PoseWithCovarianceStamped, self.
initalpose_callback, queue_size=1)
38 initialpose = rospy.get_param(
"~initialpose",
None)
39 if type(initialpose) == list:
40 rospy.loginfo(
"using initialpose from parameter server: %s", str(initialpose))
41 elif type(initialpose) == str:
42 rospy.loginfo(
"using initialpose from script server: %s", str(initialpose))
43 initialpose = rospy.get_param(
"/script_server/base/" + initialpose)
45 rospy.loginfo(
"initialpose not set, using [0, 0, 0] as initialpose")
46 initialpose = [0, 0, 0]
51 quat = tf.transformations.quaternion_from_euler(0, 0, initialpose[2])
54 rospy.Timer(rospy.Duration(0.04), self.
timer_cb)
56 rospy.loginfo(
"Emulation for navigation running")
61 rospy.loginfo(
"Emulation running without move_base")
69 rospy.logwarn(
"Emulation running without move_base due to invalid value for parameter move_base_mode: '%s'", self.
_move_base_mode)
72 rospy.loginfo(
"Got initialpose, updating %s transformation.", self.
_odom_frame)
75 base_in_odom = self.
_buffer.lookup_transform(
"base_footprint", self.
_odom_frame, rospy.Time(0))
77 trans_ini = tf.transformations.translation_matrix([msg.pose.pose.position.x, msg.pose.pose.position.y, msg.pose.pose.position.z])
78 rot_ini = tf.transformations.quaternion_matrix([msg.pose.pose.orientation.x, msg.pose.pose.orientation.y, msg.pose.pose.orientation.z, msg.pose.pose.orientation.w])
79 matrix_ini = numpy.dot(trans_ini, rot_ini)
81 trans_base_odom = tf.transformations.translation_matrix([base_in_odom.transform.translation.x, base_in_odom.transform.translation.y, base_in_odom.transform.translation.z])
82 rot_base_odom = tf.transformations.quaternion_matrix([base_in_odom.transform.rotation.x, base_in_odom.transform.rotation.y, base_in_odom.transform.rotation.z, base_in_odom.transform.rotation.w])
83 matrix_base_odom = numpy.dot(trans_base_odom, rot_base_odom)
86 matrix_new_odom = numpy.dot(matrix_ini, matrix_base_odom)
89 trans_new_odom = tf.transformations.translation_from_matrix(matrix_new_odom)
90 rot_new_odom = tf.transformations.quaternion_from_matrix(matrix_new_odom)
99 except Exception
as e:
100 rospy.logerr(
"Could not calculate new odom transformation:\n%s", e)
106 t_loc = TransformStamped()
107 t_loc.header.stamp = rospy.Time.now()
108 t_loc.header.frame_id =
"map"
117 pwcs = PoseWithCovarianceStamped()
118 pwcs.header = goal.target_pose.header
119 pwcs.pose.pose = goal.target_pose.pose
121 rospy.loginfo(
"move_base: beaming robot to new goal")
124 move_base_linear_action_name =
"/move_base_linear"
126 rospy.loginfo(
"Waiting for ActionServer: %s", move_base_linear_action_name)
127 if not ac_move_base_linear.wait_for_server(rospy.Duration(1)):
128 rospy.logerr(
"Emulator move_base failed because move_base_linear action server is not available")
131 rospy.loginfo(
"send goal to %s", move_base_linear_action_name)
132 ac_move_base_linear.send_goal(goal)
133 ac_move_base_linear.wait_for_result()
134 ac_move_base_linear_status = ac_move_base_linear.get_state()
135 ac_move_base_linear_result = ac_move_base_linear.get_result()
136 if ac_move_base_linear_status != GoalStatus.SUCCEEDED:
137 rospy.logerr(
"Emulator move_base failed because move_base_linear failed")
141 rospy.logerr(
"Invalid move_base_action_mode")
144 rospy.loginfo(
"Emulator move_base succeeded")
148 goal = MoveBaseGoal()
149 goal.target_pose = msg
152 if not ac_move_base.wait_for_server(rospy.Duration(1)):
153 rospy.logerr(
"Emulator move_base simple failed because move_base action server is not available")
156 ac_move_base.send_goal(goal)
159 if __name__ ==
'__main__':
160 rospy.init_node(
'emulation_nav')
161 parser = argparse.ArgumentParser(conflict_handler=
'resolve',
162 description=
"Tool for emulating nav by providing localization and move base interface")
163 parser.add_argument(
'-o',
'--odom_frame', help=
'odom frame name (default: \'odom_combined\')', default=
'odom_combined')
164 args, unknown = parser.parse_known_args()
165 rospy.loginfo(
"emulation_nav started!")