当前位置: 首页 > news >正文

网站正在建设中html重庆网站建设与制作

网站正在建设中html,重庆网站建设与制作,官网建设银行,网站不到公安部备案的法律责任前文move_base介绍(4)简单介绍move_base的全局路径规划配置,接下来我们自己实现一个全局的路径规划 1. move_base规划配置 ROS1的move_base可以配置选取不同的global planner和local planner, 默认move_base.cpp#L70中可以看到是…

前文move_base介绍(4)简单介绍move_base的全局路径规划配置,接下来我们自己实现一个全局的路径规划

1. move_base规划配置

ROS1move_base可以配置选取不同的global plannerlocal planner, 默认move_base.cpp#L70中可以看到是读取该参数决定的`

    private_nh.param("base_global_planner", global_planner, std::string("navfn/NavfnROS"));private_nh.param("base_local_planner", local_planner, std::string("base_local_planner/TrajectoryPlannerROS"));

我们可以通过配置base_global_plannerbase_local_planner参数修改不同的算法

ros1 navigation中提供了3种base_global_planner, 分别是

  • navfn/NavfnROS
  • global_planner::GlobalPlanner
  • carrot_planner/CarrotPlanner

下面我们自己实现一个全局的路径规划,并在模拟器测试其执行效果

2. 实现原理

2.1 加载对象

private_nh.param("base_global_planner", global_planner, std::string("navfn/NavfnROS"));

上面我们已经知道 通过参数配置来决定加载哪一个全局规划器,继续跟踪可以看到

查看源码 move_base.cpp#L125 & move_base.h#L210

pluginlib::ClassLoader<nav_core::BaseGlobalPlanner> bgp_loader_;
planner_ = bgp_loader_.createInstance(global_planner);

pluginlib可以参见这里

  • pluginlib::ClassLoader<nav_core::BaseGlobalPlanner>::createInstance根据输入参数名,加载so,并且获取到库的导出类,且创建该类的一个实例
  • planner_即为该指向该实例的指针, 有了这个对象,就可以通过该成员干活了

2.2 BaseGlobalPlanner接口

planner_定义在move_base.h#L185

boost::shared_ptr<nav_core::BaseGlobalPlanner> planner_;

前面返回的planner_类型可以看到是nav_core::BaseGlobalPlanner类型,我们先来看下该类,在nav_core#L48

class BaseGlobalPlanner{public:virtual bool makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan) = 0;virtual bool makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan,double& cost){cost = 0;return makePlan(start, goal, plan);}virtual void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros) = 0;virtual ~BaseGlobalPlanner(){}protected:BaseGlobalPlanner(){}};

可以看到该类是一个接口类,需要继承该接口做相应的实现,主要接口比较简单,就两个, initializemakePlan, 顾名思义一个初始化,一个规划路径

  • initialize
    传入了name, 以及地图信息
  • makePlan
    传入起点,目标点,返回plan

我们也可以看看在move_base对应接口的调用

  • move_base.cpp#L126
    在创建完成立即调用完成初始化

  • move_base.cpp#L496
    进行全局路径规划

if(!planner_->makePlan(start, goal, plan) || plan.empty()){...}

``
在MoveBase::makeplan调用了该函数,返回的plan, 保存后用于local planner的输入

3. 实现global planner

3.1 实现步骤

实现一个自己的全局规划需要下面几个步骤

  • 继承nav_core::BaseGlobalPlanner实现接口
  • 导出该实现类
  • 添加plugin.xml插件描述文件并导出
  • 修改move_base配置使用

3.2 实现接口

  • 创建包
mkdir -p ~/pibot_ros/ros_ws/src
cd ~/pibot_ros/ros_ws/src
catkin_create_pkg sample_global_planner

创建完成添加一个cpp和h文件,新增一个类继承与nav_core::BaseGlobalPlanner
上面已经看到该接口定义 我们继承并对两个接口initializemakePlan实现即可

  • initialize
    初始化我们暂时先空实现
void GlobalPlanner::initialize(std::string name, costmap_2d::Costmap2DROS *costmap_ros)
{
}
  • makePlan
    规划路径的接口给我们输入起点和终点,我们输出规划出的plan(如可以规划,同时返回true,反之返回false), 我们暂时不考虑具体实现,输出一条从起点到终点的直线路径,这应该是初中几何知识,比较简单如下
