Tare_planner 学习教程(二)

Tare_planner 学习教程(二)

这一教程主要介绍该算法中比较重要的几个模块的知识,主要是由grid模块引入的几个重要的内容。在三维空间的体素网格地图的表示中,grid是一个3D网格的最小单元,所有的空间位置都需要表示成一系列的grid的组合。同样障碍物信息和三维的显示都也需要用到三维空间网格的表示。所以本教程主要讲述grid的基础功能和用其表示的地图信息。

1. Class Grid的介绍

Class Grid是一个用来表示是体素网格特征的基础类,其内容的成员函数较为容易,但是为了方便后续的开发,代码引入了大量的重构函数和模板函数,可能对大家的阅读源码造成了很大的困难。

1.1 class grid 的私有变量

int 							dimension_;         // 表示体素网格的维度,默认为三维,dimension_ = 3;
int								cell_number_;		// 表示当前体素网格的个数
Eigen::Vector3d 				origin_;			// 表示当前体素网格的起点
Eigen::Vector3i					size_;				// 表示当前体素网格x,y,z的大小
Eigen::Vector3d					resolution_;		// 表示当前体素网格x,y,z的分辨率
Eigen::Vector3d					resolution_inv_;	// 表示当前体素网格x,y,z的分辨率的倒数,相当于一个1m体素网格的数量
std::vector<_T>					cells_;				// 每个体素网格的内容
std::vector<Eigen::Vector3i>	subs_;				// 每个体素网格的序号

1.2 Grid的构造函数

Grid(const Eigen::Vector3i& size, _T init_value, const Eigen::Vector3d& origin= Eigen::Vector3D(0,0,0),
	 const Eigen::Vector3d& resolution = Eigen::Vector3d(1,1,1), int dimension = 3){}

上述构造函数中,初始化了grid的size、origin、resolution和dimension,然后求解了每个维度信息上的resolution_inv、cell_number_,初始化了cells_和subs_。

1.3 Grid的一些基本成员函数介绍

函数名称函数说明
GetCellNumber()返回当前体素网格的数量
GetSize()返回当前体素网格x,y,z的大小
GetOrigin()返回当前体素网格的起点位置
SetOrigin()设置当前体素网格的起点位置
SetResolution()设置当前体素网格的分辨率
GetResolution()返回当前体素网格的分辨率
GetResolution_inv()返回当前体素网格的分辨率的倒数

1.4 Grid的一些重构成员函数

函数名称函数说明
InRange()返回输入的参数是否在当前的体素网格内
Ind2Sub()将体素网格的序号转换为体素网格中的位置编号
Sub2Ind()将体素网格的位置编号转换为体素网格的序号
Sub2Pos()根据体素网格的位置编号转换为体素网格的位置
Ind2Pos()根据体素网格的序号转换为体素网格的位置
Pos2Ind()根据体素网格的位置返回体素网格的序号
Pos2Sub()根据体素网格的位置返回体素网格的位置编号

1.5 Grid关于cell操作的成员函数

函数名称函数说明
GetCell()返回体素网格内的一个最小单元
GetCellValue()返回体素网格内的一个最小单元的值
SetCellValue()设置体素网格内的一个最小单元

tips:
其实GetCell()和GetCellValue()返回的值一样,但是GetCell()返回的是引用,可以用来修改Cell的值

1.6 关于Ind2Sub的函数解析

由于是三维体素网格,x,y,z方向上有固定的size,所以先用ind / (size.x() * size.y())得到z轴的位置,然后用ind减去(size.z() * size.x() * size.y())后得到平面的x和y的大小,然后除以size.y()得到y轴的坐标,最后除以size.x()取余数得到x轴的坐标。

2.Class RollingGrid的介绍

RollingGrid类主要处理Grid的翻滚,主要是由于机器人位置和雷达的坐标系不统一带入的该问题,所以这部分主要是完成坐标系的统一。

2.1 Class RollingGrid的私有变量

Eigen::Vector3i 					size_;				// 体素网格的大小
std::unique_ptr<grid_ns::Grid<int>> grid0_;				// 体素网格0
std::unique_ptr<grid_ns::Grid<int>> grid1_;				// 体素网格1
std::vector<int>  					updated_indices_;	// 更新指数
std::vector<int>					array_ind_to_ind_;	// 指数的变换
bool 								which_grid_;		// 使用哪个体素网格的标志

2.2 RollingGrid的构造函数

RollingGrid(const Eigen::Vector3i& size);

RollingGrid的构造函数主要是初始化了array_ind_to_ind_、grid0_、grid1_、size_等变量

2.3 RollingGrid的基本成员函数

函数名称函数说明
InRange()返回当前编号是不是在体素网格内
Ind2Sub()将体素网格的序号转换为体素网格中的位置编号
Sub2Ind()将体素网格的位置编号转换为体素网格的序号
GetArrayInd()返回grid的sub的值
GetInd()返回array_ind_to_ind_的值

2.4 RollingGrid的主要成员函数

