|
3 | 3 | #include <sensor_msgs/image_encodings.h> |
4 | 4 | #include <geometry_msgs/Vector3.h> |
5 | 5 | //#include <geometry_msgs/Point.h> |
6 | | - |
| 6 | +#include <math.h> |
7 | 7 |
|
8 | 8 | geometry_msgs::Vector3 getUnitTranslation(cv::Point point, const cv::Mat& K){ |
9 | 9 | geometry_msgs::Vector3 unit_translate; |
@@ -61,6 +61,8 @@ EOD_ROS::EOD_ROS(ros::NodeHandle nh, ros::NodeHandle nh_p){ |
61 | 61 | } |
62 | 62 | } |
63 | 63 | ROS_INFO("Selected to detect on start %li objects", selected_simple_objects.size()); |
| 64 | + |
| 65 | + set_simple_objects_srv_ = nh_p_.advertiseService("set_simple_objects", &EOD_ROS::set_simple_objects_cb, this); |
64 | 66 |
|
65 | 67 | // set up publishers |
66 | 68 | simple_objects_pub_ = nh_p.advertise<extended_object_detection::SimpleObjectArray>("simple_objects",1); |
@@ -243,13 +245,70 @@ extended_object_detection::BaseObject EOD_ROS::eoi_to_base_object( eod::SimpleOb |
243 | 245 | else{ |
244 | 246 | bo.transform.translation = getUnitTranslation(eoi->getCenter(), K); |
245 | 247 | } |
246 | | - |
247 | | - |
248 | | - //TODO tracks |
249 | | - |
| 248 | + |
| 249 | + //TODO tracks |
250 | 250 | return bo; |
251 | 251 | } |
252 | 252 |
|
| 253 | +int EOD_ROS::find_simple_obj_index_by_id(int id){ |
| 254 | + for( int i = 0 ; i < selected_simple_objects.size() ; i++ ){ |
| 255 | + if( selected_simple_objects[i]->ID == id ) |
| 256 | + return i; |
| 257 | + } |
| 258 | + return -1; |
| 259 | +} |
| 260 | + |
| 261 | +bool EOD_ROS::set_simple_objects_cb(extended_object_detection::SetObjects::Request &req, extended_object_detection::SetObjects::Response &res){ |
| 262 | + |
| 263 | + if( req.remove_all && req.add_all ){ |
| 264 | + // do literally nothing |
| 265 | + } |
| 266 | + else{ |
| 267 | + if( req.remove_all ){ |
| 268 | + selected_simple_objects.clear(); |
| 269 | + } |
| 270 | + else if( req.add_all ){ |
| 271 | + selected_simple_objects.clear(); |
| 272 | + selected_simple_objects.assign(object_base->simple_objects.begin(), object_base->simple_objects.end()); |
| 273 | + } |
| 274 | + else{ |
| 275 | + for( auto& change : req.changes ){ |
| 276 | + int object_id = abs(change); |
| 277 | + eod::SimpleObject* so = object_base->getSimpleObjectByID(object_id); |
| 278 | + if(so){ |
| 279 | + // add |
| 280 | + if( change > 0 ){ |
| 281 | + if( find_simple_obj_index_by_id(object_id) != -1 ){ |
| 282 | + // already selected |
| 283 | + ROS_WARN("[set_simple_objects srv] object with id %i is already selected", object_id); |
| 284 | + } |
| 285 | + else{ |
| 286 | + selected_simple_objects.push_back(so); |
| 287 | + } |
| 288 | + } |
| 289 | + // remove |
| 290 | + else{ |
| 291 | + int no_in_list = find_simple_obj_index_by_id(object_id); |
| 292 | + if( no_in_list != -1 ){ |
| 293 | + selected_simple_objects.erase(selected_simple_objects.begin()+no_in_list); |
| 294 | + } |
| 295 | + else{ |
| 296 | + // already removed |
| 297 | + ROS_WARN("[set_simple_objects srv] object with id %i is already removed", object_id); |
| 298 | + } |
| 299 | + } |
| 300 | + } |
| 301 | + else{ |
| 302 | + ROS_ERROR("[set_simple_objects srv] no object in base with id %i",object_id); |
| 303 | + } |
| 304 | + } |
| 305 | + } |
| 306 | + } |
| 307 | + for(auto& so : selected_simple_objects ) |
| 308 | + res.result.push_back(so->ID); |
| 309 | + return true; |
| 310 | +} |
| 311 | + |
253 | 312 | int main(int argc, char **argv) |
254 | 313 | { |
255 | 314 | ros::init(argc, argv, "extended_object_detection_node"); |
|
0 commit comments