1.ros小车怎么自动规划路径
2.Navigation包 Global_planner全局路径规划源码详细解析
ros小车怎么自动规划路径
在ROS中,可以使用导航堆栈(NavigationStack)来实现自动规划路径。
ROS(机器人操作系统)中的小车可以通过使用导航堆栈来实现自动路径规划。导航堆栈包括多个模块,其中最重要的是全局路径规划和局部路径规划。全局路径规划使用地图和目标位置来计算整个行驶路径。一笔画游戏源码它使用算法(如A*、Dijkstra等)来搜索最优路径,并生成一系列离散的路径点。局部路径规划负责在当前位置附近生成平滑的轨迹,以避免障碍物并实现精确的导航。它使用传感器数据(如激光雷达)来检测障碍物,并使用算法(如动态窗口法、java mvc源码速度障碍法等)生成可行的局部路径。过将全局路径规划和局部路径规划结合起来,ROS小车可以自动规划路径。它可以根据传感器数据实时更新路径,并使用控制算法(如PID控制)来跟踪路径并实现自主导航。
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,todolist 源码下载 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?leptonica源码下载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来获取局部地图的起始点和分辨率,而在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);}22024-12-29 16:162416人浏览
2024-12-29 16:112113人浏览
2024-12-29 15:541286人浏览
2024-12-29 15:521366人浏览
2024-12-29 15:311764人浏览
2024-12-29 15:022208人浏览
「鞍馬王子」李智凱今20)天在體操世界盃卡達杜哈站暨奧運資格賽,以高分15.400分摘銀,確定無法提前搶下巴黎奧運資格,可能就要面臨退休,許多粉絲與支持者替他抱屈,他晚間在臉書貼出與獎牌的合照,表示稱
1.什么电子书阅读器好?2.EPUB格式的电子书,用哪个阅读器啊,麻烦发到邮箱 谢谢3.EPUB格式的电子书,用哪个阅读器啊,麻烦发到邮箱谢谢4.掌阅支持哪些格式的电子书?什么电子书阅读器好? 在
1.有赞是做什么的2.开发一个网站商城需要多少钱?有赞是做什么的 1、有赞是一家商家服务公司有赞,是一个商家服务公司年月日在杭州贝塔咖啡馆孵化成立帮助每一位重视产品和服务的商家私有化顾客资产拓展互