1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #include "cmscp.h"
- #include "cmscp_sparseInfo.h"
- #include "cmscp_consTypeInfo.h"
- #include "cmscp_socpInfo.h"
- #include "timer.h"
- #include "printFunction.h"
- #include "socSolveShell.h"
- #include "freeSparseInfo.h"
- #include "freeConsTypeInfo.h"
- #include "freeSocpInfo.h"
- #include "freeTrajInfo.h"
- int cmscp(cmscp_trajInfo** optTraj, cmscp_setup* setup) {
- // 变量声明
- int iphase, iIter, stopFlag;
- double time;
- timer timer;
- cmscp_trajInfo** refTraj;
- cmscp_sparseInfo* sparseInfo;
- cmscp_consTypeInfo* consTypeInfo;
- cmscp_socpInfo* socpInfo;
-
- ///* 函数名 */
- cmscp_getIniRefTraj getIniRefTrajFunc = setup->functions->getIniRefTraj; // 获取参考轨迹的函数
- cmscp_stopCondition stopConditionFunc = setup->functions->stopCondition; // 计算停止条件的函数
- cmscp_updateMeshInfo updateMeshInfoFunc = setup->functions->updateMeshInfo; // 更新网格信息的函数
- cmscp_updateTrustInfo updateTrustInfoFunc = setup->functions->updateTrustInfo; // 更新信赖域信息的函数
- cmscp_updateRefTraj updateRefTrajFunc = setup->functions->updateRefTraj; // 更新参考轨迹信息的函数
- /* 1. 获取参考轨迹 */
- refTraj = (cmscp_trajInfo**)malloc(setup->numPhase * sizeof(cmscp_trajInfo*));
- getIniRefTrajFunc(refTraj, setup);
- /* 2. 获取各个矩阵的稀疏信息 */
- getSparseInfo(&sparseInfo, refTraj, setup);// 不想在外面给refTraj赋值(给指针赋值就是分配空间),就把使用refTraj的地址了(声明变量时候自带的)
- /* 3. 获取约束的类型信息 */
- getConsTypeInfo(&consTypeInfo, setup);
- for (iIter = 0; iIter < setup->scpInfo->maxIter; iIter++)
- {
- /* 4. 获取二阶锥问题的参数 */
- tic(&timer);
- getSocpInfo(&socpInfo, refTraj, sparseInfo, consTypeInfo, setup);
- time = toc(&timer);
- /* 6. 求解子问题最优解 */
- socSolveShell(iIter, optTraj, socpInfo, setup);
-
- /* 7. 停止条件 */
- stopFlag = stopConditionFunc(iIter, refTraj, optTraj, setup);
- /* 8. 更新信赖域 */
- updateTrustInfoFunc(iIter, refTraj, optTraj, setup);
- /* 9. 更新网格 */
- updateMeshInfoFunc(iIter, refTraj, optTraj, setup);
- /* 10. 更新参考轨迹 */
- updateRefTrajFunc(refTraj, optTraj, setup);
- // 停止条件达到就停止
- if (stopFlag > 0)
- {
- setup->scpInfo->cntIter = iIter;
- break;
- }
- }
- // 释放SparseInfo
- freeSparseInfo(&sparseInfo, setup);
- // 释放ConsTypeInfo
- freeConsTypeInfo(&consTypeInfo, setup);
- // 输出最优轨迹
- for ( iphase = 0; iphase < setup->numPhase; iphase++)
- {
- optTraj[iphase] = refTraj[iphase];
- }
- free(refTraj);
- // 输出停止标志位
- return stopFlag;
- }
|