00001
00002
00003
00004
00005
00006
00007
00008 #ifndef AXESARRAY_H_
00009 #define AXESARRAY_H_
00010
00011 #define AX_DIST 0.1
00012
00013 #include <ros/ros.h>
00014 #include <visualization_msgs/Marker.h>
00015 #include <visualization_msgs/MarkerArray.h>
00016 #include <geometry_msgs/Point.h>
00017
00018 #include <TooN/TooN.h>
00019 #include <TooN/so3.h>
00020
00021 class AxesArray
00022 {
00023 private:
00024 visualization_msgs::MarkerArray cubes;
00025 unsigned int ID;
00026 TooN::Matrix<3,3> quaternion2matrix(const double q[4]);
00027
00028
00029 geometry_msgs::Point p;
00030 geometry_msgs::Point buffp;
00031 TooN::SO3<double> rot;
00032 TooN::Vector<3,double> center;
00033 TooN::Vector<3,double> buffvec;
00034 visualization_msgs::Marker buffcube;
00035 static const float red[4];
00036 static const float green[4];
00037 static const float blue[4];
00038 static const double dirx[3];
00039 static const double diry[3];
00040 static const double dirz[3];
00041
00042
00043 public:
00044 AxesArray(){ID=0;};
00045 void init(double lifetime);
00046 bool addAxes(const double pos[3], const double att[4],unsigned int id);
00047 void clearAxes() {cubes.markers.clear();};
00048 visualization_msgs::MarkerArray getAxes(){return cubes;};
00049 TooN::Vector<3> getCenter(const double pos[3], const double att[4]);
00050 };
00051
00052 const float AxesArray::red[4]={1,0,0,1};
00053 const float AxesArray::green[4]={0,1,0,1};
00054 const float AxesArray::blue[4]={0,0,1,1};
00055 const double AxesArray::dirx[3]={AX_DIST,0.01,0.01};
00056 const double AxesArray::diry[3]={0.01,AX_DIST,0.01};
00057 const double AxesArray::dirz[3]={0.01,0.01,AX_DIST};
00058
00059 void AxesArray::init(double lifetime)
00060 {
00061 clearAxes();
00062 buffcube.lifetime=ros::Duration(lifetime);
00063 buffcube.header.frame_id = "/world";
00064 buffcube.header.stamp = ros::Time::now();
00065 buffcube.ns = "pointcloud_publisher";
00066 buffcube.action = visualization_msgs::Marker::ADD;
00067 buffcube.type = visualization_msgs::Marker::CUBE;
00068 memcpy(&(buffcube.scale.x),dirx,sizeof(double)*3);
00069 memcpy(&(buffcube.color.r),red,sizeof(float)*4);
00070 }
00071
00072 TooN::Vector<3> AxesArray::getCenter(const double pos[3], const double att[4])
00073 {
00074 rot = quaternion2matrix(att);
00075
00076 return -(rot.inverse()*TooN::makeVector(pos[0],pos[1],pos[2]));
00077 }
00078
00079 bool AxesArray::addAxes(const double pos[3], const double att[4], unsigned int id)
00080 {
00081 center = getCenter(pos, att);
00082
00083
00084 buffcube.pose.orientation.w=att[0];
00085 buffcube.pose.orientation.x=-att[1];
00086 buffcube.pose.orientation.y=-att[2];
00087 buffcube.pose.orientation.z=-att[3];
00088
00089
00090
00091 buffcube.id = 10*id;
00092 buffvec=center+rot.inverse()*TooN::makeVector(AX_DIST/2,0.0,0.0);
00093 memcpy(&(buffcube.pose.position.x),&(buffvec[0]),sizeof(double)*3);
00094 memcpy(&(buffcube.scale.x),dirx,sizeof(double)*3);
00095 memcpy(&(buffcube.color.r),red,sizeof(float)*4);
00096 cubes.markers.push_back(buffcube);
00097
00098
00099 buffcube.id = 10*id+1;
00100 buffvec=center+rot.inverse()*TooN::makeVector(0.0, AX_DIST/2,0.0);
00101 memcpy(&(buffcube.pose.position.x),&(buffvec[0]),sizeof(double)*3);
00102 memcpy(&(buffcube.scale.x),diry,sizeof(double)*3);
00103 memcpy(&(buffcube.color.r),green,sizeof(float)*4);
00104 cubes.markers.push_back(buffcube);
00105
00106
00107 buffcube.id = 10*id+2;
00108 buffvec=center+rot.inverse()*TooN::makeVector(0.0,0.0,AX_DIST/2);
00109 memcpy(&(buffcube.pose.position.x),&(buffvec[0]),sizeof(double)*3);
00110 memcpy(&(buffcube.scale.x),dirz,sizeof(double)*3);
00111 memcpy(&(buffcube.color.r),blue,sizeof(float)*4);
00112 cubes.markers.push_back(buffcube);
00113
00114 return true;
00115 }
00116
00117 TooN::Matrix<3,3> AxesArray::quaternion2matrix(const double q[4])
00118 {
00119
00120
00121 TooN::Matrix<3, 3, double> res;
00122
00123 const double tx = 2 * q[1];
00124 const double ty = 2 * q[2];
00125 const double tz = 2 * q[3];
00126 const double twx = tx * q[0];
00127 const double twy = ty * q[0];
00128 const double twz = tz * q[0];
00129 const double txx = tx * q[1];
00130 const double txy = ty * q[1];
00131 const double txz = tz * q[1];
00132 const double tyy = ty * q[2];
00133 const double tyz = tz * q[2];
00134 const double tzz = tz * q[3];
00135
00136 res(0, 0) = 1 - (tyy + tzz);
00137 res(0, 1) = txy - twz;
00138 res(0, 2) = txz + twy;
00139 res(1, 0) = txy + twz;
00140 res(1, 1) = 1 - (txx + tzz);
00141 res(1, 2) = tyz - twx;
00142 res(2, 0) = txz - twy;
00143 res(2, 1) = tyz + twx;
00144 res(2, 2) = 1 - (txx + tyy);
00145
00146 return res;
00147 }
00148
00149
00150 #endif /// AXESARRAY_H_