🔋 驱动器(Actuator)#

驱动器 (Actuator) 是控制机器人关节运动的核心组件,MotrixSim 支持多种类型的驱动器。

每个驱动器都可以配置不同的类型和参数,以适应不同的应用场景。 驱动器可以是马达、位置控制器、速度控制器或通用控制器等。它们通过设置目标位置、速度或其他参数来实现对机器人的精确控制。

现支持的驱动器类型有:

类型

解释

马达(Motor)

用于驱动机器人的关节,提供基本的运动能力。

位置(Position)

精确控制关节的角度或位置。

速度(Velocity)

控制关节的运动速度。

通用(General)

提供更灵活的控制方式,可以根据需要自定义控制策略。

设置可兼容 MuJoCo actuator 的参数。

General 部分属性未支持,参照 支持列表

驱动器示例#

首先加载模型 model 并通过 model.get_actuator 方法获取指定的 Actuator,参数可以是驱动器的名称或索引。 然后通过 actuator.set_ctrl 方法设置控制目标值。

索引与文件中定义顺序一致,可通过 model.actuator_names 方法获取所有驱动器的名称列表。

以下是涵盖上述所有内容的完整代码脚本:

# Copyright (C) 2020-2025 Motphys Technology Co., Ltd. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

import time

from motrixsim import SceneData, load_model, step
from motrixsim.render import RenderApp

# Mouse controls:
# - Press and hold left button then drag to rotate the camera/view
# - Press and hold right button then drag to pan/translate the view


def main():
    # Create render window for visualization
    with RenderApp() as render:
        # The scene description file
        path = "examples/assets/actuator.xml"
        # Load the scene model
        model = load_model(path)
        # Create the render instance of the model
        render.launch(model)
        # Create the physics data of the model
        data = SceneData(model)

        # ----------Try to access actuators----------
        # How many actuators are in the model?
        num_actuators = model.num_actuators
        print(f"num_actuators is : {num_actuators}")
        # The name list of actuators
        actuator_names = model.actuator_names
        print(f"actuator_names is : {actuator_names}")
        # The control range of actuators
        actuator_ctrl_limits = model.actuator_ctrl_limits
        print(f"actuator_ctrl_limits is : {actuator_ctrl_limits}")

        # Get actuator_A index in model
        actuator_A_index = model.get_actuator_index("actuator_A")
        # Get actuator_A by the way with index
        actuator_A = model.get_actuator(actuator_A_index)
        print(f"actuator_A by index name is : {actuator_A.name}")
        # Get actuator_A by the way with name
        actuator_A = model.get_actuator("actuator_A")
        # Get other actuators
        actuator_B = model.get_actuator("actuator_B")
        actuator_C = model.get_actuator("actuator_C")

        # Look at the actuators' index
        print(
            f"actuator_A index is :{actuator_A.index}, actuator_B index is :{actuator_B.index}, "
            f"actuator_C index is : {actuator_C.index}"
        )

        # Look at the actuators' control range
        actuator_A_ctrl_range = actuator_A.ctrl_range
        actuator_B_ctrl_range = actuator_B.ctrl_range
        actuator_C_ctrl_range = actuator_C.ctrl_range
        print(f"actuator_A_ctrl_range is : {actuator_A_ctrl_range}")
        print(f"actuator_B_ctrl_range is : {actuator_B_ctrl_range}")
        print(f"actuator_C_ctrl_range is : {actuator_C_ctrl_range}")

        start = time.time()
        flip = False
        print_count = 0

        while True:
            # Control the step interval to prevent too fast simulation
            time.sleep(0.02)

            if time.time() - start > 1.5:
                actuator_A.set_ctrl(data, 1.0 if flip else -1.0)
                actuator_C.set_ctrl(data, 0.5 if flip else -0.5)
                flip = not flip
                start = time.time()

            if print_count < 200:
                ctrls = model.get_actuator_ctrls(data)
                print(f"actuator_ctrls is :{ctrls}")
                print_count += 1

            # Physics world step
            step(model, data)
            # Sync render objects from physic world
            render.sync(data)


if __name__ == "__main__":
    main()