我想要实现的目标是在 z 轴上缓慢旋转无人机,当它检测到物体时它将停止旋转。第一个节点发布字符串“Searching”,第二个节点订阅它。因此,每次收到“搜索”时,无人机都必须旋转。
- Ubuntu 18.04
- ROS旋律
- PX4 固件
- 蟒蛇 3.6
我在一篇用 C++ 编写的论文中阅读了部分代码,但我不太擅长,我使用 python。想请教各位大神,能不能给点提示。我想在 python 中实现下面的代码。
ros::Duration d(0.5);
geometry_msgs::PoseStamped cmd;
cmd.pose.position.x = 0.0;
cmd.pose.position.y = 0.0;
cmd.pose.position.z = 2.0;
cmd.pose.orientation.x = 0.0;
cmd.pose.orientation.y = 0.0;
cmd.pose.orientation.z = 0.0;
cmd.pose.orientation.w = 1.0;
Eigen::Affine3d t;
ROS_INFO("Searching target...");
while (ros::ok() )
{
if (c == 'q' || rc < 0)
break;
tf::poseMsgToEigen (cmd.pose, t);
t.rotate (Eigen::AngleAxisd (M_PI/10.0, Eigen::Vector3d::UnitZ()));
// AngleAxisf (angle1 , Vector3f::UnitZ())
tf::poseEigenToMsg(t, cmd.pose);
nav->SetPoint(cmd);
ros::spinOnce();
d.sleep();
}
我对 C++ 不太熟悉,但我在旋转无人机的代码中理解的是,它cmd = PoseStamped
作为输入,然后将旋转应用于该位置(旋转矩阵),并且该旋转矩阵的结果是发布为姿势。这是对的吗?
我正在向pose.orientation.z发送较小的位置目标以0.0到2pi,增量为0.1来旋转无人机,但它旋转得太快并且没有保持其x,y位置......这是代码:
if data.data == "Searching" and self.yawVal < two_pi:
rVal, pVal = 0, 0
pose.position.x = 0
pose.position.y = 0
pose.position.z = 1.6
quat = quaternion_from_euler(rVal, pVal, self.yawVal)
pose.orientation.x = quat[0]
pose.orientation.y = quat[1]
pose.orientation.z = quat[2]
pose.orientation.w = quat[3]
pub.publish(pose)
self.yawVal += 0.1
else:
self.yawVal = 0
我意识到这不是一个好方法,因为无人机旋转得如此之快,如果我添加睡眠,无人机将无法识别物体,因为它旋转得很快。是否可以将 C++ 代码转换为 python?