圆弧等分点的坐标

轨迹规划中,常用到圆弧点的计算,已知一个轨迹点的坐标(x,y,theta),theta是角度的弧度制表示,求这个点以R为半径,向前走len米的距离,产生的新数据点的坐标。

接下来确认下输入输出:

输入为:起点坐标x,y,theta,半径R,向前走len距离

输出为:终点坐标:X,Y,Thetas


   
   
  1. #include <iostream>
  2. #include <math.h>
  3. #include <cmath>
  4. #include <vector>
  5. //角度归一 将角度转化为 -M_PI~M_PI之间
  6. double NormalizeAngle(const double angle) {
  7. double a = std:: fmod(angle + M_PI, 2.0 * M_PI);
  8. if (a < 0.0) {
  9. a += ( 2.0 * M_PI);
  10. }
  11. return a - M_PI;
  12. }
  13. struct PointXYZ{
  14. PointXYZ() = default;
  15. PointXYZ( float x_, float y_, float theta_):x(x_),y(y_),theta(theta){}
  16. float x{ 0.0};
  17. float y{ 0.0};
  18. float theta{ 0.0};
  19. };
  20. //当旋转半径处于起始点的左侧时
  21. void left_segment(const PointXYZ & start_point,const double R,const double len,PointXYZ* result){
  22. float t = len/R; //归一化 将半径看成单位1
  23. float d_x = sin(start_point.theta + t) - sin(start_point.theta);
  24. float d_y = - cos(start_point.theta + t) + cos(start_point.theta);
  25. float d_head = NormalizeAngle(start_point.theta + t);
  26. //将半径反乘回来,变成真实值
  27. result->x = d_x * R + start_point.x;
  28. result->y = d_y * R + start_point.y;
  29. result->theta = d_head;
  30. }
  31. //当旋转半径处于起始点的右侧时
  32. void right_segment(const PointXYZ & start_point,const double R,const double len,PointXYZ* result){
  33. float t = len/R; //归一化 将半径看成单位1
  34. float d_x = sin(start_point.theta) - sin(start_point.theta - t);
  35. float d_y = cos(start_point.theta - t) - cos(start_point.theta);
  36. float d_head = NormalizeAngle(start_point.theta - t);
  37. //将半径反乘回来,变成真实值
  38. result->x = d_x * R + start_point.x;
  39. result->y = d_y * R + start_point.y;
  40. result->theta = d_head;
  41. }
  42. //直线延长时
  43. void straight_segment(const PointXYZ & start_point,const double len,PointXYZ* result){
  44. float d_x = cos(start_point.theta) * len;
  45. float d_y = sin(start_point.theta) * len;
  46. float d_head = NormalizeAngle(start_point.theta);
  47. //加上偏置
  48. result->x = d_x + start_point.x;
  49. result->y = d_y + start_point.y;
  50. result->theta = d_head;
  51. }
  52. int main(){
  53. std:: vector<PointXYZ> trajectory;
  54. PointXYZ start(5,6,0);
  55. PointXYZ next_point;
  56. float R = 20; //转弯半径为20米
  57. for( float len = 0;len < 20*M_PI* 2;len+= 0.5)
  58. {
  59. left_segment(start,R,len,&next_point);
  60. trajectory.push_back(next_point);
  61. std:: cout<<next_point.x<< ","<<next_point.y<< std:: endl;
  62. }
  63. return 0;
  64. }

