cmscp.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include "cmscp.h"
  2. #include "cmscp_sparseInfo.h"
  3. #include "cmscp_consTypeInfo.h"
  4. #include "cmscp_socpInfo.h"
  5. #include "timer.h"
  6. #include "printFunction.h"
  7. #include "socSolveShell.h"
  8. #include "freeSparseInfo.h"
  9. #include "freeConsTypeInfo.h"
  10. #include "freeSocpInfo.h"
  11. #include "freeTrajInfo.h"
  12. int cmscp(cmscp_trajInfo** optTraj, cmscp_setup* setup) {
  13. // 变量声明
  14. int iphase, iIter, stopFlag;
  15. double time;
  16. timer timer;
  17. cmscp_trajInfo** refTraj;
  18. cmscp_sparseInfo* sparseInfo;
  19. cmscp_consTypeInfo* consTypeInfo;
  20. cmscp_socpInfo* socpInfo;
  21. ///* 函数名 */
  22. cmscp_getIniRefTraj getIniRefTrajFunc = setup->functions->getIniRefTraj; // 获取参考轨迹的函数
  23. cmscp_stopCondition stopConditionFunc = setup->functions->stopCondition; // 计算停止条件的函数
  24. cmscp_updateMeshInfo updateMeshInfoFunc = setup->functions->updateMeshInfo; // 更新网格信息的函数
  25. cmscp_updateTrustInfo updateTrustInfoFunc = setup->functions->updateTrustInfo; // 更新信赖域信息的函数
  26. cmscp_updateRefTraj updateRefTrajFunc = setup->functions->updateRefTraj; // 更新参考轨迹信息的函数
  27. /* 1. 获取参考轨迹 */
  28. refTraj = (cmscp_trajInfo**)malloc(setup->numPhase * sizeof(cmscp_trajInfo*));
  29. getIniRefTrajFunc(refTraj, setup);
  30. /* 2. 获取各个矩阵的稀疏信息 */
  31. getSparseInfo(&sparseInfo, refTraj, setup);// 不想在外面给refTraj赋值(给指针赋值就是分配空间),就把使用refTraj的地址了(声明变量时候自带的)
  32. /* 3. 获取约束的类型信息 */
  33. getConsTypeInfo(&consTypeInfo, setup);
  34. for (iIter = 0; iIter < setup->scpInfo->maxIter; iIter++)
  35. {
  36. /* 4. 获取二阶锥问题的参数 */
  37. tic(&timer);
  38. getSocpInfo(&socpInfo, refTraj, sparseInfo, consTypeInfo, setup);
  39. time = toc(&timer);
  40. /* 6. 求解子问题最优解 */
  41. socSolveShell(iIter, optTraj, socpInfo, setup);
  42. /* 7. 停止条件 */
  43. stopFlag = stopConditionFunc(iIter, refTraj, optTraj, setup);
  44. /* 8. 更新信赖域 */
  45. updateTrustInfoFunc(iIter, refTraj, optTraj, setup);
  46. /* 9. 更新网格 */
  47. updateMeshInfoFunc(iIter, refTraj, optTraj, setup);
  48. /* 10. 更新参考轨迹 */
  49. updateRefTrajFunc(refTraj, optTraj, setup);
  50. // 停止条件达到就停止
  51. if (stopFlag > 0)
  52. {
  53. setup->scpInfo->cntIter = iIter;
  54. break;
  55. }
  56. }
  57. // 释放SparseInfo
  58. freeSparseInfo(&sparseInfo, setup);
  59. // 释放ConsTypeInfo
  60. freeConsTypeInfo(&consTypeInfo, setup);
  61. // 输出最优轨迹
  62. for ( iphase = 0; iphase < setup->numPhase; iphase++)
  63. {
  64. optTraj[iphase] = refTraj[iphase];
  65. }
  66. free(refTraj);
  67. // 输出停止标志位
  68. return stopFlag;
  69. }