Skip to content

Commit 5df1d9a

Browse files
committed
Add state_priority annotation, bound MTK, and format
1 parent b8b393c commit 5df1d9a

File tree

4 files changed

+36
-62
lines changed

4 files changed

+36
-62
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
1212

1313
[compat]
1414
IfElse = "0.1"
15-
ModelingToolkit = "8.24"
15+
ModelingToolkit = "8.26"
1616
OffsetArrays = "1"
1717
Symbolics = "4.9"
1818
julia = "1.6"

links.mp4

253 KB
Binary file not shown.

src/Mechanical/MultiBody2D/components.jl

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
function Link(; name, m, l, I, g, x1_0=0, y1_0=0)
1+
function Link(; name, m, l, I, g, x1_0 = 0, y1_0 = 0)
22
pars = @parameters begin
33
m = m
44
l = l
55
I = I
66
g = g
7-
x1_0=x1_0
8-
y1_0=y1_0
7+
x1_0 = x1_0
8+
y1_0 = y1_0
99
end
1010

1111
vars = @variables begin
12-
A(t) = 0
13-
dA(t) = 0
14-
ddA(t) = 0
12+
(A(t) = 0), [state_priority = 10]
13+
(dA(t) = 0), [state_priority = 10]
14+
(ddA(t) = 0), [state_priority = 10]
1515

1616
fx1(t) = 0
1717
fy1(t) = 0
@@ -21,20 +21,17 @@ function Link(; name, m, l, I, g, x1_0=0, y1_0=0)
2121

2222
x1(t) = x1_0
2323
dx1(t) = 0
24-
24+
2525
y1(t) = y1_0
2626
dy1(t) = 0
27-
2827

29-
x2(t) = l+x1_0
28+
x2(t) = l + x1_0
3029
dx2(t) = 0
31-
3230

3331
y2(t) = 0
3432
dy2(t) = 0
35-
3633

37-
x_cm(t) = l/2+x1_0
34+
x_cm(t) = l / 2 + x1_0
3835
dx_cm(t) = 0
3936
ddx_cm(t) = 0
4037

@@ -49,50 +46,38 @@ function Link(; name, m, l, I, g, x1_0=0, y1_0=0)
4946
@named TX2 = MechanicalPort()
5047
@named TY2 = MechanicalPort()
5148

