Commit 39248c8b authored by stevet's avatar stevet
Browse files

updated notebook

parent 0b5cb22e
......@@ -509,7 +509,7 @@ BOOST_PYTHON_MODULE(curves) {
/** BEGIN bezier3 curve**/
class_<bezier3_t, bases<curve_3_t> >("bezier3", init<>())
class_<bezier3_t, bases<curve_3_t>, boost::shared_ptr<bezier3_t> >("bezier3", init<>())
.def("__init__", make_constructor(&wrapBezier3Constructor))
.def("__init__", make_constructor(&wrapBezier3ConstructorBounds))
.def("__init__", make_constructor(&wrapBezier3ConstructorConstraints))
......
......@@ -30,9 +30,22 @@
},
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 21,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"image/png": "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jIxEWlqaGCF7gcVicZgnpmka7e3tNgb/PT09yM7OZhzvCgsLRzyhR1Y6tbe3c7Y1gz12rFarXQ5+dHV1QalU8rZdhc3g4CDWrl2LiooKbNu2Dbm5ubxdezhomsaSJUsQHR2NzZs3C32cSwUxZUE4efIk5s+fz7Ritba2IjExEZWVlUhISPDZdR5//HHs2rULUqkUmZmZ2LFjx2hYvsgJFEVBoVAwXh3Hjx8HRVFDDP7dLQRqtVooFApMnDiR140m9oMfarUaJpMJFosFUqkUGRkZiImJ4TVlQxb4/u53v8Py5csFK6Y648cff8ScOXMwffp0pqC5du1a3HDDDQKfTFBEQXYGVxHyvn37cNVVVyEgIABPPPEEAOCVV17x6TVGMwaDAcePH2emDM+cOYOIiAibVEdSUpJNVwK7UCZ0AZG8CZw/fx4pKSnw9/eHWq1mTJWIpScXPcXAxf7qF154AcePH8dbb72FnJwcn3794di7dy/KyspAURRKS0uxcuVKXq8/yhEF2Rl8pCy++uor7Ny5Ex9//DFn1xjtkFVWbIP/1tZWpKamori4GDRNo76+Hs899xznhbLhILahISEhyMrKGhKVOjJV8uUewPLycqxYsQKLFy9GWVkZ70VUiqIgk8nw73//G8nJySgpKcEnn3wy3nuLPUEUZCG56aabcOedd2Lx4sVCH2VUYbVacfToUTz66KPQarWIjY2FRqPB1KlTmf7o6dOn8+ZeR9M0s4g2JyfHoxSUI69iT02VDAYDnn/+edTW1uLtt9+GTCYb6S15xdGjR7FmzRr861//AgC89NJLAC76UIi4hdhlwQWuCoe33HIL888BAQG46667+D7eqId4J69ZswbXX389gIuFthMnTqCiogJvv/026urqMGHCBBuD/8zMTJ+nCNh565KSEo+j0sDAQMTExNgUH9mmSi0tLYypElukSfR95MgRPP7441iyZAleffVVwTaBA0BbWxtSUlKY3ycnJ6OiokKw84xVREH2kP3797v87++99x52796NAwcOCPqKPZqZO3euze+lUilKSkpQUlKCpUuXgqZpqNVqxuD/qaeeglKpRGJiIgoLC1FSUoLi4mLExsZ69RlYrVacO3cOP//8M3Jzc21a5UYKaVcjtptsI6Lu7m7U1NTgscceQ0REBDQaDV566SUsWLBAUDEW4Q9RkH3I3r17sW7dOnz//fc+95YVCyq/IJFIEBUVhWuuuYYZxyWphYqKChw9ehSvvfYa+vr6hhj8D5fHJctOJ02ahOLiYs7XOEkkEoSGhiI0NBQJCQno7e1FeHg4rr76aqSmpmLPnj3Ys2cP3nnnHU7PMRxJSUlQqVTM71tbW5GUlCTgicYmYg7Zh2RlZcFoNDKvqLNnz8abb7454q8rFlS8w2Kx4NSpU8wYeE1NDSQSyRCDf39/f/T390OlUsFkMiE3N5d3s3a9Xo81a9ZAoVBg27ZtyMzM5PX6w2GxWCCTyXDgwAEkJSWhpKQEf//73zFt2jShjzZaEIt6YwWxoOIbiMF/dXU1KisrUVVVhfr6egAXDYEefPBB3HbbbcOOYfv6TIcOHcLKlSvxxz/+EQ888ABvy1U9Zc+ePVi+fDkoisJ9992H1atXC32k0YRY1BsriAUV3yCRSBAWFoZ58+Zh3rx5AIA///nPUKlUeOSRR9DQ0IAHH3wQnZ2dyMjIsDH4Dw8P97lI63Q6PP3002hsbMRXX32F9PR0n359X3PDDTeM9+EOzhEFWWRc8/jjjw9JD1itVpw9exbl5eXYtWsXnn32WZhMpiEG/966qdE0jR9++AErV67EAw88gK1btwoaFYsTppcOYspiFCCmLIRncHDQxuD/1KlTCA0NtTH4d8f7WKvV4qmnnkJzczO2bduGtLQ0fm7ABeKEKS+IOeSxAl8FlZGs3hlv0DSNCxcu2Bj8k5FqtsH/xIkTIZFIQNM0Dh48iCeffBIPPfQQSktLL8lcsThhyhmiII8l+CioiKt3RgZZ20R2GVZXV0Or1UImk6G7uxvBwcHYtm0bpkyZIvRRnSJOmHKGKMgiI0NcvTNyzGYzfvrpJ+zatQtPP/20YFGxuxOm1dXV+PLLL8WhJt8jCrKI94ird8YX7733Ht566y0cOHCA9x7scYLY9ibiHTqdDgsXLsTmzZtFMR4HcDlhKuIZYoQsYoPZbMaCBQvwm9/8Bo8++iin16IoCsXFxUhKSsLu3bs5vZaIc7iaMBWxQYyQRTyDpmn84Q9/QG5uLudiDABbtmxBbm4uNBoN59caj2zcuBErVqxAT0+PS+/vxsZGHk8l4opLr+9GRDAOHz6MDz/8EP/5z3+Qn5+P/Px87Nmzh5Nrtba24rvvvkNpaSknX3+8o1KpsG/fvku6o0NkKGKELMJwxRVXwMMUltcsX74c69atg1ar5eV6441HHnkE69atYzooREYHYoQswju7d+9GfHw8ioqKhD7KmOSbb75BUlIS8vLyhD6KiIeIEbII7xw+fBjffvst9uzZw2zQWLx4MT766COhjzZqcNVXvHbtWuzbt0+AU4mMFLHLQkRQDh48iA0bNnDaZdHf34/S0lLU1dVBIpHg3XffxeWXX87Z9YTk5MmTmD9/PtO+1traisTERFRWViIhIUHg041rxC4LEREAKCsrw3XXXYedO3fCZDLBYDAIfSTOmD59Orq7u5nf87FhXcR3iBGyyJhGrVYjPz8fSqVyXI4Di4J8yeDWN59Y1BMZ05w7dw5xcXG49957UVBQgNLSUuj1eqGPxRvNzc2iGI8iPI2QRURGFRKJpBhAOYD/o2m6QiKRbAGgoWn6KYGPJiIyBDFCFhnrtAJopWma7LzaCaBQwPOIiDhFFGSRMQ1N050AVBKJRP6/fzUfwGkBjyQi4hQxZSEy5pFIJPkAtgOQAlACuJem6T5hTyUiMhRRkEVEREQuEcSUhYiIiMglgijIIiIiIpcIoiCLiIiIXCKIgiwiIiJyiSAKsoiIiMglgijIIiIiIpcI/w+9bI5Xd3dUuQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# importing classical numpy objects\n",
"from numpy import zeros, array, identity, dot\n",
......@@ -72,7 +85,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 22,
"metadata": {},
"outputs": [
{
......@@ -114,7 +127,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
......@@ -142,7 +155,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 24,
"metadata": {},
"outputs": [
{
......@@ -178,7 +191,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 25,
"metadata": {},
"outputs": [
{
......@@ -206,7 +219,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
......@@ -234,7 +247,7 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
......@@ -283,7 +296,7 @@
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 28,
"metadata": {},
"outputs": [
{
......@@ -323,7 +336,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 29,
"metadata": {},
"outputs": [
{
......@@ -364,7 +377,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
......@@ -388,7 +401,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 31,
"metadata": {},
"outputs": [
{
......@@ -412,7 +425,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 32,
"metadata": {},
"outputs": [
{
......@@ -449,7 +462,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
......@@ -470,7 +483,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 34,
"metadata": {},
"outputs": [
{
......@@ -497,7 +510,7 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 35,
"metadata": {},
"outputs": [
{
......@@ -531,7 +544,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 36,
"metadata": {},
"outputs": [
{
......@@ -563,7 +576,7 @@
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 37,
"metadata": {},
"outputs": [
{
......@@ -602,7 +615,7 @@
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 38,
"metadata": {},
"outputs": [
{
......@@ -657,7 +670,7 @@
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 39,
"metadata": {},
"outputs": [
{
......@@ -702,19 +715,20 @@
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": 40,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "No to_python (by-value) converter found for C++ type: boost::shared_ptr<curves::bezier_curve<double, double, true, curves::linear_variable<double, true> > >",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-20-fb920503e89a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mpiecewiseCurve\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvariableBezier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.8\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mconstrainedCurve\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpiecewiseCurve\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurve_at_index\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m#find the number of variables\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: No to_python (by-value) converter found for C++ type: boost::shared_ptr<curves::bezier_curve<double, double, true, curves::linear_variable<double, true> > >"
]
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
......
%% Cell type:markdown id: tags:
# Curve optimization with the curves library
%% Cell type:markdown id: tags:
The [curve library](https://github.com/loco-3d/curves) is a header-only C++ library (also binded in python) that allows you
to create curves, in arbitrary dimensions (2, 3, n).
Originally, the library focused on spline curves, but it has now been extended to generic polynomials, cubic hermite splines, Bezier curves and more.
A nice upcoming extension is the ability to design curves in the Special Euclidian group SE3.
However in this tutorial we are going to focus on a rather unique trait of the library, which is the ability to work with variable control points. Rather than being given a constant value, the control points can be expressed as the linear combination of one or several variables. The main advantage of this representation is that variable curves
can be automatically derivated or integrated with any effort.
The other interest of variable curves is the ability to easily formulate optimization problems, which will be the focus of this tutorial. We will use the python bindings of the curve library to go step-by-step to formulating and solving an optimization problem.
## The problem: trajectory fitting
We start with a simple, unconstrained problem.
Let us first consider a 3D curve:
%% Cell type:code id: tags:
``` python
# importing classical numpy objects
from numpy import zeros, array, identity, dot
from numpy.linalg import norm
import numpy as np
np.set_printoptions(formatter={'float': lambda x: "{0:0.1f}".format(x)})
#use array representation for binding eigen objects to python
import eigenpy
eigenpy.switchToNumpyArray()
#importing the bezier curve class
from curves import (bezier)
#importing tools to plot bezier curves
from curves.plot import (plotBezier)
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
#We describe a degree 3 curve as a Bezier curve with 4 control points
waypoints = array([[1., 2., 3.], [-4., -5., -6.], [4., 5., 6.], [7., 8., 9.]]).transpose()
ref = bezier(waypoints)
#plotting the curve with its control points
plotBezier(ref,showControlPoints = True, color="g")
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
We now assume that we only have partial information about this curve, and that we want to reconstruct it.
We will first generate a discretization of the curve to represent a temporal sampling:
%% Cell type:code id: tags:
``` python
numSamples = 10; fNumSamples = float(numSamples)
ptsTime = [ (ref(float(t) / fNumSamples), float(t) / fNumSamples) for t in range(numSamples+1)]
for el in ptsTime:
print el
```
%%%% Output: stream
(array([1.0, 2.0, 3.0]), 0.0)
(array([-0.1, 0.4, 0.9]), 0.1)
(array([-0.6, -0.4, -0.1]), 0.2)
(array([-0.5, -0.4, -0.2]), 0.3)
(array([0.1, 0.2, 0.4]), 0.4)
(array([1.0, 1.2, 1.5]), 0.5)
(array([2.2, 2.6, 3.0]), 0.6)
(array([3.4, 4.1, 4.7]), 0.7)
(array([4.7, 5.6, 6.4]), 0.8)
(array([6.0, 6.9, 7.9]), 0.9)
(array([7.0, 8.0, 9.0]), 1.0)
%% Cell type:markdown id: tags:
Each entry of ptsTime is a couple (position, time) that describes our input data.
### Sanity check
Let's first solve a trivial problem, to see if we can reconstruct the curve with a polynomial
of same degree.
To achieve this we will use the problemDefinition class, which will automatically generate the variable expression of the curve
%% Cell type:code id: tags:
``` python
from curves.optimization import (problem_definition, setup_control_points)
#dimension of our problem (here 3 as our curve is 3D)
dim = 3
refDegree = 3
pD = problem_definition(dim)
pD.degree = refDegree #we want to fit a curve of the same degree as the reference curve for the sanity check
#generates the variable bezier curve with the parameters of problemDefinition
problem = setup_control_points(pD)
#for now we only care about the curve itself
variableBezier = problem.bezier()
```
%% Cell type:markdown id: tags:
The evaluation of a variable Bezier returns a matrix B and a vector c, such
that B x + c , with x a vector variable, defines the value of the curve
%% Cell type:code id: tags:
``` python
linearVariable = variableBezier(0.)
print "B: \n", linearVariable.B()
print "c:\n",linearVariable.c()
print "Shape of B: ", linearVariable.B().shape
```
%%%% Output: stream
B:
[[1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
[0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]
[0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0]]
c:
[0.0 0.0 0.0]
Shape of B: (3, 12)
%% Cell type:markdown id: tags:
B has 3 rows and 12 columns. Because the fitting curve is of degree 3, it has 4 control points of dimension 3, which gives a variable of size 12. The row number also matches the dimension of the problem.
Then A is zero everywhere, expect for the first 3 columns that contain the identity. This is expected as the start of a Bezier curve is equal to the first control point.
If we evaluate variableBezier at t = 0.2 for instance, we get a more complex expression:
%% Cell type:code id: tags:
``` python
print "B: \n", variableBezier(0.2).B()
```
%%%% Output: stream
B:
[[0.5 0.0 0.0 0.4 0.0 0.0 0.1 0.0 0.0 0.0 0.0 0.0]
[0.0 0.5 0.0 0.0 0.4 0.0 0.0 0.1 0.0 0.0 0.0 0.0]
[0.0 0.0 0.5 0.0 0.0 0.4 0.0 0.0 0.1 0.0 0.0 0.0]]
%% Cell type:markdown id: tags:
With variableBezier, we can easily define a least square problem to reconstruct the original curve.
We just have to formulate a cost function that, for each sample in ptsTime minimizes the distance between the evaluation of variableBezier and the sampled point. We define it as follows:
%% Cell type:code id: tags:
``` python
#least square form of ||Ax-b||**2
def to_least_square(A, b):
return dot(A.T, A), - dot(A.T, b)
def genCost(variableBezier, ptsTime):
#first evaluate variableBezier for each time sampled
allsEvals = [(variableBezier(time), pt) for (pt,time) in ptsTime]
#then compute the least square form of the cost for each points
allLeastSquares = [to_least_square(el.B(), el.c() + pt) for (el, pt) in allsEvals]
#and finally sum the costs
Ab = [sum(x) for x in zip(*allLeastSquares)]
return Ab[0], Ab[1]
A, b = genCost(variableBezier, ptsTime)
```
%% Cell type:markdown id: tags:
Here we use quadprog to solve the least square. Because there are no constraint this might seem overkill, however we will introduce them soon enough.
%% Cell type:code id: tags:
``` python
import quadprog
from numpy import array, hstack, vstack
def quadprog_solve_qp(P, q, G=None, h=None, C=None, d=None, verbose=False):
"""
min (1/2)x' P x + q' x
subject to G x <= h
subject to C x = d
"""
# qp_G = .5 * (P + P.T) # make sure P is symmetric
qp_G = .5 * (P + P.T) # make sure P is symmetric
qp_a = -q
qp_C = None
qp_b = None
meq = 0
if C is not None:
if G is not None:
qp_C = -vstack([C, G]).T
qp_b = -hstack([d, h])
else:
qp_C = -C.transpose()
qp_b = -d
meq = C.shape[0]
elif G is not None: # no equality constraint
qp_C = -G.T
qp_b = -h
res = quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)
if verbose:
return res
# print('qp status ', res)
return res[0]
res = quadprog_solve_qp(A, b)
```
%% Cell type:markdown id: tags:
Let's check whether our optimization worked !
We can transform the variable Bezier as a regular Bezier curve as follows, and plot the result to verify that the curves match.
%% Cell type:code id: tags:
``` python
def evalAndPlot(variableBezier, res):
fitBezier = variableBezier.evaluate(res.reshape((-1,1)) )
#plot reference curve in blue, fitted curve in green
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
plotBezier(ref, ax = ax, linewidth=4.) #thicker line to visualize overlap
plotBezier(fitBezier, ax = ax, color ="g", linewidth=3.)
plt.show()
return fitBezier
fitBezier = evalAndPlot(variableBezier, res)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
### initial and terminal constraints
Let's try to fit the reference curve with a curve of lesser degree
%% Cell type:code id: tags:
``` python
pD.degree = refDegree - 1
problem = setup_control_points(pD)
variableBezier = problem.bezier()
A, b = genCost(variableBezier, ptsTime)
res = quadprog_solve_qp(A, b)
fitBezier = evalAndPlot(variableBezier, res)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
We can see that the initial and goal positions are not reached.
A constraint_flag can be used to impose constraints on the initial/goal positions
and derivatives if required.
Let's rewrite simplefit to handle such case
%% Cell type:code id: tags:
``` python
from curves.optimization import constraint_flag
pD.flag = constraint_flag.INIT_POS | constraint_flag.END_POS
#set initial position
pD.init_pos = array([ptsTime[ 0][0]]).T
#set end position
pD.end_pos = array([ptsTime[-1][0]]).T
problem = setup_control_points(pD)
variableBezier = problem.bezier()
```
%% Cell type:markdown id: tags:
By imposing the initial and final position, we effectively reduce the number of variables by 6:
%% Cell type:code id: tags:
``` python
print "Shape of B: ", variableBezier(0).B().shape
```
%%%% Output: stream
Shape of B: (3, 3)
%% Cell type:markdown id: tags:
The least squares problem then has the following solution
%% Cell type:code id: tags:
``` python
prob = setup_control_points(pD)
variableBezier = prob.bezier()
A, b = genCost(variableBezier, ptsTime)
res = quadprog_solve_qp(A, b)
_ = evalAndPlot(variableBezier, res)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
To impose constraints on the derivatives, we can activate the appropriate constraint flags as follows.
Note that derivatives constraints on velocities will only be considered if the constraints on position are also active.
For instance to impose a 0 velocity and acceleration at the initial and goal states we can proceed as follows:
%% Cell type:code id: tags:
``` python
#values are 0 by default, so if the constraint is zero this can be skipped
pD.init_vel = array([[0., 0., 0.]]).T
pD.init_acc = array([[0., 0., 0.]]).T
pD.end_vel = array([[0., 0., 0.]]).T
pD.end_acc = array([[0., 0., 0.]]).T
pD.flag = constraint_flag.END_POS | constraint_flag.INIT_POS | constraint_flag.INIT_VEL | constraint_flag.END_VEL | constraint_flag.INIT_ACC | constraint_flag.END_ACC
```
%% Cell type:markdown id: tags:
However, the definition of the variable problem will result in an error. Do you know why ?
%% Cell type:code id: tags:
``` python
try:
prob = setup_control_points(pD)
except RuntimeError,e:
print e
```
%%%% Output: stream
In setup_control_points; too many constraints for the considered degree
%% Cell type:markdown id: tags:
Indeed, there are not enough variables left in the problem to satisfy the constraints. We need to increase the degree of the curve:
%% Cell type:code id: tags:
``` python
pD.degree = refDegree + 4
prob = setup_control_points(pD)
variableBezier = prob.bezier()
A, b = genCost(variableBezier, ptsTime)
res = quadprog_solve_qp(A, b)
fitBezier = evalAndPlot(variableBezier, res)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
We can check that the derivatives of the curve are 0 at start and end
%% Cell type:code id: tags:
``` python
print "initial velocity", fitBezier.derivate(fitBezier.min(),1)
print "initial acceleration", fitBezier.derivate(fitBezier.min(),2)
print "end velocity", fitBezier.derivate(fitBezier.max(),1)
print "end acceleration", fitBezier.derivate(fitBezier.max(),2)
```
%%%% Output: stream
initial velocity [0.0 0.0 0.0]
initial acceleration [0.0 0.0 0.0]
end velocity [0.0 0.0 0.0]
end acceleration [0.0 0.0 0.0]
%% Cell type:markdown id: tags:
Of course, with such constraints the curve does not really look like the original one anymore.
Although it is not recommended, the library is robust enough to allow for adding an arbitrary number of control points.
Just for fun, let's add 60 more control points and check that the curve is matched better
%% Cell type:code id: tags:
``` python
pD.degree = refDegree + 60
prob = setup_control_points(pD)
variableBezier = prob.bezier()
A, b = genCost(variableBezier, ptsTime)
#regularization matrix
reg = identity(A.shape[1]) * 0.001
res = quadprog_solve_qp(A + reg, b)
fitBezier = evalAndPlot(variableBezier, res)
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
## Adding equality and inequality constraints
Suppose we want to add specific constraint.
For instance, we want that the velocity be exactly 0 at t = 0.8, additionally to the start and goal positions being satisfied. This can be done easily by obtaining the variable equation for the variable curve at that time.
%% Cell type:code id: tags:
``` python
#set initial / terminal constraints
pD.flag = constraint_flag.END_POS | constraint_flag.INIT_POS
pD.degree = refDegree
prob = setup_control_points(pD)
variableBezier = prob.bezier()
#get value of the curve first order derivative at t = 0.8
t08Constraint = variableBezier.derivate(0.8,1)
target = zeros(3)
A, b = genCost(variableBezier, ptsTime)
#solve optimization problem with quadprog
res = quadprog_solve_qp(A, b, C=t08Constraint.B(), d=target - t08Constraint.c())
fitBezier = evalAndPlot(variableBezier, res)
assert norm(fitBezier.derivate(0.8,1) - target) <= 0.001
```
%%%% Output: display_data
%% Cell type:markdown id: tags:
Of course, inequality constraints can be added in a similar way
## Constraining sub-parts of the curve
Now suppose we want to constrain entirely parts of a curve. One common way to address this is to discretize the curve, and write as many constraints as discretization points.
Alternatively, this can be achieved continuously by splitting the Bezier curve continuously, and putting constraints on the control points of the relevant parts.
let's first explain how curve splitting works before writing a problem.
Here is the code that splits our reference curve into two distinct curves at a time t = 0.6
%% Cell type:code id: tags:
``` python
#returns a curve composed of the split curves, 2 in our case
piecewiseCurve = ref.split(array([[0.6]]).T)
#displaying the obtained curves
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
#first, plotting the complete piecewiseCurve is equivalent
plotBezier(piecewiseCurve, ax = ax, linewidth=10., color = "b")
plotBezier(piecewiseCurve.curve_at_index(0), ax = ax, linewidth=4., color = "r")
plotBezier(piecewiseCurve.curve_at_index(1), ax = ax, linewidth=4., color = "orange")
```
%%%% Output: display_data