1 changed files with 120 additions and 0 deletions
@ -0,0 +1,120 @@ |
|||
#include <ros/ros.h> |
|||
#include <pcl_ros/point_cloud.h> |
|||
#include <pcl/point_types.h> |
|||
//#include <pcl/features/normal_3d_omp.h>
|
|||
#include <hand_control/Plan.h> |
|||
#include <time.h> |
|||
#include <math.h> |
|||
|
|||
#include <pcl/common/pca.h> |
|||
|
|||
typedef pcl::PointXYZRGB Point; |
|||
typedef pcl::PointCloud<Point> PointCloud; |
|||
|
|||
class Callback { |
|||
public: |
|||
void |
|||
operator()(const PointCloud::ConstPtr& msg) |
|||
{ |
|||
ROS_INFO("PointCloud received"); |
|||
|
|||
float x, y, z, th, h, c; |
|||
x = y = z = th = h = c = 0.; |
|||
|
|||
// indices : tout le PointCloud
|
|||
std::vector<int> indices; |
|||
for (int i = 0; i < msg->points.size(); ++i) |
|||
indices.push_back(i); |
|||
|
|||
// vérifier signature
|
|||
//estimator.computePointNormal(*msg, indices, x, y, z, c);
|
|||
//Produit vectoriel des deux première colonnes de Matrix3f
|
|||
x = Matrix3f.getElement(2,1)*Matrix3f.getElement(3,2) |
|||
- Matrix3f.getElement(3,1)*Matrix3f.getElement(2,2); |
|||
y = Matrix3f.getElement(3,1)*Matrix3f.getElement(1,2) |
|||
- Matrix3f.getElement(1,1)*Matrix3f.getElement(3,2); |
|||
z = Matrix3f.getElement(1,1)*Matrix3f.getElement(2,2) |
|||
- Matrix3f.getElement(2,1)*Matrix3f.getElement(1,2); |
|||
x = x/sqrt(x*x+y*y+z*z); |
|||
y = x/sqrt(x*x+y*y+z*z); |
|||
z = x/sqrt(x*x+y*y+z*z); |
|||
|
|||
h = pcl::PCA::getMean(msg).z; |
|||
|
|||
//h = altitude(msg);
|
|||
th = -90 |
|||
+ 2 * atan (Matrix3f.getElement(2,1) |
|||
/(1 + Matrix3f.getElement(1,1))); |
|||
|
|||
// publication
|
|||
ROS_INFO("Plan published"); |
|||
publisher.publish(to_Plan(x, y, z, h, th, c, msg->header.seq, msg->header.stamp, msg->width)); |
|||
} |
|||
|
|||
Callback(ros::Publisher& pub) : |
|||
publisher(pub) {} |
|||
|
|||
private: |
|||
ros::Publisher publisher; |
|||
//pcl::NormalEstimationOMP<Point, pcl::Normal> estimator;
|
|||
Eigen::Matrix3f& pcl::PCA<Point, pcl::Normal>::getEigenVectors eigenVectors; |
|||
|
|||
inline |
|||
const hand_control::Plan::ConstPtr |
|||
to_Plan(const float& x, const float& y, |
|||
const float& z, const float& h, |
|||
const float& th, |
|||
const float& c, const uint32_t& seq, |
|||
const uint64_t& msec64, const uint64_t& number) |
|||
{ |
|||
hand_control::Plan::Ptr ros_msg(new hand_control::Plan()); |
|||
ros_msg->normal.x = x; |
|||
ros_msg->normal.y = y; |
|||
ros_msg->normal.z = z; |
|||
ros_msg->altitude = h; |
|||
ros_msg->angle = th; |
|||
ros_msg->curvature = c; |
|||
ros_msg->number = number; |
|||
// uint64_t msec64 is in ms (10-6)
|
|||
uint64_t sec64 = msec64 / 1000000; |
|||
uint64_t nsec64 = (msec64 % 1000000) * 1000; |
|||
ros_msg->header.stamp.sec = (uint32_t) sec64; |
|||
ros_msg->header.stamp.nsec = (uint32_t) nsec64; |
|||
ros_msg->header.seq = seq; |
|||
ros_msg->header.frame_id = "0"; |
|||
return ros_msg; |
|||
} |
|||
|
|||
/* inline
|
|||
float |
|||
altitude(const PointCloud::ConstPtr& pcl) |
|||
{ |
|||
int s = pcl->points.size(); |
|||
float h(0); |
|||
for (int i = 0; i < s; ++i) |
|||
h += pcl->points[i].z; |
|||
return h/( (float) s ); |
|||
|
|||
|
|||
getmean |
|||
getVector4fMap |
|||
}*/ |
|||
}; |
|||
|
|||
int |
|||
main(int argc, char** argv) |
|||
{ |
|||
ros::init(argc, argv, "normal_estimator_pca"); |
|||
ros::NodeHandle node("estimator");//`A vérifier ?
|
|||
|
|||
// initialisation
|
|||
ros::Publisher publisher = node.advertise<hand_control::Plan>("output", 1); |
|||
Callback callback(publisher); |
|||
ros::Subscriber subscriber = node.subscribe<PointCloud>("input", 1, callback); |
|||
|
|||
// démarrage
|
|||
ROS_INFO("node started"); |
|||
ros::spin(); |
|||
ROS_INFO("exit"); |
|||
return 0; |
|||
} |
|||
Loading…
Reference in new issue