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

plant.set_velocities(...)无作用,机器人模型初始速度设置异常

问题排查与解决方案

针对你在Drake中设置机器人主体初始速度后无运动的问题,可从以下几个方向排查:

1. 缺失仿真推进步骤

设置完初始状态后,必须启动仿真循环让系统状态演进。仅修改Context不会自动产生运动,需添加仿真执行代码,例如:

Simulator<double> simulator(*diagram, std::move(root_context));
simulator.AdvanceTo(5.0); // 推进仿真到5秒时刻

2. 速度索引匹配错误

plant.num_velocities()返回的是整个机器人系统的速度维度,自由刚体的速度通常占据前6个索引(线速度x/y/z对应0/1/2,角速度roll/pitch/yaw对应3/4/5)。若你的模型中main_body不是根刚体,索引会偏移。建议直接通过刚体获取对应的速度索引:

const RigidBody<double>& main_body = plant.GetBodyByName("main_body");
const auto& indices = plant.GetBodyVelocities(main_body);
Eigen::VectorXd velocity = Eigen::VectorXd::Zero(plant.num_velocities());
velocity[indices[3]] = 10; // 角速度roll
velocity[indices[4]] = 10; // 角速度pitch
plant.SetVelocities(&plant_context, velocity);

3. SetFreeBodySpatialVelocity参数问题

注释中的方法需确保body_indices[0]是正确的模型实例索引(若你的plant是多实例模型),如果是单实例模型,可省略第二个参数:

plant.SetFreeBodySpatialVelocity(
    &plant_context, 
    plant.GetBodyByName("main_body"),
    SpatialVelocity<double>{Vector3d::Zero(), Vector3d(10.0, 10.0, 0.0)} // 仅设置角速度
);

同时需确认修改后的plant_context已正确关联到root_context——GetMyMutableContextFromRoot返回的是子context,修改后root_context会自动同步,但需确保后续仿真使用的是这个root_context。

4. 检查刚体是否真的是自由体

确认main_body的自由度是否已正确配置为6自由度(自由刚体),若被固定到世界或其他刚体,设置速度也不会产生运动。可通过以下代码验证:

std::cout << "main_body is free? " << main_body.is_free() << std::endl;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:01:14