函数名称函数说明
Roll()完成grid的内向翻转和array_ind_to_ind_的填充
GetUpdatedIndices()更新了Indices的值,主要是记录翻滚之后的grid哪些ind发生了变化
GetRolledOutIndices()对于grid进行了外向翻滚,外向翻过是以翻滚线和终点为轴,向右手侧进行翻滚
GetUpdatedArrayIndices()更新了array_indices的值
GetFromIdx()返回翻滚后的相应位置的Indices的值
RollHelper()帮助进行翻滚轴的判断
GetRolledInIndices()对于grid进行了内向翻滚,外向翻过是以翻滚线和终点为轴,向左手侧进行翻滚
GetRolledOutIndices()没有相应的定义(暂时不清楚具体的)
GetIndices()返回了翻滚后Indices的值
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: mpc_local_planner是一种基于模型预测控制的本地路径规划器,主要用于自主驾驶车辆的路径规划。以下是mpc_local_planner的使用教程: 1. 安装ROS和mpc_local_planner 首先需要安装ROS和mpc_local_planner。可以通过以下命令安装: ``` sudo apt-get install ros-kinetic-mpc-local-planner ``` 2. 配置参数 在使用mpc_local_planner之前,需要对其进行参数配置。可以通过修改launch文件中的参数来进行配置。主要需要配置的参数包括: - robot_radius:机器人半径 - max_vel_x:机器人最大线速度 - min_vel_x:机器人最小线速度 - max_vel_theta:机器人最大角速度 - min_vel_theta:机器人最小角速度 - acc_lim_x:机器人线加速度限制 - acc_lim_theta:机器人角加速度限制 - sim_time:模拟时间 - sim_granularity:模拟粒度 - angular_sim_granularity:角度模拟粒度 3. 启动mpc_local_planner 启动mpc_local_planner需要使用roslaunch命令。可以通过以下命令启动: ``` roslaunch mpc_local_planner mpc_local_planner.launch ``` 启动后,mpc_local_planner会订阅机器人的位姿信息和全局路径信息,并发布机器人的速度控制信息。 4. 可视化 可以使用rviz来可视化mpc_local_planner的运行情况。可以通过以下命令启动rviz: ``` rosrun rviz rviz ``` 在rviz中,需要添加以下显示: - RobotModel:机器人模型 - Path:全局路径 - Local Plan:局部路径 通过以上步骤,就可以使用mpc_local_planner进行路径规划了。 ### 回答2: mpc_local_planner是一种基于模型预测控制的局部路径规划器,可以在ROS系统上运行。它适用于机器人或自动驾驶车辆在未知环境或障碍物密集区域进行路径规划,并能考虑车辆动力学、环境条件等因素,使得路径更加稳定和安全。 使用mpc_local_planner需要先进行安装,具体操作可以参考ROS官方网站的安装指南。安装成功后,在ROS工作空间中创建一个新的包,并在package.xml文件中添加依赖,安装所需的依赖库。 首先,需要在代码中引入mpc_local_planner相关的头文件,并定义一个全局变量planner,类型为MPCPlannerROS(注意,此处需要使用MPCPlannerROS而不是MPCPlanner,因为它将ROS系统与MPC控制器结合在一起): #include <mpc_local_planner/mpc_planner_ros.h> MPCPlannerROS planner; 接下来,需要在ROS节点中初始化planner: ros::NodeHandle private_nh("~"); planner.initialize(private_nh); 然后,需要在主循环中调用planner的updatePlan方法,实时更新路径规划结果: while (ros::ok()) { // 获取机器人的位姿信息和局部地图信息,传递给planner.updatePlan()进行路径规划 planner.updatePlan(current_pose, local_costmap, local_map); } 最后,需要在ROS节点中添加一个订阅者,用于接收机器人的位姿信息、传感器数据等信息,以便更新路径规划: ros::Subscriber pose_sub = nh.subscribe("/amcl_pose", 10, poseCallback); 其中poseCallback为回调函数,用于获取机器人的位姿信息,并调用planner的setPlan方法,将目标路径传递给planner: void poseCallback(const geometry_msgs::PoseStamped& pose) { // 获取机器人当前的位姿信息,并调用planner的setPlan()方法传递目标路径 tf::Pose robot_pose; tf::poseMsgToTF(pose.pose, robot_pose); planner.setPlan(robot_pose); } mpc_local_planner的配置参数非常丰富,可以通过在ROS参数服务器中设置参数来调整路径规划的结果。例如,可以设置MPC控制器的时间步长、预测时间、约束条件等参数,或者调整局部地图的分辨率、占用阈值等参数,以达到更好的效果。 总之,mpc_local_planner是一种非常高效、灵活的路径规划器,能够适应各种环境和条件,并能根据实时传感器数据进行实时更新。虽然使用起来有一定的复杂度,但是掌握一定的使用方法和技巧,仍然可以在实际应用中发挥出很大的作用。 ### 回答3: MPC_local_planner是一种移动底盘路径规划器,通过模型预测控制的方法计算出机器人在未来一定时间内前进方向以及速度,从而达到对路径实时控制的目的,在ROS中常被用来作为机器人底层行走模块的路径规划器。 MPC_local_planner的使用教程如下: 1、安装MPC_local_planner 可以通过ROS论坛或者github下载源码进行安装,同时还需要安装和设置相关依赖包。 2、配置MPC_local_planner参数 MPC_local_planner的机器人行动学模型等参数都可在代码源文件中进行设置,主要包括机器人速度,角度等相关参数。 3、设置起始位置和目标点 在进行路径规划前,需要设置机器人的起始位置和目标点。 4、调用MPC_local_planner的API 在设置好相关参数和起始位置/目标点之后,可以调用MPC_local_planner提供的API进行路径规划,同时可以通过回调函数对路径进行相关调整和修改。 5、执行路径规划并进行路径跟踪 在完成路径规划之后,就可以根据生成的路径进行移动底层控制,实现机器人的路径跟踪。 总之,使用MPC_local_planner进行路径规划时要注意对参数的设置和路径的调整等,需要对ROS等相关操作系统有一定的掌握和理解,同时还要有一定的机器人运动学基础,才能够更好地完成路径规划的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值