@@ -127,6 +127,17 @@ class MotionModel
127127      //    state.cwz.col(i - 1) = state.wz.col(i);
128128      //  }
129129
130+       //  also apply velocity limits constrains
131+       state.vx .col (i) = state.vx .col (i)
132+         .cwiseMax (control_constraints_.vx_min )
133+         .cwiseMin (control_constraints_.vx_max );
134+ 
135+       state.wz .col (i) = state.wz .col (i)
136+         .cwiseMax (-control_constraints_.wz )
137+         .cwiseMin (control_constraints_.wz );
138+ 
139+ 
140+       //  also constrain wz base
130141      if  (is_holo) {
131142        auto  lower_bound_vy = (state.vy .col (i - 1 ) >
132143          0 ).select (state.vy .col (i - 1 ) + min_delta_vy,
@@ -138,8 +149,14 @@ class MotionModel
138149        state.vy .col (i) = state.cvy .col (i - 1 )
139150          .cwiseMax (lower_bound_vy)
140151          .cwiseMin (upper_bound_vy);
152+ 
153+         state.vy .col (i) = state.cvy .col (i - 1 )
154+         .cwiseMax (-control_constraints_.vy )
155+         .cwiseMin (control_constraints_.vy );
141156      }
142157    }
158+ 
159+     applyConstraints (state);
143160  }
144161
145162  /* *
@@ -153,6 +170,7 @@ class MotionModel
153170   * @param control_sequence Control sequence to apply constraints to 
154171   */  
155172  virtual  void  applyConstraints (models::ControlSequence & /* control_sequence*/ 
173+   virtual  void  applyConstraints (models::State & /* state*/ 
156174
157175protected: 
158176  float  model_dt_{0.0 };
@@ -201,6 +219,28 @@ class AckermannMotionModel : public MotionModel
201219    }
202220  }
203221
222+   void  applyConstraints (models::State & state) override 
223+   {
224+     std::cout << " \n\t  wz Before applyConstraints:\n\t\t " wz (Eigen::seq (0 ,1000 ,300 ), Eigen::seq (0 , 2 )) << std::endl;
225+     //  auto tmp_state = state;
226+     //  for(unsigned int i = 0; i < state.vx.cols(); i++) {
227+     //    auto wz_constrained = state.vx.col(i).abs() / min_turning_r_;
228+     //    state.wz.col(i) = state.wz.col(i)
229+     //      .cwiseMax(-1 * wz_constrained)
230+     //      .cwiseMin(wz_constrained);
231+     //  }
232+ 
233+     std::cout << " \n\t  wz with loop:\n\t\t " wz (Eigen::seq (0 ,1000 ,300 ), Eigen::seq (0 , 2 )) << std::endl;
234+ 
235+     //  vectorized version
236+     const  auto  wz_constrained = tmp_state.vx .abs () / min_turning_r_;
237+     tmp_state.wz  = tmp_state.wz 
238+       .max ((-wz_constrained))
239+       .min (wz_constrained);
240+ 
241+     std::cout << " \n\t  wz without loop:\n\t\t " wz (Eigen::seq (0 ,1000 ,300 ), Eigen::seq (0 , 2 )) << std::endl;
242+   }
243+ 
204244  /* *
205245   * @brief Get minimum turning radius of ackermann drive 
206246   * @return Minimum turning radius 
0 commit comments