|
@@ -41,7 +41,8 @@ namespace graft_cv {
|
|
|
m_1st_row_zmean_rs(-1.0),
|
|
|
m_1st_row_zmean_sc(-1.0),
|
|
|
m_cloud_mean_dist(0.0),
|
|
|
- m_stem_fork_ys_size(20)
|
|
|
+ m_stem_fork_ys_size(20),
|
|
|
+ m_stem_fork_pos_mu(0)
|
|
|
{
|
|
|
}
|
|
|
|
|
@@ -108,6 +109,7 @@ namespace graft_cv {
|
|
|
}
|
|
|
if (m_cparam.image_show) {
|
|
|
pcl::visualization::PCLVisualizer viewer(m_pcdId + std::string(": raw point cloud"));
|
|
|
+ viewer.setBackgroundColor(0.35, 0.35, 0.35);
|
|
|
viewer.addCoordinateSystem();
|
|
|
viewer.addPointCloud<pcl::PointXYZ>(m_raw_cloud, "raw_cloud");
|
|
|
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 1, "raw_cloud");
|
|
@@ -2465,60 +2467,78 @@ void CRootStockGrabPoint::line_filter(
|
|
|
max_pos_ref = max_pos;
|
|
|
}*/
|
|
|
|
|
|
-
|
|
|
- /*float max_power_th = m_cparam.rs_grab_fork_th;
|
|
|
- if (m_dtype == 0) { max_power_th = m_cparam.sc_grab_fork_th; }*/
|
|
|
+ //3 如果fork方法得到位置信息,进行更新,并记录历史
|
|
|
+ float max_power_th = m_cparam.rs_grab_fork_th;
|
|
|
+ float max_dist_to_mean_fork = m_cparam.rs_grab_to_meanfork_max_dist;
|
|
|
+ if (m_dtype == 0) {
|
|
|
+ max_power_th = m_cparam.sc_grab_fork_th;
|
|
|
+ max_dist_to_mean_fork = m_cparam.sc_grab_to_meanfork_max_dist;
|
|
|
+ }
|
|
|
|
|
|
if (max_idx_to_boundary >= 0) {
|
|
|
max_pos = int(in_line_cloud->points.at(max_idx_to_boundary).y + 0.5 - ymin);
|
|
|
max_pos_ref = max_pos;
|
|
|
+ //记录历史信息
|
|
|
+ if (2.0*max_dist_to_boundary > max_power_th * mu) {
|
|
|
+ m_stem_fork_ys.insert(m_stem_fork_ys.begin(), max_pos);
|
|
|
+ if (m_stem_fork_ys.size() > m_stem_fork_ys_size) { m_stem_fork_ys.pop_back(); }
|
|
|
+ m_stem_fork_pos_mu = int(get_hist_mean<int>(m_stem_fork_ys) + 0.5);
|
|
|
+
|
|
|
+ if (m_pLogger) {
|
|
|
+ stringstream buff;
|
|
|
+ float ratio = 0.0;
|
|
|
+ if (mu > 1.0e-3) { ratio = 2.0*max_dist_to_boundary / mu; }
|
|
|
+ buff << m_pcdId << ": update mean fork postiont is " << m_stem_fork_pos_mu<<
|
|
|
+ ", fork width = "<< 2.0*max_dist_to_boundary<<
|
|
|
+ ", stem mean widht = "<< mu<<
|
|
|
+ ", ratio is = "<< ratio;
|
|
|
+ m_pLogger->INFO(buff.str());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if(m_dtype == 0){
|
|
|
- /*if (max_power > max_power_th) {
|
|
|
+
|
|
|
+ //4 用历史均值进行约束,如果偏差大于max_dist_to_mean_fork mm,采用历史均值
|
|
|
+ bool out_of_range = false;
|
|
|
+ if (m_stem_fork_pos_mu > 0) {
|
|
|
+ if (fabs(max_pos - (float)m_stem_fork_pos_mu) > max_dist_to_mean_fork) {
|
|
|
+ out_of_range = true;
|
|
|
+ int original_max_pos = max_pos;
|
|
|
+ max_pos = m_stem_fork_pos_mu;
|
|
|
max_pos_ref = max_pos;
|
|
|
- max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
+ if (m_pLogger) {
|
|
|
+ stringstream buff;
|
|
|
+ buff << m_pcdId << ": warning,self fork postiont = " << original_max_pos <<
|
|
|
+ ", USE mean fork postiont " << m_stem_fork_pos_mu;
|
|
|
+ m_pLogger->INFO(buff.str());
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
- if (max_pos_mu > 0) {
|
|
|
- max_pos_ref = max_pos_mu;
|
|
|
- max_pos = max_pos_mu;
|
|
|
- }
|
|
|
- else {
|
|
|
- max_pos_ref = max_pos;
|
|
|
- max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
+ if (m_pLogger) {
|
|
|
+ stringstream buff;
|
|
|
+ buff << m_pcdId << ": self fork postiont = "<< max_pos<<
|
|
|
+ ", reference mean fork postiont = " << m_stem_fork_pos_mu;
|
|
|
+ m_pLogger->INFO(buff.str());
|
|
|
}
|
|
|
- } */
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //5 按指定量偏移
|
|
|
+ if(m_dtype == 0){
|
|
|
max_pos_ref = max_pos;
|
|
|
max_pos += static_cast<int>(m_cparam.sc_grab_offset);
|
|
|
}
|
|
|
else{
|
|
|
- /*if (max_power > max_power_th) {
|
|
|
- max_pos_ref = max_pos;
|
|
|
- max_pos += static_cast<int>(m_cparam.rs_grab_offset);
|
|
|
- }
|
|
|
- else {
|
|
|
- if (max_pos_mu > 0) {
|
|
|
- max_pos_ref = max_pos_mu;
|
|
|
- max_pos = max_pos_mu;
|
|
|
- }
|
|
|
- else {
|
|
|
- max_pos_ref = max_pos;
|
|
|
- max_pos += static_cast<int>(m_cparam.rs_grab_offset);
|
|
|
- }
|
|
|
- } */
|
|
|
max_pos_ref = max_pos;
|
|
|
max_pos += static_cast<int>(m_cparam.rs_grab_offset);
|
|
|
}
|
|
|
if (max_pos < 0) { max_pos = 0; }
|
|
|
if (max_pos >= online_points.size()) { max_pos = online_points.size() - 1; }
|
|
|
+ if (out_of_range) {
|
|
|
+ max_pos_ref = max_pos;
|
|
|
+ }
|
|
|
|
|
|
- ////用历史均值进行约束,如果偏差大于10mm,采用历史均值
|
|
|
- //if (abs(max_pos - max_pos_mu) > 10) {
|
|
|
- // max_pos = max_pos_mu;
|
|
|
- // max_pos_ref = max_pos;
|
|
|
- //}
|
|
|
-
|
|
|
+
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
//直线点云,获取指定区域的dx_line,dz_line
|
|
|
Eigen::Vector4f min_point;
|