matlab-B样条轨迹规划-1 七次非均匀B样条轨迹规划 基于NSGAII的时间-能量-冲击最优。 换上自己的关节值和时间就能用简单好用最近在搞机器人轨迹规划发现七次非均匀B样条真是个好东西。它不仅能保证轨迹的平滑性还能灵活调整控制点简直是机器人运动的福音。今天就来聊聊怎么用Matlab实现七次非均匀B样条轨迹规划顺便结合NSGAII算法搞个时间-能量-冲击最优的规划方案。首先B样条的基础知识就不多说了直接上代码。我们先用Matlab生成一个七次非均匀B样条曲线% 定义控制点 controlPoints [0, 1, 2, 3, 4, 5, 6, 7; 0, 2, 1, 3, 2, 4, 3, 5]; % 定义节点向量 knotVector [0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7]; % 生成B样条曲线 t linspace(0, 7, 100); curve spmak(knotVector, controlPoints); plot(fnval(curve, t), LineWidth, 2);这段代码生成了一个七次非均匀B样条曲线controlPoints是控制点knotVector是节点向量。spmak函数用来创建B样条结构fnval函数用来计算曲线上的点。画出来的曲线平滑得很控制点怎么动曲线就怎么变灵活得很。matlab-B样条轨迹规划-1 七次非均匀B样条轨迹规划 基于NSGAII的时间-能量-冲击最优。 换上自己的关节值和时间就能用简单好用接下来我们要用NSGAII算法来优化这个轨迹。NSGAII是多目标优化算法我们这里的目标是最小化时间、能量和冲击。先定义一下目标函数function objectives trajectoryObjectives(curve, time, energy, jerk) % 计算时间、能量和冲击 timeCost sum(time); energyCost sum(energy); jerkCost sum(jerk); objectives [timeCost, energyCost, jerkCost]; end这个函数计算了轨迹的时间、能量和冲击成本。然后我们用NSGAII来优化% 定义优化问题 problem.objective (x) trajectoryObjectives(x.curve, x.time, x.energy, x.jerk); problem.nvars length(controlPoints); problem.lb [0, 0]; problem.ub [10, 10]; % 运行NSGAII options optimoptions(gamultiobj, PopulationSize, 50, MaxGenerations, 100); [x, fval] gamultiobj(problem, options);gamultiobj是Matlab中的多目标优化函数PopulationSize和MaxGenerations是优化参数。运行完这个代码x就是优化后的控制点fval是优化后的目标值。最后把优化后的控制点代入B样条曲线生成最优轨迹% 生成优化后的B样条曲线 optimizedCurve spmak(knotVector, x); plot(fnval(optimizedCurve, t), LineWidth, 2);这样我们就得到了一个时间-能量-冲击最优的七次非均匀B样条轨迹。换上自己的关节值和时间直接就能用简单好用。总的来说七次非均匀B样条加上NSGAII优化搞机器人轨迹规划真是如虎添翼。代码也不复杂稍微改改就能适应不同的需求。如果你也在搞机器人运动规划不妨试试这个方法效果绝对让你满意。