quaternion b = quaternion(orientation());
vector ang = b.eulerAngles(b);
Info<< " Euler angles: " << 180/3.14159265359*ang << endl; //- Print the angle vector
加入之后,输出就变为这样
6-DoF rigid body motion
Centre of rotation: (-0.5 0.449998563721 0.1)
Centre of mass: (-0.500001532453 0.449998563721 0.349999999995)
Orientation: (0.999999999981 0 -6.1298114399e-06 0 1 0 6.1298114399e-06 0 0.999999999981)
Linear velocity: (0 -5.227784072e-05 0)
Angular velocity: (0 -0.000462275194671 0)
Euler angles: (0 -0.000351212324719 0)
但这个代码是of2.4.x版本的,我现在用的是of1912,代码不兼容,我加入这个代码就编译出错。
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:333:33: error: no matching function for call to ‘Foam::quaternion::eulerAngles(Foam::quaternion&)’
vector ang = b.eulerAngles(b);//add
我不知道改怎么修改这个代码,希望有前辈能帮忙指点一下,谢谢各位
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C: In member function ‘void Foam::sixDoFRigidBodyMotion::status() const’: sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:340:35: error: no matching function for call to ‘Foam::quaternion::eulerAngles(Foam::quaternion&)’
vector ang = b.eulerAngles(b);
^
In file included from /root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/quaternion.H:317:0,
from /root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/septernion.H:48,
from sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:31:
/root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/quaternionI.H:407:21: note: candidate: Foam::vector Foam::quaternion::eulerAngles(Foam::quaternion::eulerOrder) const
inline Foam::vector Foam::quaternion::eulerAngles
^~~~
/root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/quaternionI.H:407:21: note: no known conversion for argument 1 from ‘Foam::quaternion’ to ‘Foam::quaternion::eulerOrder’
/root/OpenFOAM/OpenFOAM-v1912/wmake/rules/General/transform:34: recipe for target 'Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o' failed
make: *** [Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o] Error 1
下面则是我使用老师您给的代码,编译后出现的错误
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C: In member function ‘void Foam::sixDoFRigidBodyMotion::status() const’:
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:340:12: error: use of enum ‘eulerOrder’ without previous declaration
enum eulerOrder A;
^~~~~~~~~~
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:341:11: error: ‘ZXY’ was not declared in this scope
A = ZXY;
^~~
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:342:35: error: invalid conversion from ‘int’ to ‘Foam::quaternion::eulerOrder’ [-fpermissive]
vector ang = b.eulerAngles(A);
^
In file included from /root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/quaternion.H:317:0,
from /root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/septernion.H:48,
from sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:31:
/root/OpenFOAM/OpenFOAM-v1912/src/OpenFOAM/lnInclude/quaternionI.H:407:21: note: initializing argument 1 of ‘Foam::vector Foam::quaternion::eulerAngles(Foam::quaternion::eulerOrder) const’
inline Foam::vector Foam::quaternion::eulerAngles
^~~~
/root/OpenFOAM/OpenFOAM-v1912/wmake/rules/General/transform:34: recipe for target 'Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o' failed
make: *** [Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o] Error 1
然后我查看了一下0f1912的quaternion的代码,quaternion.C:
//- Euler-angle rotation order
enum eulerOrder : unsigned char
{
// Proper Euler angles
XZX, XYX, YXY, YZY, ZYZ, ZXZ,
// Tait-Bryan angles
XZY, XYZ, YXZ, YZX, ZYX, ZXY
};
//- The names for Euler-angle rotation order
static const Enum<eulerOrder> eulerOrderNames;
·
·
·
//- Construct from three Euler rotation angles
inline quaternion(const eulerOrder order, const vector& angles);
·
·
·
//- Return the Euler rotation angles corresponding to the
//- specified rotation order
inline vector eulerAngles(const eulerOrder order) const;
对比了一下of2.4.0的quaternion.C
//- Construct a quaternion given the three Euler angles
inline quaternion
(
const scalar angleX,
const scalar angleY,
const scalar angleZ
);
·
·
·
//- Return a vector of euler angles (rotations in radians about
// the x, y and z axes.
inline vector eulerAngles(const quaternion& q) const;
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C: In member function ‘void Foam::sixDoFRigidBodyMotion::status() const’:
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:333:5: error: ‘eulerOrder’ was not declared in this scope
eulerOrder A;
^~~~~~~~~~
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:334:5: error: ‘A’ was not declared in this scope
A = ZXY;
^
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:334:9: error: ‘ZXY’ was not declared in this scope
A = ZXY;
^~~
/root/OpenFOAM/OpenFOAM-v1812/wmake/rules/General/transform:34: recipe for target 'Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o' failed
make: *** [Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o] Error 1
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C: In member function ‘void Foam::sixDoFRigidBodyMotion::status() const’:
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:333:2: error: ‘eulerOrder’ was not declared in this scope
eulerOrder A;//add
^~~~~~~~~~
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:334:2: error: ‘A’ was not declared in this scope
A = ZXY;//add
^
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:334:6: error: ‘ZXY’ was not declared in this scope
A = ZXY;//add
^~~
/root/OpenFOAM/OpenFOAM-v1812/wmake/rules/General/transform:34: recipe for target 'Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o' failed
make: *** [Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o] Error 1
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C: In member function ‘void Foam::sixDoFRigidBodyMotion::status() const’:
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:325:5: error: ‘rotationSequence’ was not declared in this scope
rotationSequence A(ZXY);
^~~~~~~~~~~~~~~~
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:325:5: note: suggested alternative: ‘rotationTensorX’
rotationSequence A(ZXY);
^~~~~~~~~~~~~~~~
rotationTensorX
sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.C:332:64: error: ‘A’ was not declared in this scope
<< " Euler angles: " << quaternion(orientation()).eulerAngles(A)
^
/root/OpenFOAM/OpenFOAM-v1812/wmake/rules/General/transform:34: recipe for target 'Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o' failed
make: *** [Make/linux64GccDPInt32Opt/sixDoFRigidBodyMotion/sixDoFRigidBodyMotionAngle.o] Error 1