trajectory_path.scad 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. use <linalg.scad>
  2. use <se3.scad>
  3. function left_multiply(a,bs,i_=0) = i_ >= len(bs) ? [] :
  4. concat([
  5. a * bs[i_]
  6. ], left_multiply(a,bs,i_+1));
  7. function right_multiply(as,b,i_=0) = i_ >= len(as) ? [] :
  8. concat([
  9. as[i_] * b
  10. ], right_multiply(as,b,i_+1));
  11. function quantize_trajectory(trajectory,step=undef,start_position=0,steps=undef,i_=0,length_=undef) =
  12. length_ == undef ? quantize_trajectory(
  13. trajectory=trajectory,
  14. start_position=(step==undef?norm(take3(trajectory))/steps*start_position:start_position),
  15. length_=norm(take3(trajectory)),
  16. step=step,steps=steps,i_=i_) :
  17. (steps==undef?start_position > length_:i_>=steps) ? [] :
  18. concat([
  19. // if steps is defined, ignore start_position
  20. se3_exp(trajectory*(steps==undef ? start_position/length_
  21. : i_/(steps>1?steps-1:1)))
  22. ], quantize_trajectory(trajectory=trajectory,step=step,start_position=(steps==undef?start_position+step:start_position),steps=steps,i_=i_+1,length_=length_));
  23. function close_trajectory_loop(trajectories) = concat(trajectories,[se3_ln(invert_rt(trajectories_end_position(trajectories)))]);
  24. function quantize_trajectories(trajectories,step=undef,start_position=0,steps=undef,loop=false,last_=identity4(),i_=0,current_length_=undef,j_=0) =
  25. // due to quantization differences, the last step may be missed. In that case, add it:
  26. loop==true ? quantize_trajectories(
  27. trajectories=close_trajectory_loop(trajectories),
  28. step=step,
  29. start_position = start_position,
  30. steps=steps,
  31. loop=false,
  32. last_=last_,
  33. i_=i_,
  34. current_length_=current_length_,
  35. j_=j_) :
  36. i_ >= len(trajectories) ? (j_ < steps ? [last_] : []) :
  37. current_length_ == undef ?
  38. quantize_trajectories(
  39. trajectories=trajectories,
  40. step = (step == undef ? trajectories_length(trajectories) / steps : step),
  41. start_position = (step == undef ? start_position * trajectories_length(trajectories) / steps : start_position),
  42. steps=steps,
  43. loop=loop,
  44. last_=last_,
  45. i_=i_,
  46. current_length_=norm(take3(trajectories[i_])),
  47. j_=j_) :
  48. concat(
  49. left_multiply(last_,quantize_trajectory(
  50. trajectory=trajectories[i_],
  51. start_position=start_position,
  52. step=step)),
  53. quantize_trajectories(
  54. trajectories=trajectories,
  55. step=step,
  56. start_position = start_position > current_length_
  57. ? start_position - current_length_
  58. : step - ((current_length_-start_position) % step),
  59. steps=steps,
  60. loop=loop,
  61. last_=last_ * se3_exp(trajectories[i_]),
  62. i_=i_+1,
  63. current_length_ = undef,
  64. j_=j_+len(
  65. quantize_trajectory(
  66. trajectory=trajectories[i_],
  67. start_position=start_position,
  68. step=step
  69. ))
  70. ))
  71. ;
  72. function trajectories_length(trajectories, i_=0) = i_ >= len(trajectories) ? 0
  73. : norm(take3(trajectories[i_])) + trajectories_length(trajectories,i_+1);
  74. function trajectories_end_position(rt,i_=0,last_=identity4()) =
  75. i_ >= len(rt) ? last_ :
  76. trajectories_end_position(rt, i_+1, last_ * se3_exp(rt[i_]));