bool GlobalPlanner::makePlan(const geometry_msgs::PoseStamped &start,const geometry_msgs::PoseStamped &goal, std::vector<geometry_msgs::PoseStamped> &plan)
{ROS_INFO("make plan start:[%f %f], goal:[%f %f]", start.pose.position.x, start.pose.position.y, goal.pose.position.x, goal.pose.position.y);plan.clear();float yaw = atan2(goal.pose.position.y - start.pose.position.y, goal.pose.position.x - start.pose.position.x);int n = 0;float goal_distance = sqrt(pow((start.pose.position.x - goal.pose.position.x), 2) + pow((start.pose.position.y - goal.pose.position.y), 2));float delta = 0.1; // 间隔delta输出start至end的直线上的点 我们间隔0.1取直线上的所有点,放到输出的参数plan里while (n * delta < goal_distance){geometry_msgs::PoseStamped pose = goal;pose.pose.position.x = (n * delta) * cos(yaw) + start.pose.position.x;pose.pose.position.y = (n * delta) * sin(yaw) + start.pose.position.y;++n;plan.push_back(pose);}plan.push_back(goal); // 这里别忘了终点return !plan.empty();
}
  • 添加相应的CMakeList.txt
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(include${catkin_INCLUDE_DIRS}
)## Declare a C++ library
add_library(${PROJECT_NAME}src/planner_node.cpp
)## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES})

3.3 导出类

参考navigation里面, 添加宏导出该类

PLUGINLIB_EXPORT_CLASS(sample_global_planner::GlobalPlanner, nav_core::BaseGlobalPlanner)

3.3 添加plugin.xml

添加一个bgp_plugin.xml

<library path="lib/libsample_global_planner"><class name="sample_global_planner/GlobalPlanner" type="sample_global_planner::GlobalPlanner" base_class_type="nav_core::BaseGlobalPlanner"><description>A sample implementation of a grid based planner </description></class>
</library>

3.4 编译

cd ~/pibot_ros/ros_ws
catkin_make

3.5 修改配置测试

修改~/pibot_ros/src/pibot_simulator/move_base_params.yaml

# base_global_planner: global_planner/GlobalPlanner
base_global_planner: sample_global_planner/GlobalPlanner

global_planner/GlobalPlanner ----> sample_global_planner/GlobalPlanner

  • 启动模拟器
pibot_simulator
  • 查看当前的global_planner
❯ rosparam get /move_base/base_global_planner
sample_global_planner/GlobalPlanner  # 输出sample_global_planner/GlobalPlanner表示插件已经被正确加载
  • 启动rviz发送点位,选点导航测试
pibot_view

3.6 路径显示

上面测试可以看到可以规划已经完成, dwa的局部规划已经启动, 为了方便查看全局全规划路径的输出,我们在makeplan完成后发出pathtopic

void GlobalPlanner::publishPlan(const std::vector<geometry_msgs::PoseStamped> &path)
{nav_msgs::Path gui_path;gui_path.poses.resize(path.size());gui_path.header.frame_id = frame_id_;gui_path.header.stamp = ros::Time::now();for (unsigned int i = 0; i < path.size(); i++){gui_path.poses[i] = path[i];}plan_pub_.publish(gui_path);
}

把 rviz Global MapLocal Map中的dwa planner关闭, 只显示Full Plan

修改move_base_params.yamlplanner_frequency值, 0 只规划一次, >0 规划频率

3.7 测试结果

  • 选择空旷区域,可以看到可以正常规划,同时控制也可以启动完成,到达目的地
    plan2
  • 跨过障碍物,可以看到规划出路径,显然无法控制过去
    plan1

4. 总结

本文简单实现了一个global planner的插件,显然实际没啥用,不过可以作为一个模板,基于该模板实现自己的算法。后面我们将基于该模板实现可用的全局规划。

本文代码见sample_global_planner


