PTUTracker.cpp
Go to the documentation of this file.
1 
18 #include <ros/ros.h>
19 #include <asr_msgs/AsrObject.h>
20 #include <geometry_msgs/PoseStamped.h>
21 #include <sensor_msgs/JointState.h>
22 #include <string>
23 #include <stdio.h>
24 #include <iostream>
25 #include <boost/thread.hpp>
26 #include <boost/date_time/posix_time/posix_time.hpp>
27 #include <tf/transform_listener.h>
29 #include <tf/transform_datatypes.h>
30 #include <unistd.h>
31 #include <termios.h>
32 
33 #define RAD_TO_DEG (180.0 / M_PI)
34 #define DEG_TO_RAD (1 / RAD_TO_DEG)
35 
36 class PTUTracker {
37 
38  struct Point3f{
39  float x, y, z;
40  };
41  struct Point2f{
42  float x, y;
43  };
44 public:
46 
47  // Publications / Subscriptions
51 
52  //Param names
55 
56  //States
57  std::vector<double> ptuPosition;
58 
59  geometry_msgs::Pose fob_pose_left;
60  geometry_msgs::Pose fob_pose_right;
61 
62  geometry_msgs::PointStamped ptuPoint;
63  geometry_msgs::PointStamped fobPoint;
64 
65  struct termios oldt;
66 
67 
70 
71  //FOB Callback
72  void fobCB(const asr_msgs::AsrObject& fob_msg) {
73 
74  if(!fob_msg.sampledPoses.size()){
75  std::cerr << "Got a AsrObject without poses." << std::endl;
76  std::exit(1);
77  }
78 
79  if (!fob_msg.identifier.empty() && strcmp(fob_msg.identifier.c_str(), fob_tracking_point_left.c_str()) == 0) {
80  ROS_DEBUG("fob left message recieved");
81  fob_pose_left = fob_msg.sampledPoses.front().pose;
82  }else if (!fob_msg.identifier.empty() && strcmp(fob_msg.identifier.c_str(), fob_tracking_point_right.c_str()) == 0) {
83  ROS_DEBUG("fob right message recieved");
84  fob_pose_right = fob_msg.sampledPoses.front().pose;
85  }
86  }
87 
88  //PTU Callback
89  void ptuCB(const sensor_msgs::JointState& ptu_msg) {
90  ptuPosition = ptu_msg.position;
91  }
92 
93  //Initializations and configure
95  this->nh = nh;
96  nh.getParam("ptu_pub_topic", ptu_state_cmd);
97  nh.getParam("ptu_sub_topic", ptu_state);
98  nh.getParam("fob_sub_topic", fob_topic);
99  nh.getParam("fob_tracking_point_left", fob_tracking_point_left);
100  nh.getParam("fob_tracking_point_right", fob_tracking_point_right);
101 
102  nh.getParam("panAmount", panAmount);
103  nh.getParam("tiltAmount", tiltAmount);
104 
105  std::string fob_frame, ptu_frame;
106  nh.getParam("tracker_frame", fob_frame);
107  nh.getParam("ptu_base_frame", ptu_frame);
108 
109  fob_sub = nh.subscribe(fob_topic, 1, &PTUTracker::fobCB, this);
110  ptu_sub = nh.subscribe("/asr_flir_ptu_driver/state", 1, &PTUTracker::ptuCB, this);
111  ptu_pub = nh.advertise<sensor_msgs::JointState>(ptu_state_cmd, 5);
112 
113  fobPoint.header.frame_id = fob_frame;
114  fobPoint.header.stamp = ros::Time(0);
115  ptuPoint.header.frame_id = ptu_frame;
116  ptuPoint.header.stamp = ros::Time(0);
117 
118  boost::thread trackerThread(spin, this);
119  ros::spin();
120  trackerThread.interrupt();
121 
122  //reapply the old Terminal settings
123  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
124 
125  }
126 
127  Point2f toSphereCoords(geometry_msgs::PointStamped p) {
128  Point3f temp;
129  temp.x = p.point.x;
130  temp.y = p.point.y;
131  temp.z = p.point.z;
132 
133  return toSphereCoords(temp);
134  }
135 
137  Point2f pantilt;
138  Point3f p;
139  p.x = -pt.y;
140  p.y = -pt.x;
141  p.z = -pt.z;
142  double panAngle = (p.x < 0)? 1 : -1;
143  panAngle *= acos(-p.y / (sqrt(p.x * p.x + p.y * p.y))) * RAD_TO_DEG;
144 
145  double tiltAngle = (p.z > 0)? -1 : 1;
146  tiltAngle *= acos(-p.y / (sqrt(p.y * p.y + p.z * p.z))) * RAD_TO_DEG;
147 
148  pantilt.x = panAngle;
149  pantilt.y = tiltAngle;
150 
151  return pantilt;
152  }
153 
154  void movePTU(char c){
155  if(c!='l' && c !='r'){
156  return;
157  }
158 
159  //transformation into sphere coords is only possible if the point is in the PTU frame
160  if(c == 'l'){
161  fobPoint.point.x = fob_pose_left.position.x;
162  fobPoint.point.y = fob_pose_left.position.y;
163  fobPoint.point.z = fob_pose_left.position.z;
164  }else if(c == 'r'){
165  fobPoint.point.x = fob_pose_right.position.x;
166  fobPoint.point.y = fob_pose_right.position.y;
167  fobPoint.point.z = fob_pose_right.position.z;
168  }
169  tf.transformPoint(ptuPoint.header.frame_id, fobPoint, ptuPoint);
170  Point2f pantiltTarget = toSphereCoords(ptuPoint);
171  rotPTUAbsolute(pantiltTarget.x, pantiltTarget.y);
172 
173  }
174  void rotPTUAbsolute(double pan, double tilt){
175  ROS_INFO("Target pan tilt angle: ([%f %f])", pan, tilt);
176 
177  sensor_msgs::JointState pantiltState;
178  pantiltState.header.stamp = ros::Time::now();
179 
180  pantiltState.name.push_back("pan");
181  pantiltState.name.push_back("tilt");
182 
183  pantiltState.position.push_back(pan);
184  pantiltState.position.push_back(tilt);
185 
186  pantiltState.velocity.push_back(0);
187  pantiltState.velocity.push_back(0);
188 
189  ptu_pub.publish(pantiltState);
190  }
191  void rotPTURelative(double pan, double tilt){
192  pan = pan + ptuPosition[0];
193  tilt = tilt + ptuPosition[1];
194  rotPTUAbsolute(pan, tilt);
195  }
196 
197  int getch(void)
198  {
199  //overlays echo from Terminal
200  int ch;
201  struct termios newt;
202  tcgetattr(STDIN_FILENO, &oldt);
203  newt = oldt;
204  newt.c_lflag &= ~(ICANON | ECHO);
205  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
206  ch = getchar();
207  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
208  return ch;
209  }
210 
211  int getKey()
212  {
213  int result=getch();
214  if(result==0){
215  result=256+getch();
216  }
217  return result;
218  }
219 
220  static void spin(PTUTracker* tracker){
221  std::string input;
222  ROS_INFO("Press <l> to move PTU to left tracker.");
223  ROS_INFO("Press <r> to move PTU to right tracker.");
224  ROS_INFO("Use Arrowkeys to move PTU (do not hold key down).");
225 
226  while (true){
227  char c = tracker->getKey();
228 
229  if(c == 'l' || c == 'r'){
230  tracker->movePTU(c);
231  }else if(c == 65){
232  tracker->rotPTURelative(0,tracker->tiltAmount);
233  }else if(c == 66){
234  tracker->rotPTURelative(0,-tracker->tiltAmount);
235  }else if(c == 67){
236  tracker->rotPTURelative(-tracker->panAmount,0);
237  }else if(c == 68){
238  tracker->rotPTURelative(tracker->panAmount,0);
239  }
240  boost::this_thread::sleep(boost::posix_time::milliseconds(100));
241  }
242  }
243 };
244 
245 int main(int argc, char** argv)
246 {
247  ros::init(argc, argv, "ptu_tracker");
248  ros::NodeHandle nh("~");
249  new ::PTUTracker(nh);
250  return 0;
251 }
geometry_msgs::Pose fob_pose_right
Definition: PTUTracker.cpp:60
std::vector< double > ptuPosition
Definition: PTUTracker.cpp:57
ros::Subscriber fob_sub
Definition: PTUTracker.cpp:48
void publish(const boost::shared_ptr< M > &message) const
geometry_msgs::Pose fob_pose_left
Definition: PTUTracker.cpp:59
Point2f toSphereCoords(geometry_msgs::PointStamped p)
Definition: PTUTracker.cpp:127
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
int main(int argc, char **argv)
Definition: PTUTracker.cpp:245
int tiltAmount
Definition: PTUTracker.cpp:54
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
geometry_msgs::PointStamped ptuPoint
Definition: PTUTracker.cpp:62
void transformPoint(const std::string &target_frame, const geometry_msgs::PointStamped &stamped_in, geometry_msgs::PointStamped &stamped_out) const
#define RAD_TO_DEG
Definition: PTUTracker.cpp:33
ros::NodeHandle nh
Definition: PTUTracker.cpp:45
ros::Publisher ptu_pub
Definition: PTUTracker.cpp:50
struct termios oldt
Definition: PTUTracker.cpp:65
int getKey()
Definition: PTUTracker.cpp:211
ROSCPP_DECL void spin(Spinner &spinner)
void movePTU(char c)
Definition: PTUTracker.cpp:154
std::string ptu_state
Definition: PTUTracker.cpp:53
void ptuCB(const sensor_msgs::JointState &ptu_msg)
Definition: PTUTracker.cpp:89
void rotPTUAbsolute(double pan, double tilt)
Definition: PTUTracker.cpp:174
static void spin(PTUTracker *tracker)
Definition: PTUTracker.cpp:220
Point2f toSphereCoords(Point3f pt)
Definition: PTUTracker.cpp:136
#define ROS_INFO(...)
std::string fob_tracking_point_right
Definition: PTUTracker.cpp:53
std::string fob_topic
Definition: PTUTracker.cpp:53
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
tf::TransformListener tf
Definition: PTUTracker.cpp:68
tf::TransformBroadcaster tb
Definition: PTUTracker.cpp:69
void fobCB(const asr_msgs::AsrObject &fob_msg)
Definition: PTUTracker.cpp:72
bool getParam(const std::string &key, std::string &s) const
int getch(void)
Definition: PTUTracker.cpp:197
std::string ptu_state_cmd
Definition: PTUTracker.cpp:53
static Time now()
PTUTracker(ros::NodeHandle nh)
Definition: PTUTracker.cpp:94
ros::Subscriber ptu_sub
Definition: PTUTracker.cpp:49
geometry_msgs::PointStamped fobPoint
Definition: PTUTracker.cpp:63
void rotPTURelative(double pan, double tilt)
Definition: PTUTracker.cpp:191
std::string fob_tracking_point_left
Definition: PTUTracker.cpp:53
#define ROS_DEBUG(...)


asr_flock_of_birds_tracking
Author(s): Engelmann Stephan, Heller Florian, Meißner Pascal, Stöckle Patrick, Wittenbeck Valerij
autogenerated on Thu Feb 20 2020 03:49:37