pcl中MomentOfInertiaEstimation解析與實例-創(chuàng)新互聯(lián)

pcl中features模塊又基于慣性矩和偏心率的描述子,也可以求取點云的AABB和OBB包圍盒,在計算的過程中法線一些問題,特此記錄。
針對慣性矩和偏心率這兩個數(shù)據(jù)的應用場景還不明確,因此暫時不做討論,主要討論求取OBB時的代碼。

創(chuàng)新互聯(lián)建站主打移動網(wǎng)站、成都網(wǎng)站設計、成都網(wǎng)站建設、外貿(mào)網(wǎng)站建設、網(wǎng)站改版、網(wǎng)絡推廣、網(wǎng)站維護、域名申請、等互聯(lián)網(wǎng)信息服務,為各行業(yè)提供服務。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務,根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
templatevoid
pcl::MomentOfInertiaEstimation::computeOBB ()
{obb_min_point_.x = std::numeric_limits::max ();
  obb_min_point_.y = std::numeric_limits::max ();
  obb_min_point_.z = std::numeric_limits::max ();

  obb_max_point_.x = std::numeric_limits::min ();
  obb_max_point_.y = std::numeric_limits::min ();
  obb_max_point_.z = std::numeric_limits::min ();

  unsigned int number_of_points = static_cast(indices_->size ());
  for (unsigned int i_point = 0; i_point< number_of_points; i_point++)
  {float x = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * major_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * major_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * major_axis_ (2);
    float y = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * middle_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * middle_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * middle_axis_ (2);
    float z = (input_->points[(*indices_)[i_point]].x - mean_value_ (0)) * minor_axis_ (0) +
              (input_->points[(*indices_)[i_point]].y - mean_value_ (1)) * minor_axis_ (1) +
              (input_->points[(*indices_)[i_point]].z - mean_value_ (2)) * minor_axis_ (2);

    if (x<= obb_min_point_.x) obb_min_point_.x = x;
    if (y<= obb_min_point_.y) obb_min_point_.y = y;
    if (z<= obb_min_point_.z) obb_min_point_.z = z;

    if (x >= obb_max_point_.x) obb_max_point_.x = x;
    if (y >= obb_max_point_.y) obb_max_point_.y = y;
    if (z >= obb_max_point_.z) obb_max_point_.z = z;
  }

  obb_rotational_matrix_<< major_axis_ (0), middle_axis_ (0), minor_axis_ (0),
                            major_axis_ (1), middle_axis_ (1), minor_axis_ (1),
                            major_axis_ (2), middle_axis_ (2), minor_axis_ (2);

  Eigen::Vector3f shift (
    (obb_max_point_.x + obb_min_point_.x) / 2.0f,
    (obb_max_point_.y + obb_min_point_.y) / 2.0f,
    (obb_max_point_.z + obb_min_point_.z) / 2.0f);

  obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);

  obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;
}

如上所示,OBB求取的過程就是將點云轉(zhuǎn)換到以中心為坐標原點,PCA計算的三個特征向量為軸方向的局部坐標系中,然后求取相應的AABB包圍盒的過程,但是在文中最后一段

Eigen::Vector3f shift (
    (obb_max_point_.x + obb_min_point_.x) / 2.0f,
    (obb_max_point_.y + obb_min_point_.y) / 2.0f,
    (obb_max_point_.z + obb_min_point_.z) / 2.0f);

  obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);
  obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;

第一點:
shift是包圍盒的在局部坐標系中的中心坐標,
obb_rotational_matrix_ 是將局部坐標系轉(zhuǎn)為全局坐標的旋轉(zhuǎn)矩陣,平移矩陣就是中心點坐標。
obb_position_ 就是OBB包圍盒中心的全局坐標

注意:這里局部坐標系和全局坐標系的轉(zhuǎn)換關系要注意,對點云計算協(xié)方差陣,得到的特征向量矩陣是列向量組成的,obb_rotational_matrix_ 就是列向量組成的;
分析:
全局坐標->局部坐標
RP=Pt,此時的R是特征向量作為行向量組成的,這與得到的特征向量矩陣是轉(zhuǎn)置的關系
局部坐標->全局坐標
RtPt=P,此時Rt是R的逆,這才是正確的,但是由于R的轉(zhuǎn)置*R=單位陣,因此使用轉(zhuǎn)置取代求逆操作,也就是說,此時的Rt是特征向量作為列組成的。所以出現(xiàn)
obb_position_ = mean_value_ + obb_rotational_matrix_ * shift;
obb_position_ 就是OBB包圍盒中心的全局坐標。

第二點:

obb_min_point_.x -= shift (0);
  obb_min_point_.y -= shift (1);
  obb_min_point_.z -= shift (2);

  obb_max_point_.x -= shift (0);
  obb_max_point_.y -= shift (1);
  obb_max_point_.z -= shift (2);

obb_min_point_和obb_max_point_減去包圍盒中心點坐標是什么意思?
經(jīng)過測試發(fā)現(xiàn),減去中心點坐標之后,包圍盒的坐標是存在問題的
在這里插入圖片描述

如上圖所示,兩個黑色框中的點就是獲取的包圍盒的最小點和大點,這里明顯可以看出,這兩點和顯示的OBB包圍盒沒有關系,是有問題的。
因此繪制正確的OBB包圍盒時,采用的是給定包圍盒中心的坐標和包圍盒的寬度和長度的方法進行繪制。
歡迎留言。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享標題:pcl中MomentOfInertiaEstimation解析與實例-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://muchs.cn/article2/djehoc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、移動網(wǎng)站建設、品牌網(wǎng)站制作、營銷型網(wǎng)站建設、微信小程序、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化