Skip to content

Commit 4e62b78

Browse files
Fix frame measurement and force&torque application functions
- Correct syntax for omitted arguments. - Correct dot product in measFrameDistVelocity.
1 parent 735e716 commit 4e62b78

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed

src/Composition/frameForceTorque.jl

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Apply torque vector `torque` resolved in frame `frameCoord` at frame `frameApply
55
66
If `frameCoord` is omitted `torque` is resolved in absolute coordinates.
77
"""
8-
function applyFrameTorque!(frameApply::Object3D, torque::SVector{3,Float64}; frameCoord::Object3D)
8+
function applyFrameTorque!(frameApply::Object3D, torque::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
99
if !isnothing(frameCoord)
1010
torque_abs = frameCoord.R_abs' * torque # World_torque := R_CoordWorld^T * Coord_torque
1111
else
@@ -23,7 +23,7 @@ Apply force vector `force` resolved in frame `frameCoord` at origin of frame `fr
2323
2424
If `frameCoord` is omitted `force` is resolved in absolute coordinates.
2525
"""
26-
function applyFrameForce!(frameApply::Object3D, force::SVector{3,Float64}; frameCoord::Object3D)
26+
function applyFrameForce!(frameApply::Object3D, force::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
2727
if !isnothing(frameCoord)
2828
force_abs = frameCoord.R_abs' * force # World_force := R_CoordWorld^T * Coord_force
2929
else
@@ -41,9 +41,9 @@ Apply force and torque vectors `force` and `torque` resolved in frame `frameCoor
4141
4242
If `frameCoord` is omitted `force` and `torque` are resolved in absolute coordinates.
4343
"""
44-
function applyFrameForceTorque!(frameApply::Object3D, force::SVector{3,Float64}, torque::SVector{3,Float64}; frameCoord::Object3D)
45-
applyFrameForce!(frameApply, force; frameCoord)
46-
applyFrameTorque!(frameApply, torque; frameCoord)
44+
function applyFrameForceTorque!(frameApply::Object3D, force::SVector{3,Float64}, torque::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
45+
applyFrameForce!(frameApply, force; frameCoord=frameCoord)
46+
applyFrameTorque!(frameApply, torque; frameCoord=frameCoord)
4747
return nothing
4848
end
4949

@@ -55,9 +55,9 @@ Apply torque vector `torque` resolved in frame `frameCoord` at origins of frames
5555
5656
If `frameCoord` is omitted torque` is resolved in absolute coordinates.
5757
"""
58-
function applyFrameTorquePair!(frameMeas::Object3D, frameOrig::Object3D, torque::SVector{3,Float64}; frameCoord::Object3D)
59-
applyFrameTorque!(frameMeas, -torque; frameCoord)
60-
applyFrameTorque!(frameOrig, torque; frameCoord)
58+
function applyFrameTorquePair!(frameMeas::Object3D, frameOrig::Object3D, torque::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
59+
applyFrameTorque!(frameMeas, -torque; frameCoord=frameCoord)
60+
applyFrameTorque!(frameOrig, torque; frameCoord=frameCoord)
6161
return nothing
6262
end
6363

@@ -70,11 +70,11 @@ In addition a compensation torque is applied at frame `frameOrig` to satisfy tor
7070
7171
If `frameCoord` is omitted `torque` is resolved in absolute coordinates.
7272
"""
73-
function applyFrameForcePair!(frameMeas::Object3D, frameOrig::Object3D, force::SVector{3,Float64}; frameCoord::Object3D)
74-
applyFrameForce!(frameMeas, -force; frameCoord)
75-
applyFrameForce!(frameOrig, force; frameCoord)
76-
r_OrigMeas = measFramePosition(frameMeas; frameOrig, frameCoord)
77-
applyFrameTorque!(frameOrig, cross(r_OrigMeas, force); frameCoord) # Coord_t := Coord_r_OrigMeas x Coord_force
73+
function applyFrameForcePair!(frameMeas::Object3D, frameOrig::Object3D, force::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
74+
applyFrameForce!(frameMeas, -force; frameCoord=frameCoord)
75+
applyFrameForce!(frameOrig, force; frameCoord=frameCoord)
76+
r_OrigMeas = measFramePosition(frameMeas; frameOrig=frameOrig, frameCoord=frameCoord)
77+
applyFrameTorque!(frameOrig, cross(r_OrigMeas, force); frameCoord=frameCoord) # Coord_t := Coord_r_OrigMeas x Coord_force
7878
return nothing
7979
end
8080

@@ -87,8 +87,8 @@ In addition a compensation torque is applied at frame `frameOrig` to satisfy tor
8787
8888
If `frameCoord` is omitted `force` and `torque` are resolved in absolute coordinates.
8989
"""
90-
function applyFrameForceTorquePair!(frameMeas::Object3D, frameOrig::Object3D, force::SVector{3,Float64}; frameCoord::Object3D)
91-
applyFrameTorquePair!(frameMeas, frameOrig, torque; frameCoord)
92-
applyFrameForcePair!(frameMeas, frameOrig, force; frameCoord)
90+
function applyFrameForceTorquePair!(frameMeas::Object3D, frameOrig::Object3D, force::SVector{3,Float64}; frameCoord::Union{Object3D, Nothing}=nothing)
91+
applyFrameTorquePair!(frameMeas, frameOrig, torque; frameCoord=frameCoord)
92+
applyFrameForcePair!(frameMeas, frameOrig, force; frameCoord=frameCoord)
9393
return nothing
9494
end

src/Composition/frameMeasurements.jl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ If `frameOrig` is omitted `r` represents the absolute position of `frameMeas`.
2323
2424
If `frameCoord` is omitted `r` is resolved in absolute coordinates.
2525
"""
26-
function measFramePosition(frameMeas::Object3D; frameOrig::Object3D, frameCoord::Object3D)
26+
function measFramePosition(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing, frameCoord::Union{Object3D, Nothing}=nothing)
2727
r_OrigMeas = copy(frameMeas.r_abs) # World_r_OrigMeas := World_r_WorldMeas
2828
if !isnothing(frameOrig)
2929
r_OrigMeas = r_OrigMeas - frameOrig.r_abs # World_r_OrigMeas := World_r_OrigMeas - World_r_WorldOrig
@@ -42,8 +42,8 @@ Return distance `d` and normalized direction vector `n` from origin of frame `fr
4242
4343
If `frameOrig` is omitted `d` and `n` represent the distance from world frame to `frameMeas`.
4444
"""
45-
function measFrameDistance(frameMeas::Object3D; frameOrig::Object3D)
46-
r_OrigMeas = measFramePosition(frameMeas; frameOrig)
45+
function measFrameDistance(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing)
46+
r_OrigMeas = measFramePosition(frameMeas; frameOrig=frameOrig)
4747
d_OrigMeas = norm(r_OrigMeas)
4848
if d_OrigMeas > 1.0e-32
4949
n_OrigMeas = r_OrigMeas / d_OrigMeas
@@ -63,7 +63,7 @@ If `frameOrig` is omitted `w` represents the absolute rotational velocity of `fr
6363
6464
If `frameCoord` is omitted `w` is resolved in absolute coordinates.
6565
"""
66-
function measFrameRotVelocity(frameMeas::Object3D; frameOrig::Object3D, frameCoord::Object3D)
66+
function measFrameRotVelocity(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing, frameCoord::Union{Object3D, Nothing}=nothing)
6767
w_OrigMeas = frameMeas.R_abs' * copy(frameMeas.w) # World_w_WorldMeas := R_MeasWorld^T * Meas_w_WorldMeas
6868
if !isnothing(frameOrig)
6969
w_OrigMeas = w_OrigMeas - (frameOrig.R_abs' * frameOrig.w) # World_w_OrigMeas := World_w_WorldMeas - R_OrigWorld^T * Orig_w_WorldOrig
@@ -86,13 +86,13 @@ If `frameCoord` is omitted `v` is resolved in absolute coordinates.
8686
8787
If `frameObsrv` is omitted `v` is observed in world frame.
8888
"""
89-
function measFrameTransVelocity(frameMeas::Object3D; frameOrig::Object3D, frameCoord::Object3D, frameObsrv::Object3D)
89+
function measFrameTransVelocity(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing, frameCoord::Union{Object3D, Nothing}=nothing, frameObsrv::Union{Object3D, Nothing}=nothing)
9090
v_OrigMeas = copy(frameMeas.v0) # World_v_OrigMeas := World_v_WorldMeas
9191
if !isnothing(frameOrig)
9292
v_OrigMeas = v_OrigMeas - frameOrig.v0 # World_v_OrigMeas := World_v_WorldMeas - World_v_WorldOrig
9393
end
9494
if !isnothing(frameObsrv)
95-
r_OrigMeas = measFramePosition(frameMeas; frameOrig)
95+
r_OrigMeas = measFramePosition(frameMeas; frameOrig=frameOrig)
9696
w_WorldObsrv = measFrameRotVelocity(frameObsrv)
9797
v_OrigMeas = v_OrigMeas - cross(w_WorldObsrv, r_OrigMeas) # World_v_OrigMeas := World_v_OrigMeas - World_w_WorldObsrv x World_r_OrigMeas
9898
end
@@ -110,10 +110,10 @@ Return distance velocity `dd` between origin of frame `frameOrig` and origin of
110110
111111
If `frameOrig` is omitted `dd` represents the distance velocity between world frame and `frameMeas`.
112112
"""
113-
function measFrameDistVelocity(frameMeas::Object3D; frameOrig::Object3D)
114-
(d_OrigMeas, n_OrigMeas) = measFrameDistance(frameMeas; frameOrig)
115-
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig)
116-
dd_OrigMeas = n_OrigMeas * v_OrigMeas
113+
function measFrameDistVelocity(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing)
114+
(d_OrigMeas, n_OrigMeas) = measFrameDistance(frameMeas; frameOrig=frameOrig)
115+
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig=frameOrig)
116+
dd_OrigMeas = dot(n_OrigMeas, v_OrigMeas)
117117
return dd_OrigMeas
118118
end
119119

