数学课学过,按逆时针方向旋转出的角度是正,反之,顺时针是负。那如何理解三维坐标系旋转的顺时针、逆时针:用右手坐标系,抽出(固定)旋转轴,按“x->y->z->x->y->...”前进的就是顺时针方向,反之是逆时针。举个例子,z是旋转轴,那抽出Z轴,前、后分别是y、x,即从x转到y的方向就是逆时针方向。设y是旋转轴,那抽出y轴,从z转到x的方向就是逆时针方向。
int test_node(bool& exit)
{
int argc = 0;
ros::init(argc, nullptr, "");
ros::CallbackQueue cbqueue;
tf2_ros::TransformBroadcaster br(&cbqueue);
geometry_msgs::TransformStamped transform;
transform.transform.translation.x = 0;
transform.transform.translation.y = 0;
transform.transform.translation.z = 1;
tf2::Quaternion q;
q.setRPY(-M_PI/4, -M_PI/6, M_PI/2);
transform.transform.rotation.x = q.x();
transform.transform.rotation.y = q.y();
transform.transform.rotation.z = q.z();
transform.transform.rotation.w = q.w();
transform.header.frame_id = "world";
transform.child_frame_id = "camera";
int k = 0;
while (!exit && ros::ok()) {
transform.header.stamp = ros::Time::now();
br.sendTransform(transform);
k ++;
SDL_Delay(1000);
}
return 0;
}打开rviz,按图1左侧设置。

在图1右侧,红色为x轴,绿色为y轴,蓝色为z轴。粗的(Radius=0.2)代表摄像头坐标系,细的(Radius=0.1)代表世界坐标系。图中经过三次旋转,为便为理解,让依次分析。第一次,只绕Z轴旋转。

绕Z轴旋转90度,角度是正表示逆时针方向,即在xoy平面,由x转到y,转90度。
有了绕Z轴旋转90度后的图像后,再绕Y轴旋转-30度。角度是负表示顺时针方向,即在zox平面,由x转到z,转30度。

有了q.setRPY(0, -M_PI/6, M_PI/2)图像后,再绕x轴旋转-45度。角度是负表示顺时针方向,即在yoz平面,由z转到y,转45度,就得到图1结果。