今天还是主要看ig_active_reconstruction
昨天看了几个通讯接口的文件,今天看其他的
rpg_ig_active源码阅读六
utility_calculator.cpp
namespace ig_active_reconstruction 下有一个基类 UtilityCalculator
只有一个纯虚函数
是根据传入的完整的viewspace和可以考虑的views集合 返回最佳view的id
virtual views::View::IdType getNbv( views::ViewSpace::IdSet& id_set, boost::shared_ptr<views::ViewSpace> viewspace )=0;
weighted_linear_utility.hpp
namespace ig_active_reconstruction 继承了上面的基类 UtilityCalculator 有一个子类WeightedLinearUtility
成员变量
// 两个通讯接口 分别是环境和机器人的通讯接口
boost::shared_ptr<world_representation::CommunicationInterface> world_comm_unit_; //! Interface to world representation.
boost::shared_ptr<robot::CommunicationInterface> robot_comm_unit_; //! Interface to robot.
//ig计算的检索配置
world_representation::CommunicationInterface::IgRetrievalConfig ig_retrieval_config_; //! Will be used for ig retrieval.
// 要用的ig的name和对应的weight
std::vector< std::string > information_gains_; //! Name of the information gains to use.
std::vector<double> ig_weights_; //! Weight of the information gains.
double cost_weight_;
getNbv
这是继承基类的那个函数,应该也是最重要的
virtual views::View::IdType getNbv( views::ViewSpace::IdSet& id_set, boost::shared_ptr<views::ViewSpace> viewspace );
具体实现看文件吧,有单线程和多线程两种
单线程
用到的是world_comm_unit_->computeViewIg(command,information_gains);
这个函数,这个函数在word_comm_unit里只有一个纯虚函数,需要去子类里面看
多线程
根据线程数(设定的是8
把views分成几个batch
对每个线程调用WeightedLinearUtility::getIg
这个函数,下面看
getIg
是对每个batch
void getIg(std::vector<double>& ig_vector, double& total_ig, world_representation::CommunicationInterface::IgRetrievalCommand command, views::ViewSpace::IdSet& id_set, boost::shared_ptr<views::ViewSpace> viewspace, unsigned int base_index, unsigned int batch_size );
这个是为多线程服务的
CommUnit
- setRobotCommUnit
- setWorldCommUnit
这两个函数设定通讯接口
useInformationGain
void WeightedLinearUtility::useInformationGain( std::string name, double weight)
{
information_gains_.push_back(name);
ig_weights_.push_back(weight);
}
是添加一个名称为name
的ig,权重默认为1.0
world_representation_raycaster.hpp
namespace ig_active_reconstruction 下的namespace world_representation
里的一个基类RayCaster
成员变量里有一个类Ray 主要是起点和方向
typedef Eigen::Vector3d RayOrigin;
typedef Eigen::Vector3d RayDirection;
/*! Defines a ray.
*/
struct Ray
{
RayOrigin origin;
RayDirection direction;
};
还有几个纯虚函数
- getRaySet
- getRayDirectionSet
- getRelRayDirectionSet
world_representation_pinhole_cam_raycaster.cpp
namespace ig_active_reconstruction 下的namespace world_representation 继承了基类RayCaster,子类是PinholeCamRayCaster
成员变量
有两个struct
- ResolutionSettings
- Config
还有关于分辨率的一些变量
函数
之后用到再细看吧
- RayDirection projectPixelTo3dRay( unsigned int x_px, unsigned int y_px );
把2D图像坐标投影到3D的射线方向 - virtual boost::shared_ptr getRaySet( movements::Pose& sensor_pose );
基于当前传感器pose返回一系列射线 - virtual boost::shared_ptr getRayDirectionSet( movements::Pose& sensor_pose );
- virtual boost::shared_ptr getRelRayDirectionSet() const;
- void computeRelRayDirections();