Skip to content

Incorrect "Bindings for parameters can only be functions of other parameters." #4112

@baggepinnen

Description

@baggepinnen
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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions