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
相关产品推荐
相关产品推荐

