Skip to content

Commit 79b2489

Browse files
fine-grain sensor connections
1 parent 61f19a3 commit 79b2489

3 files changed

Lines changed: 41 additions & 24 deletions

File tree

src/Mechanical/PlanarMechanics/PlanarMechanics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ include("joints.jl")
2424

2525
export AbsolutePosition,
2626
RelativePosition, AbsoluteVelocity, RelativeVelocity, AbsoluteAcceleration,
27-
RelativeAcceleration
27+
RelativeAcceleration, connect_sensor
2828
include("sensors.jl")
2929
end

src/Mechanical/PlanarMechanics/sensors.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ Measure absolute position and orientation (same as Sensors.AbsolutePosition, but
138138
x.u ~ r[1],
139139
y.u ~ r[2],
140140
phi.u ~ r[3],
141+
frame_a.fx ~ 0,
142+
frame_a.fy ~ 0,
143+
frame_a.j ~ 0,
141144
]
142145

143146
return compose(ODESystem(eqs, t, [], []; name = name),
@@ -244,6 +247,12 @@ Measure relative position and orientation between the origins of two frame conne
244247
rel_x.u ~ r[1],
245248
rel_y.u ~ r[2],
246249
rel_phi.u ~ r[3],
250+
frame_a.fx ~ 0,
251+
frame_a.fy ~ 0,
252+
frame_a.j ~ 0,
253+
frame_b.fx ~ 0,
254+
frame_b.fy ~ 0,
255+
frame_b.j ~ 0,
247256
]
248257

249258
return compose(ODESystem(eqs, t, [], []; name = name),
@@ -709,6 +718,9 @@ end
709718
connect(pos.frame_a, frame_a),
710719
connect(zero_pos.frame_resolve, pos.frame_resolve),
711720
connect(transform_absolute_vector.frame_a, frame_a),
721+
frame_a.fx ~ 0,
722+
frame_a.fy ~ 0,
723+
frame_a.j ~ 0,
712724
]
713725

714726
if resolve_in_frame == :frame_resolve
@@ -784,3 +796,12 @@ end
784796

785797
return compose(ODESystem(eqs, t, [], []; name = name), systems...)
786798
end
799+
800+
function connect_sensor(component_frame, sensor_frame)
801+
# TODO: make this an override of the `connect` method
802+
return [
803+
component_frame.x ~ sensor_frame.x,
804+
component_frame.y ~ sensor_frame.y,
805+
component_frame.phi ~ sensor_frame.phi,
806+
]
807+
end

test/Mechanical/planar_mechanics.jl

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,7 @@ end
7979
connect(fixed.frame, revolute.frame_a),
8080
connect(revolute.frame_b, fixed_translation.frame_a),
8181
connect(fixed_translation.frame_b, body.frame),
82-
connect(abs_pos_sensor.frame_a, body.frame),
83-
# TODO: the following equations shouldn't be necessary
84-
body.ω ~ revolute.ω,
85-
fixed.frame.fy ~ -body.fy,
86-
fixed.frame.fx ~ -body.fx,
82+
connect_sensor(abs_pos_sensor.frame_a, body.frame)...,
8783
]
8884

8985
@named model = ODESystem(eqs,
@@ -98,7 +94,8 @@ end
9894
abs_pos_sensor,
9995
])
10096
sys = structural_simplify(model)
101-
prob = ODEProblem(sys, [0.0], tspan, []; jac = true)
97+
u0 = [0.0, ω, 0.0]
98+
prob = ODEProblem(sys, u0, tspan, []; jac = true)
10299
sol = solve(prob, Rodas5P())
103100

104101
# phi
@@ -135,22 +132,21 @@ end
135132
@named rel_a_sensor2 = RelativeAcceleration(; resolve_in_frame)
136133

137134
connections = [
138-
connect(body1.frame, abs_pos_sensor.frame_a),
139-
connect(abs_v_sensor.frame_a, body1.frame),
140-
connect(abs_a_sensor.frame_a, body1.frame),
141-
connect(rel_pos_sensor1.frame_a, body1.frame),
142-
connect(rel_v_sensor1.frame_a, body1.frame),
143-
connect(rel_pos_sensor1.frame_b, base.frame),
144-
connect(rel_v_sensor1.frame_b, base.frame),
145-
connect(rel_pos_sensor2.frame_b, body1.frame),
146-
connect(rel_v_sensor2.frame_b, body1.frame),
147-
connect(rel_pos_sensor2.frame_a, body2.frame),
148-
connect(rel_v_sensor2.frame_a, body2.frame),
149-
connect(rel_a_sensor1.frame_a, body1.frame),
150-
connect(rel_a_sensor1.frame_b, base.frame),
151-
connect(rel_a_sensor2.frame_a, body1.frame),
152-
connect(rel_a_sensor2.frame_b, body2.frame),
153-
[s ~ 0 for s in (body1.phi, body2.phi, body1.fx, body1.fy, body2.fx, body2.fy)]...,
135+
connect_sensor(body1.frame, abs_pos_sensor.frame_a)...,
136+
connect_sensor(body1.frame, abs_v_sensor.frame_a)...,
137+
connect_sensor(body1.frame, abs_a_sensor.frame_a)...,
138+
connect_sensor(body1.frame, rel_pos_sensor1.frame_a)...,
139+
connect_sensor(base.frame, rel_pos_sensor1.frame_b)...,
140+
connect_sensor(body1.frame, rel_pos_sensor2.frame_a)...,
141+
connect_sensor(body2.frame, rel_pos_sensor2.frame_b)...,
142+
connect_sensor(base.frame, rel_v_sensor1.frame_a)...,
143+
connect_sensor(body1.frame, rel_v_sensor1.frame_b)...,
144+
connect_sensor(body1.frame, rel_v_sensor2.frame_a)...,
145+
connect_sensor(body2.frame, rel_v_sensor2.frame_b)...,
146+
connect_sensor(body1.frame, rel_a_sensor1.frame_a)...,
147+
connect_sensor(base.frame, rel_a_sensor1.frame_b)...,
148+
connect_sensor(body1.frame, rel_a_sensor2.frame_a)...,
149+
connect_sensor(body2.frame, rel_a_sensor2.frame_b)...,
154150
]
155151

156152
@named model = ODESystem(connections,
@@ -195,7 +191,7 @@ end
195191

196192
# velocity after t seconds v = g * t, so the relative y-velocity between body1 and the base is
197193
# equal to the absolute y-velocity of body1
198-
@test sol[abs_v_sensor.v_y.u][end] -sol[rel_v_sensor1.rel_v_y.u][end] g * tspan[end]
194+
@test sol[abs_v_sensor.v_y.u][end] sol[rel_v_sensor1.rel_v_y.u][end] g * tspan[end]
199195

200196
# the relative y-velocity between body1 and body2 is zero
201197
@test sol[rel_v_sensor2.rel_v_y.u][end] == 0

0 commit comments

Comments
 (0)