输出结果为:


   
   
  1. 5,6
  2. 5 .49995,6 .00625
  3. 5 .99958,6 .02499
  4. 6 .49859,6 .05622
  5. 6 .99667,6 .09992
  6. 7 .49349,6 .15605
  7. 7 .98876,6 .22458
  8. 8 .48216,6 .30547
  9. 8 .97339,6 .39867
  10. 9 .46213,6 .50412
  11. 9 .94808,6 .62175
  12. 10 .4309,6 .7515
  13. 10 .9104,6 .89327
  14. 11 .3862,7 .04699
  15. 11 .858,7 .21255
  16. 12 .3255,7 .38985
  17. 12 .7884,7 .57878
  18. 13 .2464,7 .77922
  19. 13 .6993,7 .99106
  20. 14 .1468,8 .21415
  21. 14 .5885,8 .44835
  22. 15 .0243,8 .69352
  23. 15 .4537,8 .94951
  24. 15 .8767,9 .21615
  25. 16 .2929,9 .49329
  26. 16 .7019,9 .78074
  27. 17 .1037,10 .0783
  28. 17 .4979,10 .3859
  29. 17 .8844,10 .7032
  30. 18 .2627,11 .03
  31. 18 .6328,11 .3662
  32. 18 .9943,11 .7116
  33. 19 .3471,12 .0659
  34. 19 .691,12 .4289
  35. 20 .0256,12 .8003
  36. 20 .3509,13 .1801
  37. 20 .6665,13 .5678
  38. 20 .9724,13 .9633
  39. 21 .2683,14 .3663
  40. 21 .554,14 .7766
  41. 21 .8294,15 .194
  42. 22 .0943,15 .618
  43. 22 .3485,16 .0486
  44. 22 .5918,16 .4854
  45. 22 .8241,16 .9281
  46. 23 .0454,17 .3765
  47. 23 .2553,17 .8303
  48. 23 .4538,18 .2891
  49. 23 .6408,18 .7528
  50. 23 .8161,19 .2211
  51. 23 .9797,19 .6936
  52. 24 .1314,20 .17
  53. 24 .2712,20 .65
  54. 24 .3989,21 .1334
  55. 24 .5145,21 .6199
  56. 24 .6179,22 .109
  57. 24 .709,22 .6007
  58. 24 .7878,23 .0944
  59. 24 .8543,23 .5899
  60. 24 .9083,24 .087
  61. 24 .9499,24 .5853
  62. 24 .979,25 .0844
  63. 24 .9957,25 .5841
  64. 24 .9998,26 .0841
  65. 24 .9915,26 .584
  66. 24 .9706,27 .0835
  67. 24 .9373,27 .5824
  68. 24 .8915,28 .0803
  69. 24 .8333,28 .5769
  70. 24 .7627,29 .0719
  71. 24 .6797,29 .5649
  72. 24 .5845,30 .0557
  73. 24 .477,30 .544
  74. 24 .3573,31 .0295
  75. 24 .2255,31 .5118
  76. 24 .0817,31 .9907
  77. 23 .926,32 .4658
  78. 23 .7585,32 .9369
  79. 23 .5792,33 .4036
  80. 23 .3883,33 .8657
  81. 23 .1859,34 .3229
  82. 22 .9722,34 .7749
  83. 22 .7472,35 .2215
  84. 22 .5112,35 .6622
  85. 22 .2642,36 .0969
  86. 22 .0064,36 .5253
  87. 21 .738,36 .9472
  88. 21 .4591,37 .3621
  89. 21 .1699,37 .77
  90. 20 .8707,38 .1705
  91. 20 .5615,38 .5635
  92. 20 .2425,38 .9485
  93. 19 .9141,39 .3255
  94. 19 .5763,39 .6942
  95. 19 .2295,40 .0543
  96. 18 .8737,40 .4056
  97. 18 .5093,40 .7479
  98. 18 .1364,41 .081
  99. 17 .7553,41 .4046
  100. 17 .3662,41 .7187
  101. 16 .9694,42 .0229
  102. 16 .5652,42 .3171
  103. 16 .1537,42 .6011
  104. 15 .7352,42 .8747
  105. 15 .31,43 .1378
  106. 14 .8784,43 .3901
  107. 14 .4406,43 .6316
  108. 13 .9969,43 .8621
  109. 13 .5476,44 .0814
  110. 13 .0929,44 .2895
  111. 12 .6332,44 .486
  112. 12 .1687,44 .6711
  113. 11 .6998,44 .8444
  114. 11 .2266,45 .006
  115. 10 .7496,45 .1557
  116. 10 .2689,45 .2935
  117. 9 .78498,45 .4192
  118. 9 .29806,45 .5327
  119. 8 .80845,45 .634
  120. 8 .31646,45 .7231
  121. 7 .8224,45 .7999
  122. 7 .32657,45 .8642
  123. 6 .82929,45 .9162
  124. 6 .33087,45 .9557
  125. 5 .83161,45 .9827
  126. 5 .33184,45 .9972
  127. 4 .83185,45 .9993
  128. 4 .33198,45 .9888
  129. 3 .83252,45 .9659
  130. 3 .33379,45 .9305
  131. 2 .8361,45 .8826
  132. 2 .33976,45 .8223
  133. 1 .84509,45 .7496
  134. 1 .35238,45 .6646
  135. 0 .861962,45 .5672
  136. 0 .374124,45 .4577
  137. -0 .110824,45 .336
  138. -0 .592573,45 .2022
  139. -1 .07083,45 .0564
  140. -1 .54529,44 .8987
  141. -2 .01566,44 .7291
  142. -2 .48165,44 .5479
  143. -2 .94296,44 .3551
  144. -3 .39931,44 .1508
  145. -3 .85041,43 .9352
  146. -4 .29598,43 .7083
  147. -4 .73573,43 .4704
  148. -5 .1694,43 .2216
  149. -5 .59672,42 .962
  150. -6 .01742,42 .6918
  151. -6 .43123,42 .4112
  152. -6 .83789,42 .1203
  153. -7 .23716,41 .8194
  154. -7 .62878,41 .5085
  155. -8 .0125,41 .188
  156. -8 .3881,40 .858
  157. -8 .75533,40 .5186
  158. -9 .11395,40 .1703
  159. -9 .46376,39 .813
  160. -9 .80453,39 .4472
  161. -10 .1361,39 .0729
  162. -10 .4581,38 .6904
  163. -10 .7705,38 .3
  164. -11 .073,37 .902
  165. -11 .3655,37 .4965
  166. -11 .6478,37 .0838
  167. -11 .9197,36 .6642
  168. -12 .181,36 .2379
  169. -12 .4315,35 .8052
  170. -12 .6712,35 .3664
  171. -12 .8998,34 .9217
  172. -13 .1172,34 .4715
  173. -13 .3233,34 .016
  174. -13 .518,33 .5554
  175. -13 .701,33 .0902
  176. -13 .8724,32 .6205
  177. -14 .032,32 .1467
  178. -14 .1797,31 .669
  179. -14 .3155,31 .1878
  180. -14 .4391,30 .7033
  181. -14 .5506,30 .2159
  182. -14 .6499,29 .7259
  183. -14 .7369,29 .2335
  184. -14 .8115,28 .7391
  185. -14 .8738,28 .2431
  186. -14 .9237,27 .7456
  187. -14 .9611,27 .247
  188. -14 .986,26 .7476
  189. -14 .9985,26 .2478
  190. -14 .9984,25 .7478
  191. -14 .9859,25 .248
  192. -14 .9608,24 .7486
  193. -14 .9233,24 .25
  194. -14 .8733,23 .7525
  195. -14 .8109,23 .2565
  196. -14 .7362,22 .7621
  197. -14 .6491,22 .2698
  198. -14 .5497,21 .7797
  199. -14 .4381,21 .2924
  200. -14 .3143,20 .8079
  201. -14 .1785,20 .3268
  202. -14 .0307,19 .8491
  203. -13 .871,19 .3753
  204. -13 .6995,18 .9057
  205. -13 .5163,18 .4404
  206. -13 .3215,17 .9799
  207. -13 .1153,17 .5245
  208. -12 .8978,17 .0743
  209. -12 .6691,16 .6297
  210. -12 .4293,16 .1909
  211. -12 .1787,15 .7583
  212. -11 .9173,15 .3321
  213. -11 .6453,14 .9125
  214. -11 .363,14 .4999
  215. -11 .0704,14 .0944
  216. -10 .7678,13 .6965
  217. -10 .4553,13 .3061
  218. -10 .1331,12 .9238
  219. -9 .80155,12 .5496
  220. -9 .4607,12 .1838
  221. -9 .11081,11 .8266
  222. -8 .7521,11 .4783
  223. -8 .38479,11 .1391
  224. -8 .00913,10 .8091
  225. -7 .62533,10 .4887
  226. -7 .23364,10 .1779
  227. -6 .83431,9 .87706
  228. -6 .42758,9 .58627
  229. -6 .01371,9 .30575
  230. -5 .59296,9 .03565
  231. -5 .16558,8 .77615
  232. -4 .73185,8 .52742
  233. -4 .29204,8 .28961
  234. -3 .84643,8 .06287
  235. -3 .39528,7 .84733
  236. -2 .93889,7 .64315
  237. -2 .47753,7 .45043
  238. -2 .0115,7 .26931
  239. -1 .5411,7 .09989
  240. -1 .0666,6 .94229
  241. -0 .58831,6 .79659
  242. -0 .106527,6 .6629
  243. 0 .378448,6 .54129
  244. 0 .866302,6 .43185
  245. 1 .35675,6 .33463
  246. 1 .84947,6 .2497
  247. 2 .34416,6 .17712
  248. 2 .84052,6 .11693
  249. 3 .33821,6 .06916
  250. 3 .83695,6 .03385
  251. 4 .33642,6 .01101
  252. 4 .8363,6 .00067

画图结果如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值