You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mujoco技术咨询:能否为场景中的对象添加文本标签?

在MuJoCo Python中动态添加/修改对象文本标签的实现方法

可以实现,下面是两种实用的方案,无需依赖额外第三方库,直接基于MuJoCo的原生API完成:

方案一:利用Viewer自定义绘制回调(推荐)

MuJoCo的Viewer支持注册post_scene回调函数,在场景渲染完成后执行自定义绘制逻辑,我们可以借助这个机制,实时获取对象的世界坐标并绘制文本标签。

代码示例

import mujoco
import numpy as np

# 加载你的模型(替换为实际模型路径)
model = mujoco.MjModel.from_xml_path("your_scene.xml")
data = mujoco.MjData(model)
viewer = mujoco.viewer.launch_passive(model, data)

# 初始化标注配置:目标对象名称、初始文本
target_body_name = "your_target_body"
current_label = "Object Label"

def draw_text_label(scene):
    # 获取目标对象的ID与世界坐标
    body_id = model.body(target_body_name).id
    world_pos = data.xpos[body_id]
    # 将世界坐标转换为屏幕坐标
    screen_x, screen_y = viewer.cam.world2screen(world_pos, model, data)
    # 绘制文本(添加偏移避免与对象重叠)
    mujoco.mjr_text(
        current_label,
        mujoco.mjtFont.mjFONT_NORMAL,
        int(screen_x) + 15,
        int(screen_y) + 15,
        [1.0, 1.0, 1.0, 1.0],  # RGBA颜色(白色不透明)
        scene.contex
    )

# 注册回调函数
viewer.add_post_scene_callback(draw_text_label)

# 模拟循环:动态更新文本
while viewer.is_running():
    step_start = data.time
    # 按60Hz步进模拟
    while data.time - step_start < 1/60:
        mujoco.mj_step(model, data)
    # 动态修改文本(示例:显示当前模拟时间)
    current_label = f"Time: {data.time:.2f}"
    viewer.sync()

关键说明

  • 可以在模拟循环中随时修改current_label变量,实现文本的动态更新;
  • 通过调整screen_x和screen_y的偏移值,控制文本相对于对象的显示位置;
  • mjr_text支持切换字体(如mjFONT_TITLE)、调整颜色参数,满足不同视觉需求。

方案二:结合XML锚点绑定对象

如果需要文本严格跟随某个对象移动,可以先在XML中给目标对象添加一个透明的虚拟几何作为锚点,再基于锚点位置绘制文本,避免直接计算对象坐标的误差。

步骤1:修改XML模型

在目标对象的子节点中添加一个透明小球作为锚点:

<body name="target_body">
    <!-- 原有对象几何 -->
    <geom type="box" size="0.5 0.5 0.5" rgba="0.8 0.2 0.2 1"/>
    <!-- 透明锚点(用于定位文本) -->
    <body name="label_anchor" pos="0 0 0.6"> <!-- pos设置文本相对对象的偏移 -->
        <geom type="sphere" size="0.001" rgba="0 0 0 0"/>
    </body>
</body>

步骤2:修改回调逻辑

将方案一中的target_body_name替换为锚点的名称label_anchor,这样文本会自动跟随锚点(即目标对象)移动,无需手动调整偏移。

注意事项

  • 自定义渲染回调仅在Viewer启动后生效,若使用离线渲染(如mjr_render),需要在渲染循环中手动调用mjr_text;
  • 若需要批量标注多个对象,可以维护一个字典存储{对象名称: 文本内容},在回调中遍历绘制;
  • MuJoCo官方文档对这类自定义渲染细节确实覆盖较少,主要依赖对mjr_*系列渲染API的使用。

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:43:16