@@ -129,13 +129,13 @@ If `frameCoord` is omitted `wd` is resolved in absolute coordinates.
129129
130130
If `frameObsrv` is omitted `wd` is observed in world frame.
131131
"""
132-
function measFrameRotAcceleration(frameMeas::Object3D; frameOrig::Object3D, frameCoord::Object3D, frameObsrv::Object3D)
132+
function measFrameRotAcceleration(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing, frameCoord::Union{Object3D, Nothing}=nothing, frameObsrv::Union{Object3D, Nothing}=nothing)
133133
wd_OrigMeas = frameMeas.R_abs' * copy(frameMeas.z) # World_wd_WorldMeas := R_MeasWorld^T * Meas_wd_WorldMeas
134134
if !isnothing(frameOrig)
135135
wd_OrigMeas = wd_OrigMeas - (frame.Orig.R_abs' * frameOrig.z) # World_wd_OrigMeas := World_wd_WorldMeas - R_OrigWorld^T * Orig_wd_WorldOrig
136136
end
137137
if !isnothing(frameObsrv)
138-
w_OrigMeas = measFrameRotVelocity(frameMeas; frameOrig)
138+
w_OrigMeas = measFrameRotVelocity(frameMeas; frameOrig=frameOrig)
139139
w_WorldObsrv = measFrameRotVelocity(frameObsrv)
140140
wd_OrigMeas = wd_OrigMeas - cross(w_WorldObsrv, w_OrigMeas) # World_wd_OrigMeas := World_wd_OrigMeas - World_w_WorldObsrv x World_w_OrigMeas
141141
end
@@ -157,14 +157,14 @@ If `frameCoord` is omitted `a` is resolved in absolute coordinates.
157157
158158
If `frameObsrv` is omitted `a` is observed in world frame.
159159
"""
160-
function measFrameTransAcceleration(frameMeas::Object3D; frameOrig::Object3D, frameCoord::Object3D, frameObsrv::Object3D)
160+
function measFrameTransAcceleration(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing, frameCoord::Union{Object3D, Nothing}=nothing, frameObsrv::Union{Object3D, Nothing}=nothing)
161161
a_OrigMeas = copy(frameMeas.a0) # World_a_OrigMeas := World_a_WorldMeas
162162
if !isnothing(frameOrig)
163163
a_OrigMeas = a_OrigMeas - frameOrig.a0 # World_a_OrigMeas := World_a_WorldMeas - World_a_WorldOrig
164164
end
165165
if !isnothing(frameObsrv)
166-
r_OrigMeas = measFramePosition(frameMeas; frameOrig)
167-
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig)
166+
r_OrigMeas = measFramePosition(frameMeas; frameOrig=frameOrig)
167+
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig=frameOrig)
168168
w_WorldObsrv = measFrameRotVelocity(frameObsrv)
169169
wd_WorldObsrv = measFrameRotAcceleration(frameObsrv)
170170
a_OrigMeas = a_OrigMeas # World_a_OrigMeas := World_a_OrigMeas
@@ -186,16 +186,16 @@ Return distance acceleration `ddd` between origin of frame `frameOrig` and origi
186186
187187
If `frameOrig` is omitted `ddd` represents the distance acceleration between world frame and `frameMeas`.
188188
"""
189-
function measFrameDistAcceleration(frameMeas::Object3D; frameOrig::Object3D)
189+
function measFrameDistAcceleration(frameMeas::Object3D; frameOrig::Union{Object3D, Nothing}=nothing)
190190
# (n * v)d = n*vd + nd*v
191191
# = n*a + [r/d]d*v
192192
# = n*a + [(v*d - r*dd)/(d*d)]*v
193193
# = n*a + v*v/d - (r*v)*(n*v)/(d*d)
194194
# = n*a + v*v/d - (n*v)*(n*v)/d
195195
# = n*a + (v*v - dd*dd)/d
196-
(d_OrigMeas, n_OrigMeas) = measFrameDistance(frameMeas; frameOrig)
197-
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig)
198-
a_OrigMeas = measFrameTransAcceleration(frameMeas; frameOrig)
196+
(d_OrigMeas, n_OrigMeas) = measFrameDistance(frameMeas; frameOrig=frameOrig)
197+
v_OrigMeas = measFrameTransVelocity(frameMeas; frameOrig=frameOrig)
198+
a_OrigMeas = measFrameTransAcceleration(frameMeas; frameOrig=frameOrig)
199199
dd_OrigMeas = n_OrigMeas * v_OrigMeas
200200
ddd_OrigMeas = n_OrigMeas * a_OrigMeas
201201
if d_OrigMeas > 1.0e-32

0 commit comments

Comments
 (0)