1
votes

I am using PCL viewer (which uses VTK) for visualizing a 3D point cloud generated by SLAM algorithm. I am trying to render the view of point cloud as seen by the robot at a given pose (position and orientation). I am able to set the position and ViewUp vector of the camera, but I am unable to set the Focal point of the camera to the heading of the robot. Currently, I am using sliders to set the Focal Point, but I want to set it programmatically based on the heading.

I am trying understand the type (angle in rad / distance in m) and range of values VTKCamera Focal Point expects and how that's related to the heading.

Function where I am updating camera

void Widget::setcamView(){

    //transfrom position
     Eigen::Vector3d position = this->transformpose(Eigen::Vector3d(image_pose.at(pose_ittr).position[0], image_pose.at(pose_ittr).position[1], image_pose.at(pose_ittr).position[2]));

    posx = position(0);
    posy = position(1);
    posz = position(2);

    //transform the pose
    Eigen::Vector3d attitude = this->transformpose(Eigen::Vector3d(image_pose.at(pose_ittr).orientation[0],image_pose.at(pose_ittr).orientation[1],image_pose.at(pose_ittr).orientation[2]));

    roll = attitude(0);
    pitch = attitude(1);
    yaw = attitude(2);

    viewx = ui->viewxhSlider->value();// * std::pow(10,-3);
    viewy = ui->viewyhSlider->value();// * std::pow(10,-3);
    viewz = ui->viewzhSlider->value();// * std::pow(10,-3);

    // debug
    std::cout<<"Positon: "<<posx<<"\t"<<posy<<"\t"<<posz<<std::endl<<
                "View: "<<viewx<<"\t"<<viewy<<"\t"<<viewz<<std::endl<<
               "Orientation: "<<roll<<"\t"<<pitch<<"\t"<<yaw<<std::endl;

    point_cutoffy = ui->ptcutoffhSlider->value();

    if(yaw <=0)
        yaw = yaw * -1;

    viewer->setCameraPosition(posx,posy,posz+1,
                              viewz,viewy,viewz,
                              0, 0, 1, 0);
    viewer->setCameraFieldOfView(1);
    viewer->setCameraClipDistances(point_cutoffx,point_cutoffy,0);

    ui->qvtkWidget->update();
    count++;
}

Any help is greatly appreciated.

-Thanks

P.S

PCL Viewer Set Camera Implementation (uses VTK)

void pcl::visualization::PCLVisualizer::setCameraPosition (
    double pos_x, double pos_y, double pos_z,
    double view_x, double view_y, double view_z,
    double up_x, double up_y, double up_z,
    int viewport)
{
  rens_->InitTraversal ();
  vtkRenderer* renderer = NULL;
  int i = 0;
  while ((renderer = rens_->GetNextItem ()) != NULL)
  {
    // Modify all renderer's cameras
    if (viewport == 0 || viewport == i)
    {
      vtkSmartPointer<vtkCamera> cam = renderer->GetActiveCamera ();
      cam->SetPosition (pos_x, pos_y, pos_z);
      cam->SetFocalPoint (view_x, view_y, view_z);
      cam->SetViewUp (up_x, up_y, up_z);
      renderer->ResetCameraClippingRange ();
    }
    ++i;
  }
  win_->Render ();
}
1

1 Answers

0
votes

I'm working with very similar problem via opencv Viz, which also uses VTK. Relatively to your question, I think you can find an answer HERE