8
Cluster::Cluster(Trajectory &traj, int parent)
10
m_nID = s_nIDGenerator++;
11
std::vector<double> xtmp;
12
traj.getPoses(m_xPoses,m_yPoses);
13
m_sigmaPoses.resize(m_xPoses.size(),s_defaultSigma);
14
ROS_INFO("Created cluster from vector length %d, cluster length %d",traj.size(),(int)m_xPoses.size());
17
Cluster::Cluster(Trajectory &traj)
19
m_nID = s_nIDGenerator++;
20
std::vector<double> xtmp;
21
traj.getPoses(m_xPoses,m_yPoses);
22
m_sigmaPoses.resize(m_xPoses.size(),s_defaultSigma);
23
ROS_INFO("Created cluster from vector length %d, cluster length %d",traj.size(),(int)m_xPoses.size());
26
bool Cluster::concatenate(Cluster &cluster)
28
m_xPoses.insert(m_xPoses.end(),cluster.m_xPoses.begin(), cluster.m_xPoses.end());
29
m_yPoses.insert(m_yPoses.end(),cluster.m_yPoses.begin(), cluster.m_yPoses.end());
30
m_sigmaPoses.insert(m_sigmaPoses.end(),cluster.m_sigmaPoses.begin(), cluster.m_sigmaPoses.end());
36
ROS_INFO("Cluster PRINT, cluster has %d elements", (int)m_xPoses.size());
37
for(unsigned int i=0; i<m_xPoses.size(); i++)
38
ROS_INFO("Pose %d, X pos %f, Y pose %f",i,m_xPoses[i],m_yPoses[i]);
41
double Cluster::windowDistance(double pX, double pY, int nInd, double delta)
43
int indL = std::floor((1-delta)*nInd);
44
int indH = std::ceil((1+delta)*nInd);
49
if(indH >= (int)m_xPoses.size())
50
indH = m_xPoses.size()-1;
55
Eigen::Map<Eigen::VectorXd> xs(&m_xPoses[indL],indH-indL);
56
Eigen::Map<Eigen::VectorXd> ys(&m_yPoses[indL],indH-indL);
57
Eigen::Map<Eigen::VectorXd> sigmas(&m_sigmaPoses[indL],indH-indL);
59
Eigen::ArrayXd tPointx(xs.size());
60
Eigen::ArrayXd tPointy(xs.size());
61
Eigen::ArrayXd diffx(xs.size());
62
Eigen::ArrayXd diffy(xs.size());
63
Eigen::ArrayXd dist(xs.size());
64
tPointx.setConstant(pX);
65
tPointy.setConstant(pY);
67
diffx = tPointx-xs.array();
68
diffy = tPointy-ys.array();
70
dist = diffx*diffx + diffy*diffy;
71
dist = dist.sqrt()/sigmas.array();
72
return dist.minCoeff();
75
double Cluster::clusterDistance(Trajectory &traj)
78
for(int i=0; i<traj.size(); i++)
80
int ind = findClosest(traj.getX(i),traj.getY(i));
81
theSum=theSum+windowDistance(traj.getX(i),traj.getY(i),ind,s_dfDelta);
83
return theSum/traj.size();
86
double Cluster::clusterDistance(Trajectory &traj, int ind_lim)
89
for(int i=0; i<ind_lim; i++)
91
int ind = findClosest(traj.getX(i),traj.getY(i));
92
theSum=theSum+windowDistance(traj.getX(i),traj.getY(i),ind,s_dfDelta);
94
return theSum/ind_lim;
98
double Cluster::ccDistance(Cluster &cluster)
101
for(int i=0; i<cluster.size(); i++)
103
int ind = findClosest(cluster.getX(i),cluster.getY(i));
104
theSum=theSum+windowDistance(cluster.getX(i),cluster.getY(i),ind,s_dfDelta);
106
return theSum/cluster.size();
110
int Cluster::findClosest(double pX, double pY)
112
Eigen::Map<Eigen::VectorXd> xs(&m_xPoses[0],m_xPoses.size());
113
Eigen::Map<Eigen::VectorXd> ys(&m_yPoses[0],m_yPoses.size());
114
Eigen::Map<Eigen::VectorXd> sigmas(&m_sigmaPoses[0],m_sigmaPoses.size());
115
Eigen::ArrayXd tPointx(xs.size());
116
Eigen::ArrayXd tPointy(xs.size());
118
Eigen::ArrayXd diffx(xs.size());
119
Eigen::ArrayXd diffy(xs.size());
120
Eigen::ArrayXd dist(xs.size());
122
tPointx.setConstant(pX);
123
tPointy.setConstant(pY);
125
diffx = tPointx-xs.array();
126
diffy = tPointy-ys.array();
128
dist = diffx*diffx + diffy*diffy;
129
dist = dist.sqrt()/sigmas.array();
131
dist.minCoeff(&coeff);
137
int Cluster::findClosest(double pX, double pY, double &retdist)
139
Eigen::Map<Eigen::VectorXd> xs(&m_xPoses[0],m_xPoses.size());
140
Eigen::Map<Eigen::VectorXd> ys(&m_yPoses[0],m_yPoses.size());
141
Eigen::Map<Eigen::VectorXd> sigmas(&m_sigmaPoses[0],m_sigmaPoses.size());
142
Eigen::ArrayXd tPointx(xs.size());
143
Eigen::ArrayXd tPointy(xs.size());
145
Eigen::ArrayXd diffx(xs.size());
146
Eigen::ArrayXd diffy(xs.size());
147
Eigen::ArrayXd dist(xs.size());
149
tPointx.setConstant(pX);
150
tPointy.setConstant(pY);
152
diffx = tPointx-xs.array();
153
diffy = tPointy-ys.array();
155
dist = diffx*diffx + diffy*diffy;
156
dist = dist.sqrt()/sigmas.array();
158
retdist=dist.minCoeff(&coeff);
163
bool Cluster::split(Trajectory &traj, Cluster &newCluster, bool hasChild)
168
for(traj_ind=traj.size()-1; traj_ind>0; --traj_ind)
170
ind = findClosest(traj.getX(traj_ind),traj.getY(traj_ind),dist);
171
ROS_INFO("At trajectory %d, closest on cluster is %d at distance %f", traj_ind, ind, dist);
172
if(dist < 2) // make this a parameter!!!
173
break; // found the closest within reasonable shot of the trajectory
177
if(ind < 1 || ind > m_xPoses.size()-1)
179
ROS_INFO("Can't split, closest point is at %d on cluster of length %d",ind,m_xPoses.size());
183
int iw = traj.findClosest(m_xPoses[ind],m_yPoses[ind]);
184
ROS_INFO("Splitting current trajectory at %d, it has length %d",iw,traj.size());
186
ROS_INFO("Now it has length %d",traj.size());
188
if(!hasChild) // only split off from stub if it hasn't already been done
190
newCluster.m_xPoses.resize(m_xPoses.size()-ind);
191
newCluster.m_yPoses.resize(m_xPoses.size()-ind);
192
newCluster.m_sigmaPoses.resize(m_xPoses.size()-ind);
193
copy(m_xPoses.begin()+ind, m_xPoses.end(),newCluster.m_xPoses.begin());
194
copy(m_yPoses.begin()+ind, m_yPoses.end(),newCluster.m_yPoses.begin());
195
copy(m_sigmaPoses.begin()+ind, m_sigmaPoses.end(),newCluster.m_sigmaPoses.begin());
196
if(newCluster.m_xPoses.size() > 1)
198
std::cout << "First part of split OK\n";
202
std::cout << "First part of split is JUNK!, has size " << newCluster.m_xPoses.size();
205
m_xPoses.erase(m_xPoses.begin()+ind,m_xPoses.end());
206
m_yPoses.erase(m_yPoses.begin()+ind,m_yPoses.end());
207
m_sigmaPoses.erase(m_sigmaPoses.begin()+ind,m_sigmaPoses.end());
209
if(m_xPoses.size() > 1)
211
std::cout << "Second part of split OK\n";
215
std::cout << "Second part of split is JUNK!, has size " << m_xPoses.size();
223
bool Cluster::update(double pX, double pY, int i)
225
m_xPoses[i]=(1-s_dfAlpha)*m_xPoses[i]+s_dfAlpha*pX;
226
m_yPoses[i]=(1-s_dfAlpha)*m_yPoses[i]+s_dfAlpha*pY;
227
double xdiff = pX-m_xPoses[i];
228
double ydiff = pY-m_yPoses[i];
229
m_sigmaPoses[i]=(1-s_dfAlpha)*m_sigmaPoses[i]+s_dfAlpha*(xdiff*xdiff+ydiff*ydiff);
233
bool Cluster::weightedAv(Cluster &c2)
235
for(int i=0; i < c2.size(); i++)
237
int ind = findClosest(c2.getX(i),c2.getY(i));
238
double sigma_sq_1 = m_sigmaPoses[ind]*m_sigmaPoses[ind];
239
double sigma_sq_2 = c2.getSigma(i)*c2.getSigma(i);
240
m_xPoses[ind] = (m_xPoses[ind]/sigma_sq_1+c2.getX(i)/sigma_sq_2)/(1.0/sigma_sq_1 + 1.0/sigma_sq_2);
241
m_yPoses[ind] = m_yPoses[ind]/sigma_sq_1+c2.getY(i)/sigma_sq_2/(1.0/sigma_sq_1 + 1.0/sigma_sq_2);
242
m_sigmaPoses[ind] = 1.0/(1.0/sigma_sq_1+1.0/sigma_sq_2);
247
double Cluster::startDist(double pX, double pY)
249
double xdiff = pX-m_xPoses[0];
250
double ydiff = pY-m_yPoses[0];
251
return std::sqrt(xdiff*xdiff+ydiff*ydiff);
254
std::ostream& operator<<(std::ostream& output, Cluster& c)