using ModelingToolkit
using Multibody
import ModelingToolkit: t_nounits as t, D_nounits as D
import ModelingToolkitStandardLibrary.Mechanical.Rotational
using OrdinaryDiffEq
@component function DyadBot3DWheels(; name)
pars = @parameters begin
body_height = 0.1#, [description = "Height of body above wheel axle"]
track = 0.13#, [description = "Distance between wheels"]
wheel_radius = 0.04
body_mass = 0.1
wheel_mass = 0.05
wheel_I_axis = 5e-5
wheel_I_long = 1e-5
d_wheel = 0.1, [description = "Wheel rotational damping coefficient"]
end
systems = @named begin
world = World()
# Two individual rolling wheels (allows tilting)
wheel_left = SlippingWheel(
radius = wheel_radius,
m = wheel_mass,
I_axis = wheel_I_axis,
I_long = wheel_I_long,
state = false,
)
wheel_right = SlippingWheel(
radius = wheel_radius,
m = wheel_mass,
I_axis = wheel_I_axis,
I_long = wheel_I_long,
# iscut = true, # Avoid over-constraining
state = true,
)
# Revolute joints for wheel spin
revolute_left = Revolute(n = [0, 0, 1], axisflange = true, phi0=0, w0=0)
revolute_right = Revolute(n = [0, 0, 1], axisflange = true, phi0=0, w0=0)
# Axis connecting wheels
rod_left = FixedTranslation(r = [0, 0, track/2])
rod_right = FixedTranslation(r = [0, 0, -track/2])
# Axis body (small mass at center)
axis_body = Body(m = 0.01, r_cm = [0, 0, 0])
# Main body extending upward
body = BodyShape(
m = body_mass,
I_22 = 0.01*0.03^2,
I_11 = 0.01*0.05^2,
I_33 = 0.01*0.05^2,
r = [0, body_height, 0],
)
# Rotational damping for wheel joints
damper_left = Rotational.Damper(d = d_wheel)
damper_right = Rotational.Damper(d = d_wheel)
end
eqs = [
# Connect wheels to revolute joints
connect(wheel_left.frame_a, revolute_left.frame_b)
connect(wheel_right.frame_a, revolute_right.frame_b)
# Connect revolute joints to axis via rods
connect(revolute_left.frame_a, rod_left.frame_b)
connect(revolute_right.frame_a, rod_right.frame_b)
# Connect rods to axis center
connect(rod_left.frame_a, axis_body.frame_a)
connect(rod_right.frame_a, axis_body.frame_a)
# Connect body to axis center
connect(axis_body.frame_a, body.frame_a)
# Connect dampers to wheel revolute joints
connect(damper_left.flange_a, revolute_left.axis)
connect(damper_left.flange_b, revolute_left.support)
connect(damper_right.flange_a, revolute_right.axis)
connect(damper_right.flange_b, revolute_right.support)
]
System(eqs, t, [], pars; systems, name)
end
@named model_wheels = DyadBot3DWheels()
julia> @named model_wheels = DyadBot3DWheels()
ERROR: ArgumentError: Bindings for parameters can only be functions of other parameters. For parameter r, encountered binding SymbolicUtils.array_literal((3,), 0, 0, track / 2) which contains non-parameter symbolics Set(SymbolicUtils.BasicSymbolicImpl.var"typeof(BasicSymbolicImpl)"{SymReal}[track]). If you intended r to be a discrete variable, pass it as an unknown of the system.
Stacktrace:
[1] check_bindings(atomic_ps::ModelingToolkitBase.AtomicArraySet{…}, bindings::ModelingToolkitBase.AtomicArrayDict{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/x7JKa/src/utils.jl:307
[2] check_bindings(ps::Vector{…}, bindings::ModelingToolkitBase.AtomicArrayDict{…})
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/x7JKa/src/utils.jl:269
[3] System(eqs::Vector{…}, iv::Num, dvs::Vector{…}, ps::Vector{…}, brownians::Vector{…}; constraints::Vector{…}, noise_eqs::Nothing, jumps::Vector{…}, costs::Vector{…}, consolidate::Function, observed::Vector{…}, bindings::ModelingToolkitBase.AtomicArrayDict{…}, initial_conditions::ModelingToolkitBase.AtomicArrayDict{…}, guesses::ModelingToolkitBase.AtomicArrayDict{…}, systems::Vector{…}, initialization_eqs::Vector{…}, continuous_events::Vector{…}, discrete_events::Vector{…}, connector_type::Nothing, assertions::Dict{…}, metadata::Base.ImmutableDict{…}, gui_metadata::Nothing, is_dde::Nothing, tstops::Any, inputs::OrderedCollections.OrderedSet{…}, outputs::OrderedCollections.OrderedSet{…}, tearing_state::Nothing, ignored_connections::Nothing, parent::Nothing, description::String, name::Symbol, discover_from_metadata::Bool, initializesystem::Nothing, is_initializesystem::Bool, is_discrete::Bool, preface::Any, checks::Bool, __legacy_defaults__::Nothing)
@ ModelingToolkitBase ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/system.jl:500
[4] macro expansion
@ ~/.julia/dev/Multibody/src/components.jl:273 [inlined]
[5] (::Multibody.var"#60#61")()
@ Multibody ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2593
[6] FixedTranslation(; name::Symbol, r::Vector{Num}, radius::Float32, color::Vector{Float32}, render::Bool)
@ Multibody ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2593
[7] macro expansion
@ ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2425 [inlined]
[8] macro expansion
@ ~/.julia/dev/DyadBotComponents/src/segway_3d.jl:80 [inlined]
[9] (::var"#72#73")()
@ Main ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2593
[10] DyadBot3DWheels(; name::Symbol)
@ Main ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2593
[11] top-level scope
@ ~/.julia/packages/ModelingToolkitBase/x7JKa/src/systems/abstractsystem.jl:2425
Some type information was truncated. Use `show(err)` to see complete types.