1.Navigation包 Global_planner全局路径规划源码详细解析
2.为ä½è¦å¦ä¹ MFCï¼
3.Matplotlib-plt.scatter( )绘制散点图
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,以防万一。stl linux源码然后检查起点和终点是否在我们所需要的坐标系下,一般在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,其实都是链接html源码一样的,在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,当前位置不可能是redis源码走读一个障碍物。 即在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为ä½è¦å¦ä¹ 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ï¼èªå·±å¨ææ´¾çç°æç±»åºä¸çç±»ï¼æ¥æ·»å æ¹æ³ãå¦æä½ ä¸äºè§£ç±»åºï¼æ´¾çä¸æ¥åå°±ä¼åç°æ ¹æ¬æ ä»ä¸æãå¾å¤å ¬å¸å¨ä¸äºåäºå¾ä¹ ç项ç®ä¸ï¼å¾å¾é½æ¯æèªå·±çç±»åºãèªå·±çæ¡æ¶ï¼å¹¶ä¸æçå®ååæ©å±ãè¿ä¹æ¯æ们è¦å¦ä¹ ç±»åºãæ¡æ¶è®¾è®¡çåå ã
Matplotlib-plt.scatter( )绘制散点图
英文源码详解
参考链接颜色
参考函数使用链接
1)基本参数讲解
其中使用plt.colorbar显示颜色的数值映射
参数详解:
使用参数c为不同的点赋予不同的颜色值,我们将与数据长度一致的颜色列表传入c中。
参数cmap
我们还要问这种渐变颜色选择色系,即cmap参数
‘Perceptually Uniform Sequential’
‘Sequential’
‘Sequential2’
Diverging
Qualitative
Miscellaneous