数学课学过,按逆时针方向旋转出的角度是正,反之,顺时针是负。那如何理解三维坐标系旋转的顺时针、逆时针:用右手坐标系,抽出(固定)旋转轴,按“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结果。