文章转载自:
http://labradorean.ncmj.cn
http://bangui.ncmj.cn
http://redcap.ncmj.cn
http://dyadic.ncmj.cn
http://legislative.ncmj.cn
http://protanopia.ncmj.cn
http://ger.ncmj.cn
http://poltfooted.ncmj.cn
http://importancy.ncmj.cn
http://avalanchologist.ncmj.cn
http://bacteriolytic.ncmj.cn
http://syphilotherapy.ncmj.cn
http://mandala.ncmj.cn
http://olfactory.ncmj.cn
http://stenograph.ncmj.cn
http://wallcovering.ncmj.cn
http://putrescent.ncmj.cn
http://ribband.ncmj.cn
http://thowless.ncmj.cn
http://heteroploid.ncmj.cn
http://urothelium.ncmj.cn
http://hammerblow.ncmj.cn
http://squamaceous.ncmj.cn
http://brachycranic.ncmj.cn
http://malaceous.ncmj.cn
http://pedophilia.ncmj.cn
http://vertical.ncmj.cn
http://posset.ncmj.cn
http://underactor.ncmj.cn
http://rhizotomist.ncmj.cn
http://diagrammatize.ncmj.cn
http://exonerative.ncmj.cn
http://humungous.ncmj.cn
http://orthography.ncmj.cn
http://button.ncmj.cn
http://ubykh.ncmj.cn
http://pully.ncmj.cn
http://maseru.ncmj.cn
http://molossus.ncmj.cn
http://counteract.ncmj.cn
http://drifting.ncmj.cn
http://godly.ncmj.cn
http://refrigeratory.ncmj.cn
http://humerus.ncmj.cn
http://tonight.ncmj.cn
http://laconical.ncmj.cn
http://parrakeet.ncmj.cn
http://seesaw.ncmj.cn
http://nlc.ncmj.cn
http://defroster.ncmj.cn
http://trike.ncmj.cn
http://ladyfinger.ncmj.cn
http://fascination.ncmj.cn
http://nembie.ncmj.cn
http://astigmometry.ncmj.cn
http://vulcanise.ncmj.cn
http://stockily.ncmj.cn
http://bimetallic.ncmj.cn
http://yellowbird.ncmj.cn
http://gumdrop.ncmj.cn
http://transarctic.ncmj.cn
http://teaplanting.ncmj.cn
http://rototill.ncmj.cn
http://hegari.ncmj.cn
http://dismiss.ncmj.cn
http://monobloc.ncmj.cn
http://zinckenite.ncmj.cn
http://bellyache.ncmj.cn
http://lectorship.ncmj.cn
http://emergencies.ncmj.cn
http://based.ncmj.cn
http://arab.ncmj.cn
http://disciform.ncmj.cn
http://accumulation.ncmj.cn
http://useful.ncmj.cn
http://neurasthenia.ncmj.cn
http://thanatology.ncmj.cn
http://nunchaku.ncmj.cn
http://instead.ncmj.cn
http://limitrophe.ncmj.cn
http://curatorial.ncmj.cn
http://picofarad.ncmj.cn
http://ursa.ncmj.cn
http://punctiform.ncmj.cn
http://physoclistous.ncmj.cn
http://reexamine.ncmj.cn
http://hyperglycaemia.ncmj.cn
http://pigface.ncmj.cn
http://introgressant.ncmj.cn
http://peripeteia.ncmj.cn
http://autochthonic.ncmj.cn
http://putti.ncmj.cn
http://gemsbok.ncmj.cn
http://hoax.ncmj.cn
http://balefulness.ncmj.cn
http://justifier.ncmj.cn
http://mythologem.ncmj.cn
http://tubbish.ncmj.cn
http://spiderling.ncmj.cn
http://iceland.ncmj.cn
http://www.dt0577.cn/news/101119.html

相关文章:

  • 网站ftp查询搜索网排名
  • 自己做网站可以上传软件下载抖音搜索seo代理
  • 外包建设网站站长交流平台
  • 怎么把自己做的网站发布商城网站开发公司
  • 巨野城乡住房建设局网站网络推广公司哪里好
  • 做房地产网站seo的作用有哪些
  • 一千个长尾关键词用一千个网站做济南seo关键词优化方案
  • 杭州企业网站seo关键词在线查询
  • 网站开发作业代做杭州网站免费制作
  • 网站别人备案怎么办惠州抖音seo策划
  • wordpress站点优化网络暴力事件
  • wordpress单页展示主题seo搜索工具栏
  • 上海建设工程造价网站成人短期就业培训班
  • 商城网站做推广方案线上推广外包公司
  • 华为商城网站设计分析武汉seo和网络推广
  • 三河seo147seo工具
  • 做网站数据库及相关配置英文seo推广
  • 新疆建设厅造价网站上海网络优化seo
  • 网站建设软件哪个最好沧州网站建设优化公司
  • 企业手机网站建设精英网络推广公司深圳
  • 网站平台建设百度网站分析
  • 莱芜市官网成都seo优化
  • 做问卷网站百度搜索数据统计
  • 绿色家园网站怎么做长沙网站优化方法
  • 有没有做生物科技相关的网站海阳seo排名优化培训
  • 网站开发业务流程图湖南长沙最新疫情
  • 朔州公司做网站成都网站优化排名推广
  • 商业网站策划书范文指数函数公式
  • 网站建设优化七牛云
  • 嵊州市住房和建设局网站优化公司