上次看的是如何计算ig,今天看的是basic_viewer部分
ros_nodes中的basic_view_planner.cpp
入口是在ros_nodes下的basic_view_planner.cpp
里,这个文件实现了一个rosnode,还有一个简单用户交互
rosnode
rosnode里主要是获取了一些view_planner
的参数,包括Robot view 还有 world
还有utility_calculator
的参数,
以及对不同ig的计算方法以及权重,这些参数赋给了utility_calculator
而后面这个也赋给了view_planner
utility_calculator->useInformationGain(ig_names[i],ig_weights[i]);
view_planner.setUtility(utility_calculator);
然后对不同的目标进行估值
view_planner.setGoalEvaluationModule(termination_criteria);
用户交互
这个比较简单,就是从键盘里读取,对应了view_planner
的不同状态,比如开始运行
case 'g':
std::cout<<"Starting...";
view_planner.run();
code_base中的basic_view_planner.cpp
主要的过程在main
函数里:
main函数是主要的部分,内容主要是:
- 用getViewSpace函数获取视野viewspace_
- 然后用getGoodViewSpace函数把候选视野存放在view_candidate_ids
- 然后获取robot表面的数据,并且计算cost和ig,这两个都被utility封装好了
- getNbv函数通过cost和ig来算出最好的view的id,根据id得出nbv
- 然后会判断重建环节是否完成,没有完成的话则用**movet(nbv)**函数到达下一个视野
- 这一个procedure就结束了,开始下一个procedure
下面会看每个函数具体怎么实现的
getViewSpace
: 是在ig_active_reconstruction/views_communication_interface.hpp.cpp
里声明的,并且在这里是纯虚函数virtual const ViewSpace& getViewSpace()=0;
,class SimpleViewSpaceModule: public CommunicationInterface
是继承过来的,在views_simple_view_space_module.cpp
有getViewSpace
的具体实现,其实只有一个loadfromfile,是在view_space.cpp
实现的,文件的路径是在simple_viewspace_module.launch
里定义的,文件的第一个数字是Pose的数量,之后的每个pose包含七个量,分别是x y z 和四元数
getGoodViewSpace
传入的是id集合和是否忽略已经到过的点,如果点是可达的,并且非bad,如果要忽略已到达的点,那么到达的次数需要为0,这样的点就被选为候选点;retrieveData()
等待获取robot表面的数据getNbv
传入候选id集合以及viewspace,具体实现在weighted_linear_utility.cpp
里,这里比较重要的是computeViewIg
函数world_comm_unit_->computeViewIg(command,information_gains);
,这里是一个client,把command填入request后去call server,server在world_representation_ros_server_ci.inl
中,绑定的回调函数为igComputationService
,该函数判断interface是否初始化,最后进入的是linked_interface_->computeViewIg(command,result);
,该函数在octomap_basic_ray_ig_calculator.inl