Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef JSK_PCL_ROS_ICP_REGISTRATION_H_
00038 #define JSK_PCL_ROS_ICP_REGISTRATION_H_
00039
00040 #include <pcl_ros/pcl_nodelet.h>
00041 #include <dynamic_reconfigure/server.h>
00042 #include <jsk_pcl_ros/ICPRegistrationConfig.h>
00043 #include <jsk_recognition_msgs/BoundingBox.h>
00044 #include <jsk_recognition_msgs/ICPAlignWithBox.h>
00045 #include <jsk_recognition_msgs/ICPAlign.h>
00046 #include <jsk_recognition_msgs/ICPResult.h>
00047 #include <message_filters/subscriber.h>
00048 #include <message_filters/time_synchronizer.h>
00049 #include <message_filters/synchronizer.h>
00050 #include "jsk_pcl_ros/tf_listener_singleton.h"
00051 #include <jsk_topic_tools/connection_based_nodelet.h>
00052 #include <jsk_recognition_msgs/PointsArray.h>
00053 #include <sensor_msgs/CameraInfo.h>
00054 #include <jsk_recognition_utils/time_util.h>
00055 #include <std_msgs/Float32.h>
00056
00057 namespace jsk_pcl_ros
00058 {
00059 class ICPRegistration: public jsk_topic_tools::ConnectionBasedNodelet
00060 {
00061 public:
00062 typedef pcl::PointXYZRGBNormal PointT;
00063 typedef jsk_pcl_ros::ICPRegistrationConfig Config;
00064 typedef message_filters::sync_policies::ExactTime<
00065 sensor_msgs::PointCloud2,
00066 jsk_recognition_msgs::BoundingBox > SyncPolicy;
00067 typedef message_filters::sync_policies::ExactTime<
00068 sensor_msgs::PointCloud2,
00069 geometry_msgs::PoseStamped > OffsetSyncPolicy;
00070 typedef message_filters::sync_policies::ExactTime<
00071 sensor_msgs::PointCloud2,
00072 sensor_msgs::PointCloud2
00073 > ReferenceSyncPolicy;
00074 ICPRegistration(): timer_(10), done_init_(false) { }
00075 protected:
00077
00079 virtual void onInit();
00080 virtual void align(const sensor_msgs::PointCloud2::ConstPtr& msg);
00081 virtual void align(const sensor_msgs::PointCloud2::ConstPtr& msg,
00082 const sensor_msgs::PointCloud2::ConstPtr& reference_msg);
00083 virtual void alignWithBox(
00084 const sensor_msgs::PointCloud2::ConstPtr& msg,
00085 const jsk_recognition_msgs::BoundingBox::ConstPtr& box_msg);
00086 virtual void alignWithOffset(
00087 const sensor_msgs::PointCloud2::ConstPtr& msg,
00088 const geometry_msgs::PoseStamped::ConstPtr& pose_msg);
00089 virtual bool alignWithBoxService(
00090 jsk_recognition_msgs::ICPAlignWithBox::Request& req,
00091 jsk_recognition_msgs::ICPAlignWithBox::Response& res);
00092 virtual bool alignService(
00093 jsk_recognition_msgs::ICPAlign::Request& req,
00094 jsk_recognition_msgs::ICPAlign::Response& res);
00095 virtual void referenceCallback(
00096 const sensor_msgs::PointCloud2::ConstPtr& msg);
00097 virtual void referenceArrayCallback(
00098 const jsk_recognition_msgs::PointsArray::ConstPtr& msg);
00099 virtual void referenceAddCallback(
00100 const sensor_msgs::PointCloud2::ConstPtr& msg);
00101 virtual void configCallback (Config &config, uint32_t level);
00102 virtual void publishDebugCloud(
00103 ros::Publisher& pub,
00104 const pcl::PointCloud<PointT>& cloud);
00105 virtual double alignPointcloud(
00106 pcl::PointCloud<PointT>::Ptr& cloud,
00107 pcl::PointCloud<PointT>::Ptr& reference,
00108 const Eigen::Affine3f& offset,
00109 pcl::PointCloud<PointT>::Ptr& output_cloud,
00110 Eigen::Affine3d& output_transform);
00111 virtual double alignPointcloudWithICP(
00112 pcl::PointCloud<PointT>::Ptr& cloud,
00113 pcl::PointCloud<PointT>::Ptr& reference,
00114 const Eigen::Affine3f& offset,
00115 pcl::PointCloud<PointT>::Ptr& output_cloud,
00116 Eigen::Affine3d& output_transform);
00117 virtual double alignPointcloudWithNDT(
00118 pcl::PointCloud<PointT>::Ptr& cloud,
00119 pcl::PointCloud<PointT>::Ptr& reference,
00120 const Eigen::Affine3f& offset,
00121 pcl::PointCloud<PointT>::Ptr& output_cloud,
00122 Eigen::Affine3d& output_transform);
00123 virtual jsk_recognition_msgs::ICPResult alignPointcloudWithReferences(
00124 pcl::PointCloud<PointT>::Ptr& cloud,
00125 const Eigen::Affine3f& offset,
00126 const std_msgs::Header& header);
00127 virtual double scorePointcloudAlignment(
00128 pcl::PointCloud<PointT>::Ptr& cloud,
00129 pcl::PointCloud<PointT>::Ptr& reference,
00130 const Eigen::Affine3f& offset,
00131 Eigen::Affine3f& offset_result,
00132 pcl::PointCloud<PointT>::Ptr transformed_cloud,
00133 Eigen::Affine3d& transform_result);
00134 virtual void cameraInfoCallback(
00135 const sensor_msgs::CameraInfo::ConstPtr& msg);
00136 virtual void subscribe();
00137 virtual void unsubscribe();
00138
00140
00142 ros::Subscriber sub_camera_info_;
00143 ros::Subscriber sub_;
00144 ros::Subscriber sub_reference_;
00145 ros::Subscriber sub_reference_add;
00146 ros::Subscriber sub_reference_array_;
00147 message_filters::Subscriber<sensor_msgs::PointCloud2> sub_sync_input_;
00148 message_filters::Subscriber<sensor_msgs::PointCloud2> sub_sync_reference_;
00149 ros::Publisher pub_result_pose_;
00150 ros::Publisher pub_result_cloud_;
00151 ros::Publisher pub_latest_time_;
00152 ros::Publisher pub_average_time_;
00153 ros::Publisher pub_debug_source_cloud_,
00154 pub_debug_target_cloud_,
00155 pub_debug_result_cloud_,
00156 pub_debug_flipped_cloud_;
00157 ros::Publisher pub_icp_result;
00158 jsk_recognition_utils::WallDurationTimer timer_;
00159 ros::ServiceServer srv_icp_align_with_box_;
00160 ros::ServiceServer srv_icp_align_;
00161 bool align_box_;
00162 boost::shared_ptr <dynamic_reconfigure::Server<Config> > srv_;
00163 boost::mutex mutex_;
00164 message_filters::Subscriber<sensor_msgs::PointCloud2> sub_input_;
00165 message_filters::Subscriber<jsk_recognition_msgs::BoundingBox> sub_box_;
00166 message_filters::Subscriber<geometry_msgs::PoseStamped> sub_offset_;
00167 boost::shared_ptr<message_filters::Synchronizer<SyncPolicy> >sync_;
00168 boost::shared_ptr<message_filters::Synchronizer<OffsetSyncPolicy> >sync_offset_;
00169 boost::shared_ptr<message_filters::Synchronizer<ReferenceSyncPolicy> > sync_reference_;
00170 tf::TransformListener* tf_listener_;
00171
00176 bool transform_3dof_;
00181 bool use_offset_pose_;
00182
00188 bool use_normal_;
00189
00191
00193 bool synchronize_reference_;
00194 bool use_flipped_initial_pose_;
00195 int algorithm_;
00196 int correspondence_algorithm_;
00197 std::vector<pcl::PointCloud<PointT>::Ptr> reference_cloud_list_;
00198 int max_iteration_;
00199 double correspondence_distance_;
00200 double transform_epsilon_;
00201 double euclidean_fittness_epsilon_;
00202 double ransac_iterations_;
00203 double ransac_outlier_threshold_;
00204 sensor_msgs::CameraInfo::ConstPtr camera_info_msg_;
00205
00207
00209 double rotation_epsilon_;
00210 int correspondence_randomness_;
00211 int maximum_optimizer_iterations_;
00212
00214
00216 double ndt_resolution_;
00217 double ndt_step_size_;
00218 double ndt_outlier_ratio_;
00219
00220 bool done_init_;
00221 private:
00222
00223 };
00224 }
00225
00226 #endif