camera_coords_change_trigger.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import absolute_import
4 from __future__ import division
5 from __future__ import print_function
6 
7 import numpy as np
8 from termcolor import colored
9 
10 from geometry_msgs.msg import PoseStamped
11 import rospy
12 from std_srvs.srv import Trigger
13 import tf
14 
15 
16 def compute_pose_delta(pose1, pose2):
17  delta_x = pose1.position.x - pose2.position.x
18  delta_y = pose1.position.y - pose2.position.y
19  delta_z = pose1.position.z - pose2.position.z
20  delta_pos = np.linalg.norm([delta_x, delta_y, delta_z])
21  delta_x = pose1.orientation.x - pose2.orientation.x
22  delta_y = pose1.orientation.y - pose2.orientation.y
23  delta_z = pose1.orientation.z - pose2.orientation.z
24  delta_w = pose1.orientation.w - pose2.orientation.w
25  delta_ori = np.linalg.norm([delta_x, delta_y, delta_z, delta_w])
26  return delta_pos, delta_ori
27 
28 
30 
31  def __init__(self):
32  self.delta_pos = rospy.get_param('~delta_position', 0.03)
33  self.delta_ori = rospy.get_param('~delta_orientation', 0.03)
34  self.velocify_pos = rospy.get_param('~velocify_position', 0.01)
35  self.velocify_ori = rospy.get_param('~velocify_orientation', 0.01)
36 
38  rospy.loginfo("Waiting for service '{}'"
39  .format(rospy.resolve_name('~trigger')))
40  rospy.wait_for_service('~trigger')
41  self.trigger = rospy.ServiceProxy('~trigger', Trigger)
42  self.timer = rospy.Timer(rospy.Duration(1. / 100),
43  self.timer_callback)
44  self.last_pose_stamped = None
46 
47  def timer_callback(self, event):
48  # Get current camera coords
49  stamp = rospy.Time.now()
50  src_frame = '/world'
51  dst_frame = '/head_mount_kinect_rgb_optical_frame'
52  try:
53  self.listener.waitForTransform(src_frame, dst_frame, stamp,
54  timeout=rospy.Duration(1))
55  except Exception as e:
56  rospy.logerr(e)
57  return
58  dst_pose = self.listener.lookupTransform(src_frame, dst_frame, stamp)
59  pose_stamped = PoseStamped()
60  pose_stamped.header.frame_id = src_frame
61  pose_stamped.header.stamp = stamp
62  pose_stamped.pose.position.x = dst_pose[0][0]
63  pose_stamped.pose.position.y = dst_pose[0][1]
64  pose_stamped.pose.position.z = dst_pose[0][2]
65  pose_stamped.pose.orientation.x = dst_pose[1][0]
66  pose_stamped.pose.orientation.y = dst_pose[1][1]
67  pose_stamped.pose.orientation.z = dst_pose[1][2]
68  pose_stamped.pose.orientation.w = dst_pose[1][3]
69 
70  # Check the change
71  delta_saving_pos, delta_saving_ori = np.inf, np.inf
72  vel_pos, vel_ori = 0, 0
73  if self.last_pose_stamped is not None:
74  delta_pos, delta_ori = compute_pose_delta(
75  pose_stamped.pose, self.last_pose_stamped.pose)
76  delta_time = stamp - self.last_pose_stamped.header.stamp
77  vel_pos = delta_pos / delta_time.to_sec()
78  vel_ori = delta_ori / delta_time.to_sec()
79  if self.last_saved_pose_stamped is not None:
80  delta_saving_pos, delta_saving_ori = compute_pose_delta(
81  pose_stamped.pose, self.last_saved_pose_stamped.pose)
82 
83  self.last_pose_stamped = pose_stamped
84 
85  logging_msg = ('delta_saving_pos: {}, delta_saving_ori: {}, '
86  'vel_pos: {}, vel_ori: {}'
87  .format(delta_saving_pos,
88  delta_saving_ori, vel_pos, vel_ori))
89  # Save according to the change
90  if (delta_saving_pos > self.delta_pos and
91  delta_saving_ori > self.delta_ori and
92  vel_pos < self.velocify_pos and
93  vel_ori < self.velocify_ori):
94  rospy.loginfo(logging_msg)
95  rospy.loginfo(colored('Sending saving result', 'blue'))
96  res = self.trigger()
97  rospy.loginfo(colored('Saving request result success: {}'
98  .format(res.success),
99  'green' if res.success else 'red'))
100  if res.success:
101  self.last_saved_pose_stamped = pose_stamped
102  else:
103  rospy.loginfo_throttle(1, logging_msg)
104 
105 
106 def main():
107  rospy.init_node('camera_coords_change_trigger')
109  rospy.spin()
110 
111 
112 if __name__ == '__main__':
113  main()


jsk_data
Author(s):
autogenerated on Tue Feb 6 2018 03:45:36