本文为博客的子文,目的是生成专家轨迹,后续作为训练网络的真值标签,进行有监督学习。
仿真环境的整体运行流程如下:
本模块主要实现全局规划,即专家轨迹的生成。流程框图如下:
输入:
输出: 规划的前3条轨迹
方法:M-H采样
参考Readme.md中《Collect your own dataset》的步骤,注意打开配置文件 default.yaml and label_generation.yaml.中的perform_global_planning选项。
Reference Trajectory 通过给定起点和终点得到,是一条直线轨迹。
上图中,直线为Reference Trajectory, 枚红色轨迹为全局规划的输出轨迹。橙色为深度学习网络训练生成的用于飞机的实际执行轨迹。
Environment Pointcloud 通过给定飞机的起点和终点(终点通过起点加上40m得到),可以获取unity场景的有限范围的真实点云。
仿真环境中使用状态估计器(state_predictor_)给出飞机的实时位姿。
状态估计器(state_predictor_)的主要估计位姿的方法是通过上一次的控制指令,以及现在的时间,进行积分,代码如下:
/// state_predictor.cpp
QuadExtStateEstimate StatePredictor::predictWithoutCommand(
const QuadExtStateEstimate& old_state,
const double total_integration_time) const
{
QuadExtStateEstimate new_state = old_state;
double current_integration_step = 0.0;
double integrated_time = 0.0;
while (integrated_time < total_integration_time)
{
current_integration_step = std::min(
integration_step_size_, total_integration_time - integrated_time);
new_state = dynamics(new_state, current_integration_step);
integrated_time += current_integration_step;
}
return new_state;
}
QuadExtStateEstimate StatePredictor::dynamics(
const QuadExtStateEstimate& old_state, const double dt) const
{
QuadExtStateEstimate new_state;
new_state.timestamp = old_state.timestamp + ros::Duration(dt);
new_state.coordinate_frame = old_state.coordinate_frame;
new_state.position = old_state.position + old_state.velocity * dt;
new_state.velocity = old_state.velocity;
new_state.orientation = quadrotor_common::integrateQuaternion(
old_state.orientation, old_state.bodyrates, dt);
new_state.bodyrates = old_state.bodyrates;
new_state.thrust = old_state.thrust;
return new_state;
}
而控制指令通过MPC控制器得到,MPC控制器需要给定预计的飞机位姿(predicted_state),待执行的轨迹(reference_trajectory),即可输出控制指令(control_cmd)。对应代码:
control_cmd = base_controller_.run(predicted_state, reference_trajectory,
base_controller_params_);
飞机的初始状态为悬停,位置为给定的飞机起点。此时,MPC控制器通过待执行的轨迹,和飞机的初始姿进行初始化估计(Solving MPC with hover as initial guess.),输出控制指令;–>有了初始控制指令+下一次的时间,可以用状态估计器(state_predictor_)来预测目的位姿。–> 然后有了预测的位姿,和待执行的轨迹,又可以MPC计算控制指令。以此往复,即可控制飞机跟随轨迹运动,并输出实时的飞机位姿。
通过启动文件,可以看到全局规划通过ellipsoid_planner_node实现。
<!-- Global Planning -->
<include file="$(find mpl_test_node)/launch/ellipsoid_planner_node/global_planning.launch"/>
ellipsoid_planner_node流程 : 加载reference_trajectory.csv–>加载unity点云,转换为ros格式的点云,发布出去。–> 初始化planner (MPL::EllipsoidPlanner) ,并设置相应配置项–> 发布规划的起点和终点坐标 --> 运行轨迹规划(planner_->plan(start, goal);) --> 规划成功后,发布规划的轨迹,并保存ellipsoid_trajectory.csv。
planner 代码里面有两种规划算法: LPAstar 和 Astar。详细算法实现可以参考:S. Liu, K. Mohta, N. Atanasov, and V. Kumar, “Search-based motion planning for aggressive flight in se (3),” IEEE Robotics and Automation Letters, vol. 3, no. 3, pp. 2439–2446, 2018.
全局规划轨迹完成之后,会有两个模块使用该轨迹。
(1) AgileAutonomy::completedGlobalPlanCallback 会进行如下处理:
(2) GenerateLabel::generateInitialGuesses 会进行如下处理: