1.Navigation包 Global_planner全局路径规划源码详细解析
2.java中通过Elasticsearch实现全局检索功能的全局全局方法和步骤及源代码
3.Pycharm常用快捷键大全
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,以防万一。然后检查起点和终点是否在我们所需要的坐标系下,一般在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,其实都是一样的,在GlobalPlanner中则需要通过调用Costmap2D来获取局部地图的fasttext源码剖析起始点和分辨率,而在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,当前位置不可能是一个障碍物。 即在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);}2java中通过Elasticsearch实现全局检索功能的方法和步骤及源代码
Java中通过Elasticsearch实现全局检索功能的方法和步骤
Elasticsearch,作为基于Lucene的开源搜索引擎,提供了分布式、RESTful接口和无模式JSON文档支持,同花顺用户源码其特性包括自动发现、分布式、可扩展性和高可靠性等。下面,我们将详细介绍如何使用Java Client API在Java项目中实现全局检索功能。步骤1:添加依赖
首先,你需要在项目中添加Elasticsearch Java客户端的Maven依赖,找到对应版本号(例如:{ version})后,将以下代码添加到pom.xml文件中:步骤2:连接Elasticsearch
通过RestHighLevelClient连接Elasticsearch,如示例所示:步骤3:创建索引
在进行检索前,需创建索引,如下所示:步骤4:添加文档
创建索引后,向其中添加文档,例如:步骤5:执行全局检索
执行检索操作,查找符合条件的文档,如代码所示:步骤6:处理和展示结果
获取并处理搜索结果,将匹配的文档信息展示给用户:步骤7:关闭连接
检索操作结束后,别忘了关闭与Elasticsearch的连接: 通过以上步骤,你已经掌握了在Java中使用Elasticsearch进行全局检索的基本流程。Elasticsearch的强大功能远不止于此,包括排序、社群管家 源码分页和聚合等,可以满足更多复杂搜索需求。深入学习,你可以参考Elasticsearch官方文档。Pycharm常用快捷键大全
在编程世界中,PyCharm以其强大的功能和丰富的快捷键支持,让开发者能够高效地进行代码编写与调试。以下是一些PyCharm常用的快捷键,它们能够显著提升编程效率:
格式化代码:Ctrl + Alt + L。当代码出现**波浪号提示时,通过点击代码并按下此快捷键,PyCharm将自动对选中的代码进行格式化整理,使代码更加整洁美观。
合并多行代码:Crtl+Shift+J。全选多行代码后按下此键,这些代码将被合并为一行,同时PyCharm会自动填充相应的语法结构,确保代码的正确性。
修正报警告的代码:Ctrl + Enter。遇到代码警告时,通过点击警告并按下此键,c firebird 源码PyCharm会提供多种选项,包括格式化代码、忽略警告或自动修改代码,以解决代码问题。
快速包装代码:Crtl+Alt+T。选择需要包装的代码片段,按下此快捷键,PyCharm将弹出一个菜单供您选择包装条件,如添加if、while或try/except等,提高代码的可读性和维护性。
快速注释/取消注释:Crtl+/。选中代码后按下此键,可将其注释或取消注释。再次按下相同键则恢复原始状态。
缩进代码:Tab。向右缩进一个制表位,帮助保持代码的结构清晰;Shift + Tab则相反,用于向左缩进。
在上方插入新行:Ctrl + Alt + Enter。选中代码后,按下此键在选中的代码上方插入空行,便于添加新代码或注释。
在下方插入新行:Shift + Enter。与上方插入类似,但用于在代码下方添加新行。
上下移动选中代码/方法体:Alt + Shift + 上/下键。通过上下箭头键,可以快速调整选中代码或方法体的位置,例如将方法体从一个地方移动到另一个地方。
复制代码:Crtl + D。选中代码后按下此键,可以复制一行代码。选中多行代码时,复制效果相同,但需要手动添加换行符。
折叠/展开代码:Crtl + -折叠,Crtl + +展开。这些快捷键用于控制代码块的显示,提高代码阅读和维护的效率。
将代码抽取为一个方法:Crtl + Shift+M。选中代码后按下此键,可以将其转换为一个可重命名的方法。完成命名后,点击OK,代码将被封装为方法。
重命名文件:Shift+F6。选择文件名后按下此键,可以在输入框中输入新文件名,然后点击Refactor进行重命名。
查找类被引用的地方:Ctrl+N。输入类的关键字,即可查看被引用的类位置,点击对应条目跳转到文件。
查找/全局查找:Crtl+F / Ctrl + Shift+F。快速查找当前文件中的关键字,或在所有打开的文件中查找关键字。
替换/全局替换:Crtl+R / Ctrl + Shift+R。在当前文件或所有打开的文件中替换关键字。
快速跳转报错代码:F2。当代码出现错误时,按下此键可以直接跳转到错误位置。
定义书签:F。选中代码后按下此键,可以将其定义为书签。再次按下Shift+F,可以查看书签对应的代码。
代码小写转大写:Ctrl + Shift+U。选中代码后,按下此键可以将小写字母转为大写,反之亦然。
进入方法:Ctrl + B / Ctrl +鼠标左键。选中方法名,按下相应快捷键可以快速跳转到方法实现。
查看方法实现/源码:Ctrl + Shift + I。选中方法名后,按下此键可以查看其源码。
查看文档描述:Ctrl + Q。选中方法名后,按下此键可以查看方法的文档描述。
查看文件中方法/类:Ctrl + F。此快捷键可以显示文件中所有方法和类的列表。
查看最近编辑文件:Ctrl + E。快速浏览最近编辑的文件列表。
快捷运行代码:Shift + F。此快捷键用于直接运行当前文件中的代码。
快捷调试代码:Shift + F9。在调试模式下快速执行代码。
切换视图/目录:Crtl + Tab。在多个打开的窗口之间快速切换。
查看最近更改:Alt + Shift + C。查看最近的代码更改,便于跟踪和管理。
将光标移动到代码行尾:End。按下此键可以快速定位到当前行的行尾。
将光标移动到行首:Home。按下此键可以快速定位到当前行的行首。
全选一行并移至行尾:Shift + End。选中一行后,此操作将选中的内容移至行尾。
查看历史粘贴复制记录:Crtl + Shift+ V。浏览并恢复历史复制和粘贴操作。
移动光标到方法体或循环开始:Crtl + { 。此快捷键帮助定位到方法或循环的起始。
移动光标到方法体或循环结束:Crtl + }。定位到方法或循环的结束位置。
最大化编辑代码窗口:Crtl + Shift + F。隐藏其他打开的窗口,集中注意力于当前编辑。
快速添加代码:Crtl + J。快速插入常用代码块,如添加if __name__ == __main__。
这些快捷键在PyCharm中极大地提升了编程效率,帮助开发者更专注于代码逻辑而非繁琐的操作,使得编程体验更加流畅与高效。