欢迎来到皮皮网网首页

【源码商城开发】【牧童源码】【fido 源码】c map 源码

来源:汉王纷争 unity 源码 时间:2024-11-24 16:00:12

1.Navigation包 Global_planner全局路径规划源码详细解析
2.Matplotlib-plt.scatter( )绘制散点图
3.为何要学习MFC?

c  map 源码

Navigation包 Global_planner全局路径规划源码详细解析

       学习总结,源码如有错误欢迎指正!源码

一丶plan_node.cpp

       从程序入口开始,源码首先在plan_node.cpp的源码源码商城开发main函数中,初始化了全局路径规划器。源码

costmap_2d::Costmap2DROS?源码lcr("costmap",?buffer);global_planner::PlannerWithCostmap?pppp("planner",?&lcr);

       在函数PlannerWithCostmap中设置了两种调用makePlan的路径:

PlannerWithCostmap::PlannerWithCostmap(string?name,?Costmap2DROS*?cmap)?:GlobalPlanner(name,?cmap->getCostmap(),?cmap->getGlobalFrameID())?{ ros::NodeHandle?private_nh("~");cmap_?=?cmap;make_plan_service_?=?private_nh.advertiseService("make_plan",?&PlannerWithCostmap::makePlanService,?this);pose_sub_?=?private_nh.subscribe<rm::PoseStamped>("goal",?1,?&PlannerWithCostmap::poseCallback,?this);}

       1.通过make_plan服务

req.start.header.frame_id?=?"map";req.goal.header.frame_id?=?"map";bool?success?=?makePlan(req.start,?req.goal,?path);

       2.通过goal回调函数

//得到当前机器人在MAP中的位置cmap_->getRobotPose(global_pose);makePlan(global_pose,?*goal,?path);

       在getRobotPose函数中,通过tf_.transform(robot_pose,源码 global_pose, global_frame_);函数,默认将机器人pose从base_link转换到map坐标系下,源码可通过参数设置。源码得到起始点和目标点传入到makePlan中。源码

二丶 planner_core.cpp//register?源码牧童源码this?planner?as?a?BaseGlobalPlanner?pluginPLUGINLIB_EXPORT_CLASS(global_planner::GlobalPlanner,?nav_core::BaseGlobalPlanner)

       global_planner 是基类nav_core :: BaseGlobalPlanner的一个插件子类

       首先在构造函数中需要初始化GlobalPlanner,在initialize中对一些参数进行赋值。源码

GlobalPlanner::GlobalPlanner(std::string?源码name,?costmap_2d::Costmap2D*?costmap,?std::string?frame_id)?:GlobalPlanner()?{ //initialize?the?plannerinitialize(name,?costmap,?frame_id);}

       当调用makePlan时,首先就是源码判断是否已经被初始化:

//?code?line?~makePlan()if?(!initialized_)?{ ROS_ERROR("This?planner?has?not?been?initialized?yet,?but?it?is?being?used,?please?call?initialize()?before?use");return?false;}m

       初始化完成之后,清除之前规划的源码Plan,以防万一。fido 源码然后检查起点和终点是否在我们所需要的坐标系下,一般在map系下。

//clear?the?plan,?just?in?case?,?code?line?makePlan()plan.clear();if?(goal.header.frame_id?!=?global_frame)?{ ...}if?(start.header.frame_id?!=?global_frame){ ...}

       将世界坐标系的点(map 坐标系)转换成图像坐标系(图像左下角)下的点(以像素表示)

if?(!costmap_->worldToMap(wx,?wy,?goal_x_i,?goal_y_i))?{ ?ROS_WARN_THROTTLE(1.0,"The?goal?sent?to?the?global?planner?is?off?the?global?costmap.?Planning?will?always?fail?to?this?goal.");?return?false;}

       在Costmap2D和GlobalPlanner中都有实现worldToMap,其实都是filems源码一样的,在GlobalPlanner中则需要通过调用Costmap2D来获取局部地图的起始点和分辨率,而在Costmap2D则可以直接使用全局变量。

bool?Costmap2D::worldToMap(double?wx,?double?wy,?unsigned?int&?mx,?unsigned?int&?my)?const{ if?(wx?<?origin_x_?||?wy?<?origin_y_)return?false;mx?=?(int)((wx?-?origin_x_)?/?resolution_);my?=?(int)((wy?-?origin_y_)?/?resolution_);if?(mx?<?size_x_?&&?my?<?size_y_)return?true;return?false;}

       old_navfnbehavior ?作为一种旧式规划行为:

       The start of the path does not match the actual start location.

       The very end of the path moves along grid lines.

       All of the coordinates are slightly shifted by half a grid cell

       现在在worldToMap所使用的convert_offset_ = 0

       接下来将机器人Robot所在的位置,在costmap中设置成free,当前位置不可能是dmlc源码一个障碍物。 即在clearRobotCell()函数中:mx,my即当前机器人位置。

PlannerWithCostmap::PlannerWithCostmap(string?name,?Costmap2DROS*?cmap)?:GlobalPlanner(name,?cmap->getCostmap(),?cmap->getGlobalFrameID())?{ ros::NodeHandle?private_nh("~");cmap_?=?cmap;make_plan_service_?=?private_nh.advertiseService("make_plan",?&PlannerWithCostmap::makePlanService,?this);pose_sub_?=?private_nh.subscribe<rm::PoseStamped>("goal",?1,?&PlannerWithCostmap::poseCallback,?this);}0

       设置规划地图边框:outlineMap,此函数由参数outline_map_决定。 根据costmap跟起始终止点计算网格的potential,计算的算法有两种:Dijkstra和A*,具体算法便不再讨论,资料很多。 当提取到plan之后,调用getPlanFromPotential,把path转换变成geometry_msgs::PoseStamped数据类型。

PlannerWithCostmap::PlannerWithCostmap(string?name,?Costmap2DROS*?cmap)?:GlobalPlanner(name,?cmap->getCostmap(),?cmap->getGlobalFrameID())?{ ros::NodeHandle?private_nh("~");cmap_?=?cmap;make_plan_service_?=?private_nh.advertiseService("make_plan",?&PlannerWithCostmap::makePlanService,?this);pose_sub_?=?private_nh.subscribe<rm::PoseStamped>("goal",?1,?&PlannerWithCostmap::poseCallback,?this);}1

       此时便得到所需要的路径plan,最终调用OrientationFilter平滑之后发布出去。

PlannerWithCostmap::PlannerWithCostmap(string?name,?Costmap2DROS*?cmap)?:GlobalPlanner(name,?cmap->getCostmap(),?cmap->getGlobalFrameID())?{ ros::NodeHandle?private_nh("~");cmap_?=?cmap;make_plan_service_?=?private_nh.advertiseService("make_plan",?&PlannerWithCostmap::makePlanService,?this);pose_sub_?=?private_nh.subscribe<rm::PoseStamped>("goal",?1,?&PlannerWithCostmap::poseCallback,?this);}2

Matplotlib-plt.scatter( )绘制散点图

       英文源码详解

       参考链接颜色

       参考函数使用链接

       1)基本参数讲解

       其中使用plt.colorbar显示颜色的数值映射

       参数详解:

       使用参数c为不同的点赋予不同的颜色值,我们将与数据长度一致的颜色列表传入c中。

       参数cmap

       我们还要问这种渐变颜色选择色系,即cmap参数

       ‘Perceptually Uniform Sequential’

       ‘Sequential’

       ‘Sequential2’

       Diverging

       Qualitative

       Miscellaneous

