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

OMPL中四元数数值趋近于0的原因排查求助

OMPL中SO3状态四元数读取异常问题

我正在修改OMPL的RigidBodyPlanningWithControls示例为3D版本(无关ROS2内容),需要基于四元数构建状态传播器,但通过以下代码读取四元数值时:

state->as<ob::SO3StateSpace::StateType>()->x
state->as<ob::SO3StateSpace::StateType>()->y
state->as<ob::SO3StateSpace::StateType>()->z
state->as<ob::SO3StateSpace::StateType>()->w

得到的数值极小,例如:[w:6.81217e-310, x:6.81217e-310, y:0, z:1.82804e-322]。将其转换为欧拉角后全为[0,0,0],导致车辆无法旋转。

为何这些四元数未归一化为1?我是否遗漏了关键步骤?


补充信息:状态设置与规划流程

设置起始和目标状态时,我尝试了两种方式:
第一种手动赋值:

(*start.get())[0] = X;
(*start.get())[1] = Y;
(*start.get())[2] = 1.0;
Quaternion quat = Euler2Quaternion(0.0, 0.0, YAW);
(*start.get())[3] = quat.w;
(*start.get())[4] = quat.x;
(*start.get())[5] = quat.y;
(*start.get())[6] = quat.z;

第二种随机生成:

(*start.get()).random();

通过planner->getProblemDefinition()->print(std::cout);输出可见,起始和目标状态均设置正确:

Start states:
Compound state [
RealVectorState [13.7817 7.57301 2.44067]
SO3State [-0.597399 -0.378351 0.425209 0.564944]

Goal state, threshold = 0.1, memory address = 0x7245b41b70e0, state = 
Compound state [
RealVectorState [-12.9914 16.6172 7.2046]
SO3State [0.719305 0.43711 -0.241913 -0.482715]
]

随后调用planner->ob::Planner::solve(10.0)求解问题,使用的是OMPL的RRT规划器(对应源码第97行)。程序立即执行自定义的有效性检查,此时平移向量(X,Y,Z)正常,但四元数变为之前所示的极小值。这说明问题出在状态设置与有效性检查之间,规划器似乎无法正确读取ob::ScopedState类型起始/目标状态的四元数部分。


补充:手动归一化尝试的结果

我尝试用以下函数手动归一化四元数:

void normalizeQuaternion(Quaternion* quat)
{
  std::cout << "Q0: " << quat->w << ", " << quat->x << ", " << quat->y << ", " << quat->z << "]\n";
  double sqx = 0, sqy = 0, sqz = 0, sqw = 0;
  if (quat->x != 0)
    sqx = quat->x * quat->x;
  if (quat->y != 0)
    sqy = quat->y * quat->y;
  if (quat->z != 0)
    sqz = quat->z * quat->z;
  if (quat->w != 0)
    sqw = quat->w * quat->w;
  double N = sqrt(sqx + sqy + sqz + sqw);
  std::cout << "W " << sqw << " X " << sqx << " Y " << sqy << " Z " << sqz << " N " << N << std::endl;
  quat->x = quat->x / N;
  quat->y = quat->y / N;
  quat->z = quat->z / N;
  quat->w = quat->w / N;
  std::cout << "Q1: " << quat->w << ", " << quat->x << ", " << quat->y << ", " << quat->z << "]\n";
}

得到如下输出:

Q0: 6.13293e-310, 6.13293e-310, 0, 1.82804e-322]
W 0 X 0 Y 0 Z 0 N 0
Q1: inf, inf, -nan, inf]

内容的提问来源于stack exchange,提问作者Daniel Bajo Collados

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:40:07