52-
eqs = [
53-
D(A) ~ dA
49+
eqs = [D(A) ~ dA
5450
D(dA) ~ ddA
55-
5651
D(x1) ~ dx1
57-
5852
D(y1) ~ dy1
59-
6053
D(x2) ~ dx2
61-
6254
D(y2) ~ dy2
63-
6455
D(x_cm) ~ dx_cm
6556
D(dx_cm) ~ ddx_cm
66-
6757
D(y_cm) ~ dy_cm
6858
D(dy_cm) ~ ddy_cm
6959

70-
7160
# x forces
7261
m * ddx_cm ~ fx1 + fx2
7362

7463
# y forces
7564
m * ddy_cm ~ m * g + fy1 + fy2
7665

7766
# torques
78-
I * ddA ~ -fy1 * (x2 - x1)/2 + fy2 * (x2 - x1)/2 + fx1 * (y2 - y1)/2 - fx2 * (y2 - y1)/2
67+
I * ddA ~ -fy1 * (x2 - x1) / 2 + fy2 * (x2 - x1) / 2 + fx1 * (y2 - y1) / 2 -
68+
fx2 * (y2 - y1) / 2
7969

8070
# geometry
8171
x2 ~ l * cos(A) + x1
8272
y2 ~ l * sin(A) + y1
83-
84-
x_cm ~ l * cos(A)/2 + x1
85-
y_cm ~ l * sin(A)/2 + y1
86-
73+
x_cm ~ l * cos(A) / 2 + x1
74+
y_cm ~ l * sin(A) / 2 + y1
8775
TX1.f ~ fx1
8876
TX1.v ~ dx1
89-
9077
TY1.f ~ fy1
9178
TY1.v ~ dy1
92-
9379
TX2.f ~ fx2
9480
TX2.v ~ dx2
95-
9681
TY2.f ~ fy2
9782
TY2.v ~ dy2]
9883

test/Mechanical/multibody.jl

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -8,80 +8,70 @@ using Test
88
@parameters t
99

1010
@named link1 = Link(; m = 1, l = 10, I = 84, g = -9.807)
11-
@named link2 = Link(; m = 1, l = 10, I = 84, g = -9.807, x1_0=10)
11+
@named link2 = Link(; m = 1, l = 10, I = 84, g = -9.807, x1_0 = 10)
1212
@named cart = Mass(; m = 1, s_0 = 0)
1313
# @named force = SineForce(;amp=3e3, freq=15)
1414
@named fixed = Fixed()
1515
# @named m1 = Mass(;m=0.5)
1616
# @named m2 = Mass(;m=0.5)
1717

18-
eqs = [
19-
connect(link1.TX1, cart.flange) #, force.flange)
20-
connect(link1.TY1, fixed.flange)
21-
connect(link1.TX2, link2.TX1)
22-
connect(link1.TY2, link2.TY1)
23-
]
18+
eqs = [connect(link1.TX1, cart.flange) #, force.flange)
19+
connect(link1.TY1, fixed.flange)
20+
connect(link1.TX2, link2.TX1)
21+
connect(link1.TY2, link2.TY1)]
2422

2523
@named model = ODESystem(eqs, t, [], []; systems = [link1, link2, cart, fixed])
2624

27-
#TODO: This gives an error
2825
sys = structural_simplify(model)
2926

3027
# The below code does work...
3128
#=
32-
sys = expand_connections(model)
33-
@set! sys.eqs = [(typeof(eq.lhs) != ModelingToolkit.Connection) & !ModelingToolkit._iszero(eq.lhs) & !ModelingToolkit.isdifferential(eq.lhs) ? 0 ~ eq.rhs - eq.lhs : eq for eq in sys.eqs]
34-
35-
prob = ODEProblem(sys, [], (0.0, 20), []; jac = true)
36-
NEWTON = NLNewton(check_div = false, always_new = true, max_iter = 100, relax = 4 // 10)
37-
sol = solve(prob, ImplicitEuler(nlsolve = NEWTON), dt = 0.001, adaptive = false)
29+
unset_vars = setdiff(states(sys), keys(ModelingToolkit.defaults(sys)))
30+
prob = ODEProblem(sys, unset_vars .=> 0.0, (0.0, 20), []; jac = true)
31+
sol = solve(prob, Rodas5P())
3832
3933
@test sol[cart.s][end] ≈ 4.767 atol=1e-3
4034
4135
plot(sol, idxs = [cart.s])
4236
=#
4337

44-
4538
#=
4639
using CairoMakie
4740
f = Figure()
4841
a = Axis(f[1,1],xlabel="time [s]", ylabel="cart x pos. [m]")
4942
lines!(a, sol.t, sol[cart.s])
5043
f
5144
52-
53-
5445
function plot_link(sol, sys, tmax)
5546
tm = Observable(0.0)
5647
idx = Dict(reverse.(enumerate(states(sys))))
5748
5849
fig = Figure()
5950
a = Axis(fig[1,1], aspect=DataAspect(), )
6051
hidedecorations!(a)
61-
s = @lift(sol($tm))
52+
s = @lift(sol($tm, idxs=[link1.x1, link1.x2, link2.x1, link2.x2, link1.y1, link1.y2, link2.y1, link2.y2]))
6253
63-
m1x1 = @lift($s[idx[link1.x1]])
64-
m1x2 = @lift($s[idx[link1.x2]])
65-
m2x1 = @lift($s[idx[link2.x1]])
66-
m2x2 = @lift($s[idx[link2.x2]])
54+
m1x1 = @lift($s[1])
55+
m1x2 = @lift($s[2])
56+
m2x1 = @lift($s[3])
57+
m2x2 = @lift($s[4])
6758
68-
m1y1 = @lift($s[idx[link1.y1]])
69-
m1y2 = @lift($s[idx[link1.y2]])
70-
m2y1 = @lift($s[idx[link2.y1]])
71-
m2y2 = @lift($s[idx[link2.y2]])
59+
m1y1 = @lift($s[5])
60+
m1y2 = @lift($s[6])
61+
m2y1 = @lift($s[7])
62+
m2y2 = @lift($s[8])
7263
7364
sz1 = 0.5
7465
# lines!(a, [-sz1, sz1, sz1, -sz1, -sz1], @lift([$m1x1, $m1x1, $m1x1+sz1*2, $m1x1+sz1*2, $m1x1]))
7566
76-
7767
lines!(a, @lift([$m1x1, $m1x2]), @lift([$m1y1, $m1y2]), linewidth=10, color=:blue)
7868
lines!(a, @lift([$m2x1, $m2x2]), @lift([$m2y1, $m2y2]), linewidth=10, color=:red)
79-
69+
8070
CairoMakie.ylims!(a, -40, 20)
8171
CairoMakie.xlims!(a, -20, 40)
8272
8373
# a = Axis(fig[1, 1], xlabel="time [s]", ylabel="position [m]")
84-
# lines!(a, sol.t, sol[2,:])
74+
# lines!(a, sol.t, sol[2,:])
8575
# lines!(a, sol.t, sol[4,:])
8676
8777
# scatter!(a, tm, m1x)
@@ -91,12 +81,11 @@ function plot_link(sol, sys, tmax)
9181
framerate = 30
9282
timestamps = range(0, tmax, step=1/framerate)
9383
94-
9584
record(fig, "links.mp4", timestamps;
9685
framerate = framerate) do t
9786
tm[] = t
9887
end
99-
88+
10089
#=
10190
CairoMakie.Makie.Record(fig, timestamps; framerate=framerate) do t
10291
tm[] = t
@@ -108,4 +97,4 @@ end
10897
10998
plot_link(sol, sys, 20)
11099
111-
=#
100+
=#

0 commit comments

Comments
 (0)