@@ -51,7 +51,8 @@ def test_double_integrator(self, xf, uf, Tf):
5151 t , y , x = ct .forced_response (sys , T , ud , x1 , return_x = True )
5252 np .testing .assert_array_almost_equal (x , xd , decimal = 3 )
5353
54- def test_kinematic_car (self ):
54+ @pytest .mark .parametrize ("poly" , [fs .PolyFamily (6 ), fs .BezierFamily (6 )])
55+ def test_kinematic_car (self , poly ):
5556 """Differential flatness for a kinematic car"""
5657 def vehicle_flat_forward (x , u , params = {}):
5758 b = params .get ('wheelbase' , 3. ) # get parameter values
@@ -98,9 +99,6 @@ def vehicle_output(t, x, u, params): return x
9899 xf = [100. , 2. , 0. ]; uf = [10. , 0. ]
99100 Tf = 10
100101
101- # Define a set of basis functions to use for the trajectories
102- poly = fs .PolyFamily (6 )
103-
104102 # Find trajectory between initial and final conditions
105103 traj = fs .point_to_point (vehicle_flat , x0 , u0 , xf , uf , Tf , basis = poly )
106104
@@ -121,3 +119,36 @@ def vehicle_output(t, x, u, params): return x
121119 vehicle_flat , T , ud , x0 , return_x = True )
122120 np .testing .assert_allclose (x , xd , atol = 0.01 , rtol = 0.01 )
123121
122+ def test_bezier_basis (self ):
123+ bezier = fs .BezierFamily (4 )
124+ time = np .linspace (0 , 1 , 100 )
125+
126+ # Sum of the Bezier curves should be one
127+ np .testing .assert_almost_equal (
128+ 1 , sum ([bezier (i , time ) for i in range (4 )]))
129+
130+ # Sum of derivatives should be zero
131+ for k in range (1 , 5 ):
132+ np .testing .assert_almost_equal (
133+ 0 , sum ([bezier .eval_deriv (i , k , time ) for i in range (4 )]))
134+
135+ # Compare derivatives to formulas
136+ np .testing .assert_almost_equal (
137+ bezier .eval_deriv (1 , 0 , time ), 3 * time - 6 * time ** 2 + 3 * time ** 3 )
138+ np .testing .assert_almost_equal (
139+ bezier .eval_deriv (1 , 1 , time ), 3 - 12 * time + 9 * time ** 2 )
140+ np .testing .assert_almost_equal (
141+ bezier .eval_deriv (1 , 2 , time ), - 12 + 18 * time )
142+
143+ # Make sure that the second derivative integrates to the first
144+ time = np .linspace (0 , 1 , 1000 )
145+ dt = np .diff (time )
146+ for i in range (4 ):
147+ for j in (2 , 3 , 4 ):
148+ np .testing .assert_almost_equal (
149+ np .diff (bezier .eval_deriv (i , j - 1 , time )) / dt ,
150+ bezier .eval_deriv (i , j , time )[0 :- 1 ], decimal = 2 )
151+
152+ # Exception check
153+ with pytest .raises (ValueError , match = "index too high" ):
154+ bezier .eval_deriv (4 , 0 , time )
0 commit comments