Commit 0b5cb22e authored by stevet's avatar stevet
Browse files

added boost shared ptr to binding type

parent e5651543
......@@ -534,7 +534,7 @@ BOOST_PYTHON_MODULE(curves) {
;
/** END bezier3 curve**/
/** BEGIN bezier curve**/
class_<bezier_t, bases<curve_abc_t> >("bezier", init<>())
class_<bezier_t, bases<curve_abc_t>, boost::shared_ptr<bezier_t> >("bezier", init<>())
.def("__init__", make_constructor(&wrapBezierConstructor))
.def("__init__", make_constructor(&wrapBezierConstructorBounds))
.def("__init__", make_constructor(&wrapBezierConstructorConstraints))
......@@ -582,7 +582,7 @@ BOOST_PYTHON_MODULE(curves) {
.def("isZero", &linear_variable_t::isZero)
.def("norm", &linear_variable_t::norm);
class_<bezier_linear_variable_t>("bezier_linear_variable", no_init)
class_<bezier_linear_variable_t, bases<curve_abc_t>, boost::shared_ptr<bezier_linear_variable_t> >("bezier_linear_variable", no_init)
.def("__init__", make_constructor(&wrapBezierLinearConstructor))
.def("__init__", make_constructor(&wrapBezierLinearConstructorBounds))
.def("min", &bezier_linear_variable_t::min)
......
......@@ -660,20 +660,9 @@
"execution_count": 19,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "No to_python (by-value) converter found for C++ type: boost::shared_ptr<curves::curve_abc<double, double, true, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-19-a42564ae9410>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;31m#first, plotting the complete piecewiseCurve is equivalent\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplotBezier\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpiecewiseCurve\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlinewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10.\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"b\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mplotBezier\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;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlinewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m4.\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"r\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mplotBezier\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[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlinewidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m4.\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"orange\"\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::curve_abc<double, double, true, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >"
]
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -713,18 +702,18 @@
},
{
"cell_type": "code",
"execution_count": 21,
"execution_count": 20,
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "No to_python (by-value) converter found for C++ type: curves::piecewise_curve<double, double, true, curves::linear_variable<double, true>, curves::linear_variable<double, true> >",
"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-21-fb920503e89a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m#first, split the variable curve\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \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[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \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[1;32m 5\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: curves::piecewise_curve<double, double, true, curves::linear_variable<double, true>, curves::linear_variable<double, true> >"
"\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> > >"
]
}
],
......
%% 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")
```
%% 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: error
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-19-a42564ae9410> in <module>()
9 #first, plotting the complete piecewiseCurve is equivalent
10 plotBezier(piecewiseCurve, ax = ax, linewidth=10., color = "b")
---> 11 plotBezier(piecewiseCurve.curve_at_index(0), ax = ax, linewidth=4., color = "r")
12 plotBezier(piecewiseCurve.curve_at_index(1), ax = ax, linewidth=4., color = "orange")
TypeError: No to_python (by-value) converter found for C++ type: boost::shared_ptr<curves::curve_abc<double, double, true, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, 1, 0, -1, 1> > >
%%%% Output: display_data
%% Cell type:markdown id: tags:
The split is achieved by the De Casteljau algorithm. The continuity at the split location is infinite.
Of course, the split will also work for variable Bezier curves.
We can exploit the convexity of Bezier curves to continuously impose constraints on a given interval of the curve.
If the control points of the sub curve satisfy a set of linear constraints, then the entire sub-curve satisfies the constraint.
For instance, let us impose the z value to be negative between t = 0.4 and t= O.8
%% Cell type:code id: tags:
``` python
#first, split the variable curve
piecewiseCurve = variableBezier.split(array([[0.4, 0.8]]).T)
constrainedCurve = piecewiseCurve.curve_at_index(1)
#find the number of variables
problemSize = prob.numVariables * dim
#find the number of constraints, as many as waypoints
nConstraints = constrainedCurve.nbWaypoints
waypoints = constrainedCurve.waypoints()
ineqMatrix = zeros((nConstraints, problemSize))
ineqVector = zeros(nConstraints)
#finding the z equation of each control point
for i in range(nConstraints):
wayPoint = constrainedCurve.waypointAtIndex(i)
ineqMatrix[i,:] = wayPoint.B()[2,:]
ineqVector[i] = -wayPoint.c()[2]
res = quadprog_solve_qp(A, b, G=ineqMatrix, h = ineqVector)
fitBezier = variableBezier.evaluate(res.reshape((-1,1)) )
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
#now plotting the obtained curve, in red the concerned part
piecewiseFit = fitBezier.split(array([[0.4, 0.8]]).T)
plotBezier(piecewiseFit.curve_at_index(0), ax = ax, linewidth=4., color = "b")
plotBezier(piecewiseFit.curve_at_index(1), ax = ax, linewidth=4., color = "r")
plotBezier(piecewiseFit.curve_at_index(2), ax = ax, linewidth=4., color = "b")
#plotting the plane z = 0
xx, yy = np.meshgrid(range(20), range(20))
# calculate corresponding z
z = (0 * xx - 0 * yy )
# plot the surface
ax.plot_surface(xx, yy, z, alpha=0.2)
plt.show()
```
%%%% Output: error
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-fb920503e89a> in <module>()
1 #first, split the variable curve
----> 2 piecewiseCurve = variableBezier.split(array([[0.4, 0.8]]).T)
<ipython-input-20-fb920503e89a> in <module>()
2 piecewiseCurve = variableBezier.split(array([[0.4, 0.8]]).T)
3
4 constrainedCurve = piecewiseCurve.curve_at_index(1)
----> 4 constrainedCurve = piecewiseCurve.curve_at_index(1)
5
TypeError: No to_python (by-value) converter found for C++ type: curves::piecewise_curve<double, double, true, curves::linear_variable<double, true>, curves::linear_variable<double, true> >
6 #find the number of variables
TypeError: No to_python (by-value) converter found for C++ type: boost::shared_ptr<curves::bezier_curve<double, double, true, curves::linear_variable<double, true> > >
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
```
......
......@@ -440,7 +440,8 @@ class TestCurves(unittest.TestCase):
a = bezier(waypoints, 0., 1.)
b = bezier(waypoints, 1., 2.)
pc = piecewise(a)
pc.append(b)
pc.append(b)
a.split(array([0.4,0.8])).curve_at_index(0)
pc.min()
pc.max()
pc(0.4)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment