Skip to content

Commit c5de90a

Browse files
authored
Merge pull request #17 from janbruedigam/switch_to_quaternions
Fix examples, CI
2 parents b0f4f30 + 0b34b7b commit c5de90a

25 files changed

+199
-123
lines changed

.github/workflows/TagBot.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
name: TagBot
22
on:
3-
schedule:
4-
- cron: 0 0 * * *
3+
issue_comment:
4+
types:
5+
- created
6+
workflow_dispatch:
57
jobs:
68
TagBot:
9+
if: github.event_name == 'workflow_dispatch' || github.actor == 'JuliaTagBot'
710
runs-on: ubuntu-latest
811
steps:
912
- uses: JuliaRegistries/TagBot@v1
1013
with:
11-
token: ${{ secrets.GITHUB_TOKEN }}
14+
token: ${{ secrets.GITHUB_TOKEN }}
15+
ssh: ${{ secrets.DOCUMENTER_KEY }}

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
matrix:
1515
version:
1616
- '1.6'
17-
- '1.7'
17+
- '1'
1818
- 'nightly'
1919
os:
2020
- ubuntu-latest

Project.toml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@ version = "0.2.0"
66
[deps]
77
ConstrainedDynamics = "65b0d8a9-e9fd-4f02-8653-a7163c490b26"
88
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
9-
Rotations = "6038ab10-8711-5258-84ad-4b1120ba62dc"
109
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
1110

1211
[compat]
13-
ConstrainedDynamics = "0.8"
14-
Rotations = "1.1"
15-
StaticArrays = "0.12, 1.0"
16-
julia = "1.6, 1.7"
12+
ConstrainedDynamics = "0.9.1, 0.9.1"
13+
StaticArrays = "1.0, 1.5"
14+
julia = "1.6, 1.8"
1715

1816
[extras]
1917
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"

examples/lqr_acrobot.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ using ConstrainedDynamics
22
using ConstrainedDynamicsVis
33
using ConstrainedControl
44
using LinearAlgebra
5-
using Rotations
65

76

87
# Parameters
@@ -32,11 +31,11 @@ constraints = [joint1;joint2]
3231

3332

3433
mech = Mechanism(origin, links, constraints, g=-9.81)
35-
setPosition!(origin,link1,p2 = p2a,Δq = QuatRotation(RotX(ϕ1-0.1)))
36-
setPosition!(link1,link2,p1=-p2a,p2 = p2b,Δq = QuatRotation(RotX(0.1)))
34+
setPosition!(origin,link1,p2 = p2a,Δq = RotX(ϕ1-0.1))
35+
setPosition!(link1,link2,p1=-p2a,p2 = p2b,Δq = RotX(0.1))
3736

3837
xd = [[[0;0;0.5]];[[0;0;2.0]]]
39-
qd=[[QuatRotation(RotX(ϕ1))];[QuatRotation(RotX(ϕ2))]]
38+
qd=[[RotX(ϕ1)];[RotX(ϕ2)]]
4039

4140
Q = [diagm(ones(12))*0.0 for i=1:2]
4241
Q[1][7,7]=4.0

examples/lqr_cartpole.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ using ConstrainedDynamics
22
using ConstrainedDynamicsVis
33
using ConstrainedControl
44
using LinearAlgebra
5-
using Rotations
65

76

87
# Parameters
@@ -32,7 +31,7 @@ constraints = [joint1;joint2]
3231

3332
mech = Mechanism(origin, links, constraints, g=-9.81)
3433
setPosition!(origin,cart,Δx = [0;0.5;0])
35-
setPosition!(cart,pole,p2 = -p2,Δq = QuatRotation(RotX+0.2)))
34+
setPosition!(cart,pole,p2 = -p2,Δq = Quaternion(RotX+0.2)))
3635

3736
xd = [[[0;0;0.0]];[[0;0;0.5]]]
3837

examples/lqr_cartpole_n_pendulum.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ using ConstrainedDynamics
22
using ConstrainedDynamicsVis
33
using ConstrainedControl
44
using LinearAlgebra
5-
using Rotations
65

76

87
# Parameters
@@ -38,9 +37,9 @@ end
3837

3938
mech = Mechanism(origin, bodies, constraints, g=-9.81)
4039
setPosition!(origin,cart,Δx = [0;yinit;0])
41-
setPosition!(cart,bodies[2],p2 = -p2,Δq = QuatRotation(RotX(ϕinit[1])))
40+
setPosition!(cart,bodies[2],p2 = -p2,Δq = Quaternion(RotX(ϕinit[1])))
4241
for i=2:N
43-
setPosition!(bodies[i],bodies[i+1],p1=p2,p2=-p2,Δq=QuatRotation(RotX(ϕinit[i])))
42+
setPosition!(bodies[i],bodies[i+1],p1=p2,p2=-p2,Δq=Quaternion(RotX(ϕinit[i])))
4443
end
4544

4645
xd = [[[0;0;0.0]]; [[0;0;i-1+0.5] for i=1:N]]

examples/lqr_deltabot.jl

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ using ConstrainedDynamics
22
using ConstrainedDynamicsVis
33
using ConstrainedControl
44
using LinearAlgebra
5-
using Rotations
65

76

87
# Parameters
@@ -23,7 +22,7 @@ upperlegr = deepcopy(upperlegl)
2322
platform = Box(0.1, 0.1, length1/2*sqrt(2), length1/2*sqrt(2))
2423

2524
# Constraints
26-
floorlr = EqualityConstraint(Revolute(origin, lowerlegl, joint_axis; p2=-pll),Revolute(origin, lowerlegr, joint_axis; p2=-pll),FixedOrientation(origin,platform;qoffset = QuatRotation(RotX(pi/2))))
25+
floorlr = EqualityConstraint(Revolute(origin, lowerlegl, joint_axis; p2=-pll),Revolute(origin, lowerlegr, joint_axis; p2=-pll),FixedOrientation(origin,platform;qoffset = Quaternion(RotX(pi/2))))
2726
kneel = EqualityConstraint(Revolute(lowerlegl, upperlegl, joint_axis; p1=pll, p2=-pul))
2827
kneer = EqualityConstraint(Revolute(lowerlegr, upperlegr, joint_axis; p1=pll, p2=-pul))
2928
platl = EqualityConstraint(Revolute(platform, upperlegl, joint_axis; p2=pul, p1=pp))
@@ -35,11 +34,11 @@ constraints = [platl;platr;floorlr;kneel;kneer]
3534

3635

3736
mech = Mechanism(origin, links, constraints, g=-9.81, Δt = 0.01)
38-
setPosition!(origin,lowerlegl,p2 = -pll,Δq = QuatRotation(RotX(pi/4)))
39-
setPosition!(origin,lowerlegr,p2 = -pll,Δq = QuatRotation(RotX(-pi/4)))
40-
setPosition!(lowerlegl,upperlegl,p1 = pll, p2 = -pul,Δq = QuatRotation(RotX(-pi/2)))
41-
setPosition!(lowerlegr,upperlegr,p1 = pll, p2 = -pul,Δq = QuatRotation(RotX(pi/2)))
42-
setPosition!(upperlegl,platform,p1 = pul, p2 = pp,Δq = QuatRotation(RotX(3pi/4)))
37+
setPosition!(origin,lowerlegl,p2 = -pll,Δq = Quaternion(RotX(pi/4)))
38+
setPosition!(origin,lowerlegr,p2 = -pll,Δq = Quaternion(RotX(-pi/4)))
39+
setPosition!(lowerlegl,upperlegl,p1 = pll, p2 = -pul,Δq = Quaternion(RotX(-pi/2)))
40+
setPosition!(lowerlegr,upperlegr,p1 = pll, p2 = -pul,Δq = Quaternion(RotX(pi/2)))
41+
setPosition!(upperlegl,platform,p1 = pul, p2 = pp,Δq = Quaternion(RotX(3pi/4)))
4342

4443
xd = [links[i].state.xc for i=1:5]
4544
qd=[links[i].state.qc for i=1:5]
@@ -139,11 +138,11 @@ end
139138
### End
140139

141140
i = 97
142-
setPosition!(origin,lowerlegl,p2 = -pll,Δq = QuatRotation(RotX(anglesl[i][1])))
143-
setPosition!(origin,lowerlegr,p2 = -pll,Δq = QuatRotation(RotX(anglesr[i][1])))
144-
setPosition!(lowerlegl,upperlegl,p1 = pll, p2 = -pul,Δq = QuatRotation(RotX(anglesl[i][2])))
145-
setPosition!(lowerlegr,upperlegr,p1 = pll, p2 = -pul,Δq = QuatRotation(RotX(anglesr[i][2])))
146-
setPosition!(origin,platform,p1 = [0;A[i,:]],Δq = QuatRotation(RotX(pi/2)))
141+
setPosition!(origin,lowerlegl,p2 = -pll,Δq = Quaternion(RotX(anglesl[i][1])))
142+
setPosition!(origin,lowerlegr,p2 = -pll,Δq = Quaternion(RotX(anglesr[i][1])))
143+
setPosition!(lowerlegl,upperlegl,p1 = pll, p2 = -pul,Δq = Quaternion(RotX(anglesl[i][2])))
144+
setPosition!(lowerlegr,upperlegr,p1 = pll, p2 = -pul,Δq = Quaternion(RotX(anglesr[i][2])))
145+
setPosition!(origin,platform,p1 = [0;A[i,:]],Δq = Quaternion(RotX(pi/2)))
147146

148147
storage = simulate!(mech,10,lqr,record = true)
149148
visualize(mech,storage)

examples/lqr_pendulum.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ constraints = [joint_between_origin_and_link1]
2727

2828

2929
mech = Mechanism(origin, links, constraints)
30-
setPosition!(origin,link1,p2 = p2,Δq = QuatRotation(RotX+pi-0.4)))
30+
setPosition!(origin,link1,p2 = p2,Δq = Quaternion(RotX+pi-0.4)))
3131

3232
xd=[[0;0.;0.5]]
33-
qd=[QuatRotation(RotX+pi))]
33+
qd=[Quaternion(RotX+pi))]
3434

3535
Q = [diagm(ones(12))*0.0]
3636
Q[1][7,7] = 1000.0

examples/lqr_sawyer.jl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# Currently somewhat broken
12
using ConstrainedDynamics
23
using ConstrainedDynamicsVis
34
using ConstrainedControl
@@ -8,12 +9,12 @@ path = "examples/examples_files/sawyer_arm.urdf"
89
mech = Mechanism(path, floating=false, g = 0.0)
910

1011
setPosition!(mech,mech.eqconstraints["right_j0"],[0.0])
11-
setPosition!(mech,mech.eqconstraints["right_j1"],[-pi/2])
12-
setPosition!(mech,mech.eqconstraints["right_j2"],[-pi/2])
13-
setPosition!(mech,mech.eqconstraints["right_j3"],[pi/2])
12+
setPosition!(mech,mech.eqconstraints["right_j1"],[0])
13+
setPosition!(mech,mech.eqconstraints["right_j2"],[0])
14+
setPosition!(mech,mech.eqconstraints["right_j3"],[0])
1415

15-
xd=[mech.bodies[i].state.xc for i=1:length(mech.bodies)]
16-
qd=[mech.bodies[i].state.qc for i=1:length(mech.bodies)]
16+
xd=[body.state.xc for body in mech.bodies]
17+
qd=[body.state.qc for body in mech.bodies]
1718

1819
setPosition!(mech,mech.eqconstraints["right_j0"],[0.0])
1920
setPosition!(mech,mech.eqconstraints["right_j1"],[0.0])
@@ -24,9 +25,9 @@ setPosition!(mech,mech.eqconstraints["right_j3"],[0.0])
2425
Q = [diagm(ones(12))*1000.0 for i=1:7]
2526
R = [ones(1,1) for i=1:7]
2627

27-
ConstrainedDynamics.deactivateConstraints!(mech)
28+
# ConstrainedDynamics.deactivateConstraints!(mech)
2829
lqr = LQR(mech, getid.(mech.bodies), getid.(mech.eqconstraints), Q, R, 20., xd=xd, qd=qd)
29-
ConstrainedDynamics.activateConstraints!(mech)
30+
# ConstrainedDynamics.activateConstraints!(mech)
3031

3132

3233
storage = simulate!(mech,20,lqr,record = true)

examples/pid_doublependulum.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ p2 = [0.0;0.0;length1 / 2] # joint connection point
1212

1313
# Initial orientation
1414
ϕ1 = 0
15-
q1 = QuatRotation(RotX(ϕ1))
15+
q1 = Quaternion(RotX(ϕ1))
1616
ϕ2 = 0
17-
q2 = QuatRotation(RotX(ϕ2))
17+
q2 = Quaternion(RotX(ϕ2))
1818

1919
# Links
2020
origin = Origin{Float64}()

examples/pid_pendulum.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ p2 = [0.0;0.0;length1 / 2] # joint connection point
1212

1313
# Initial orientation
1414
ϕ1 = 0
15-
q1 = QuatRotation(RotX(ϕ1))
15+
q1 = Quaternion(RotX(ϕ1))
1616

1717
# Links
1818
origin = Origin{Float64}()

examples/trackingLQR_triple_cartpole.jl

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ using ConstrainedDynamics
55
using ConstrainedDynamicsVis
66
using ConstrainedControl
77
using LinearAlgebra
8-
using Rotations
9-
using Rotations: rotation_error
108

119
# Trajectory Generation from U
1210

@@ -41,12 +39,12 @@ constraints = [joint1;joint2;joint3;joint4]
4139

4240
mech = Mechanism(origin, links, constraints, g=-9.81,Δt = 0.01)
4341
setPosition!(origin,cart,Δx = [0;0.0;0])
44-
setPosition!(cart,pole1,p2 = p2,Δq = QuatRotation(RotX+0)))
45-
setPosition!(pole1,pole2,p1 = -p2,p2 = p2,Δq = QuatRotation(RotX(0.)))
46-
setPosition!(pole2,pole3,p1 = -p2,p2 = p2,Δq = QuatRotation(RotX(0.)))
42+
setPosition!(cart,pole1,p2 = p2,Δq = Quaternion(RotX+0)))
43+
setPosition!(pole1,pole2,p1 = -p2,p2 = p2,Δq = Quaternion(RotX(0.)))
44+
setPosition!(pole2,pole3,p1 = -p2,p2 = p2,Δq = Quaternion(RotX(0.)))
4745

4846
function control!(mechanism, k)
49-
setForce!(mechanism, geteqconstraint(mechanism,5), [U[k]])
47+
setForce!(mechanism, joint1, [U[k]])
5048
end
5149

5250
steps = Base.OneTo(1000)
@@ -59,9 +57,9 @@ simulate!(mech,storage0,control!,record = true);
5957
# Tracking Control
6058

6159
setPosition!(origin,cart,Δx = [0;0.0;0])
62-
setPosition!(cart,pole1,p2 = p2,Δq = QuatRotation(RotX(0.)))
63-
setPosition!(pole1,pole2,p1 = -p2,p2 = p2,Δq = QuatRotation(RotX(0.)))
64-
setPosition!(pole2,pole3,p1 = -p2,p2 = p2,Δq = QuatRotation(RotX(0.)))
60+
setPosition!(cart,pole1,p2 = p2,Δq = Quaternion(RotX(0.)))
61+
setPosition!(pole1,pole2,p1 = -p2,p2 = p2,Δq = Quaternion(RotX(0.)))
62+
setPosition!(pole2,pole3,p1 = -p2,p2 = p2,Δq = Quaternion(RotX(0.)))
6563

6664
Q = [diagm(ones(12))*0.0 for i=1:4]
6765
Q[1][2,2] = 10
@@ -77,7 +75,6 @@ R = [ones(1,1)*0.1]
7775

7876
function owncontrol_trackinglqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::TrackingLQR{T,N}, k) where {T,Nn,Nb,N}
7977
Δz = zeros(T,Nb*12)
80-
qvm = QuatVecMap()
8178
for (id,body) in pairs(mechanism.bodies)
8279
colx = (id-1)*12+1:(id-1)*12+3
8380
colv = (id-1)*12+4:(id-1)*12+6
@@ -87,7 +84,9 @@ function owncontrol_trackinglqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::TrackingLQR
8784
state = body.state
8885
Δz[colx] = state.xsol[2]-lqr.xd[k][id]
8986
Δz[colv] = state.vsol[2]-lqr.vd[k][id]
90-
Δz[colq] = rotation_error(state.qsol[2],lqr.qd[k][id],qvm)
87+
# Δz[colq] = rotation_error(state.qsol[2],lqr.qd[k][id],qvm)
88+
qerr = lqr.qd[k][id]\state.qsol[2]
89+
Δz[colq] = imag(qerr) #* sign(qerr.s)
9190
Δz[colω] = state.ωsol[2]-lqr.ωd[k][id]
9291
end
9392

@@ -115,23 +114,23 @@ function owncontrol_trackinglqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::TrackingLQR
115114
return
116115
end
117116

118-
lqr = TrackingLQR(mech, storage0, [[[U[k]]] for k=1:1000], [5], Q, R, controlfunction = owncontrol_trackinglqr!)
117+
lqr = TrackingLQR(mech, storage0, [[[U[k]]] for k=1:1000], [joint1.id], Q, R, controlfunction = owncontrol_trackinglqr!)
119118

120119
function uncontrol!(mechanism, k)
121-
v1 = mechanism.bodies[1].state.vc[2]
122-
ω2 = mechanism.bodies[2].state.ωc[1]
123-
ω3 = mechanism.bodies[3].state.ωc[1] - ω2
124-
ω4 = mechanism.bodies[4].state.ωc[1] - ω2 - ω3
120+
v1 = cart.state.vc[2]
121+
ω2 = pole1.state.ωc[1]
122+
ω3 = pole2.state.ωc[1] - ω2
123+
ω4 = pole3.state.ωc[1] - ω2 - ω3
125124

126125
ucart = U[k] - sign(v1)*0.1*abs(v1) + randn()*2
127126
up2 = -sign(ω2)*0.1*abs(ω2)
128127
up3 = -sign(ω3)*0.1*abs(ω3)
129128
up4 = -sign(ω4)*0.1*abs(ω4)
130129

131-
setForce!(mechanism, geteqconstraint(mechanism,5), [ucart])
132-
setForce!(mechanism, geteqconstraint(mechanism,6), [up2])
133-
setForce!(mechanism, geteqconstraint(mechanism,7), [up3])
134-
setForce!(mechanism, geteqconstraint(mechanism,8), [up4])
130+
setForce!(mechanism, joint1, [ucart])
131+
setForce!(mechanism, joint2, [up2])
132+
setForce!(mechanism, joint3, [up3])
133+
setForce!(mechanism, joint4, [up4])
135134
end
136135

137136

src/ConstrainedControl.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
module ConstrainedControl
22

33
using ConstrainedDynamics
4-
using ConstrainedDynamics: svcat, szeros
4+
using ConstrainedDynamics: svcat, szeros, imag
55
using LinearAlgebra
66
using StaticArrays
7-
using Rotations
8-
using Rotations: rotation_error
97

108
export PID,
119
LQR,

src/control/lqr.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mutable struct LQR{T,N,NK} <: Controller
55