为何要学习MFC?

       è¿˜æœ‰ä¸€ä¸ªé¢†åŸŸæˆ‘们不能忽略,那就是个人软件、小型软件。在猪八戒之类的威客网上软件开发的栏目搜一搜,可以发现大部分的windows程序开发的需求,威客们都是用MFC或Dephi来开发,当然,还有一些易语言。如果你要开发一款个人用的小软件,MFC是很好的选择。

       å¯¹äºŽè¿™ç§ä¸ªäººè½¯ä»¶ã€å°åž‹è½¯ä»¶ï¼ŒMFC还是有着很多优势的:

       1.体积小,静态编译后体积也不大。

       2.在各版本的windows上兼容性较好。

       3.对windowsAPI的调用较方便。

       å­¦ä¹ MFC不仅仅要学习用MFC,还要学习MFC的框架设计思想。

       å¦‚果仅仅会用MFC的话,可能在找工作的时候,一旦工作内容离开了MFC,就什么也不会了。MFC作为一个诞生了年的成熟的框架,其设计思想是很值得我们学习的。粗略读一读MFC源代码就会发现MFC的厉害之处,很多思想都让人很佩服,有时候看完一段源代码后,心里暗自感叹。无法想象MFC在那个连C++的STL都还没出现的年代,就用泛型编程技术写出了CList、CArray、CMap等容器。MFC不仅仅是将面向过程的API封装为面向对象的形式,他还在背后做了很多事情,包括简化一些过程,提高一些稳定性。如果让我把面向过程的windows

       socket API封装成面向对象的类,我肯定会这样想,嗯,socketAPI几乎每个函数的第一个参数都是SOCKET结构体,这是面向过程的特点,如果要封装为面向对象的类,自然是把这个结构体作为类的成员变量,然后封装socketAPI函数为类的方法,提供大量的默认参数,就OK。实际上并非这样,读一读MFC中CSocket的的源代码,就会发现实际上并非如此简单。MFC的CSocket类里,做了大量的工作,使我们用起来大大的方便了。如果你之前一直用socketAPI来开发网络程序,再来用MFC的CAsyncSocket和CSocket的话,会觉得,太方便了!仔细读一读MFC源码,真的对我们将来编写自己的类、设计自己的框架,有很大帮助!

       ä¸€ä¸ªå¥½çš„程序员,不能只是会用现成类库的方法。

       ä¸€ä¸ªå¥½çš„程序员,应该会封装、会设计类库、会设计框架。

       åœ¨ä¸€ä¸ªå®žé™…的项目中往往是这样的:我们需要开发一个windows平台上的软件,直接用windowsAPI吧,1.太麻烦2.面向过程的代码写的越多越头疼3.可重用性不强。使用现成类库吧,有时候无法满足我们特定的需求。这时候,我们就需要自己动手封装API,自己动手派生现成类库中的类,来添加方法。如果你不了解类库,派生下来后就会发现根本无从下手。很多公司在一些做了很久的项目上,往往都是有自己的类库、自己的框架,并不断的完善和扩展。这也是我们要学习类库、框架设计的原因。