66
xd::Vector{SVector{3,Float64}}
77
vd::Vector{SVector{3,Float64}}
8-
qd::Vector{QuatRotation{T}}
8+
qd::Vector{Quaternion{T}}
99
ωd::Vector{SVector{3,Float64}}
1010

1111
eqcids::Vector{Integer}
@@ -50,7 +50,7 @@ mutable struct LQR{T,N,NK} <: Controller
5050
Q::Vector{<:AbstractMatrix{T}}, R::Vector{<:AbstractMatrix{T}}, horizon;
5151
xd::Vector{<:AbstractVector{T}} = [SA{T}[0; 0; 0] for i=1:Nb],
5252
vd::Vector{<:AbstractVector{T}} = [SA{T}[0; 0; 0] for i=1:Nb],
53-
qd::Vector{QuatRotation{T}} = [one(QuatRotation{T}) for i=1:Nb],
53+
qd::Vector{Quaternion{T}} = [one(Quaternion{T}) for i=1:Nb],
5454
ωd::Vector{<:AbstractVector{T}} = [SA{T}[0; 0; 0] for i=1:Nb],
5555
Fτd::Vector{<:AbstractVector{T}} = [SA{T}[0] for i=1:length(eqcids)],
5656
controlfunction::Function = control_lqr!
@@ -88,8 +88,7 @@ end
8888

8989
function control_lqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::LQR{T,N}, k) where {T,Nn,Nb,N}
9090
Δz = zeros(T,Nb*12)
91-
qvm = QuatVecMap()
92-
for (id,body) in pairs(mechanism.bodies)
91+
for (id,body) in enumerate(mechanism.bodies)
9392
colx = (id-1)*12+1:(id-1)*12+3
9493
colv = (id-1)*12+4:(id-1)*12+6
9594
colq = (id-1)*12+7:(id-1)*12+9
@@ -98,7 +97,9 @@ function control_lqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::LQR{T,N}, k) where {T,
9897
state = body.state
9998
Δz[colx] = state.xsol[2]-lqr.xd[id]
10099
Δz[colv] = state.vsol[2]-lqr.vd[id]
101-
Δz[colq] = rotation_error(state.qsol[2],lqr.qd[id],qvm)
100+
# Δz[colq] = rotation_error(state.qsol[2],lqr.qd[id],qvm)
101+
qerr = lqr.qd[id]\state.qsol[2]
102+
Δz[colq] = imag(qerr) #* sign(qerr.s)
102103
Δz[colω] = state.ωsol[2]-lqr.ωd[id]
103104
end
104105

@@ -114,8 +115,7 @@ end
114115

115116
function control_lqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::LQR{T,Inf}, k) where {T,Nn,Nb}
116117
Δz = zeros(T,Nb*12)
117-
qvm = QuatVecMap()
118-
for (id,body) in pairs(mechanism.bodies)
118+
for (id,body) in enumerate(mechanism.bodies)
119119
colx = (id-1)*12+1:(id-1)*12+3
120120
colv = (id-1)*12+4:(id-1)*12+6
121121
colq = (id-1)*12+7:(id-1)*12+9
@@ -124,7 +124,9 @@ function control_lqr!(mechanism::Mechanism{T,Nn,Nb}, lqr::LQR{T,Inf}, k) where {
124124
state = body.state
125125
Δz[colx] = state.xsol[2]-lqr.xd[id]
126126
Δz[colv] = state.vsol[2]-lqr.vd[id]
127-
Δz[colq] = rotation_error(state.qsol[2],lqr.qd[id],qvm)
127+
# Δz[colq] = rotation_error(state.qsol[2],lqr.qd[id],qvm)
128+
qerr = lqr.qd[id]\state.qsol[2]
129+
Δz[colq] = imag(qerr) #* sign(qerr.s)
128130
Δz[colω] = state.ωsol[2]-lqr.ωd[id]
129131
end
130132

0 commit comments

Comments
 (0)