我开始了一个小项目,我想在凉亭中移动海龟机器人。我启动了:roslaunchturtlebot_gazeboturtlebot_world.launch
我写了一个代码来移动它:
#include "ros/ros.h"
#include "geometry_msgs/TwistWithCovariance.h"
#include "nav_msgs/Odometry.h"
#include "gazebo_msgs/LinkState.h"
#include "geometry_msgs/Twist.h"
int main(int argc, char **argv){
ros::init(argc,argv,"move");
ros::NodeHandle n;
ros::Publisher move_pub = n.advertise<geometry_msgs::Twist>("moving",1000);
ros::Rate loop_rate(10);
geometry_msgs::Twist msg;
while(ros::ok()){
msg.linear.x = 0.0;
msg.linear.y = 0.0;
msg.linear.z = 20.0;
move_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
这行不通。正如你所看到的,我添加了其他消息并尝试了它们,但我得到了相同的结果。我还尝试找到节点turtlebot_teleop_keyboard以了解它是如何通过输入完成的。但我找不到它的路径。那么我需要做什么才能移动它呢?我怎样才能找到节点的路径?
您发布到错误的主题和错误的参数。
1-启动turtlebot后,从另一个终端输入“rostopic list”并查找包含cmd_vel或cmd_vel_mux的主题。如果没有 cmd_vel_mux 就发布 cmd_vel,否则发布 cmd_vel_mux/input 之一。
2- 对于 Turtlebot 的线性运动,只有 x 有影响。
我的 ros-kinetic 中的示例节点:
int main(int argc, char **argv)
{
ros::init(argc,argv,"move");
ros::NodeHandle n;
ros::Publisher move_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/navi",1000);
ros::Rate loop_rate(10);
geometry_msgs::Twist msg;
while(ros::ok())
{
// linear velocity
msg.linear.x = 1.0;
msg.linear.y = 0.0;
msg.linear.z = 0.0;
// angular velocity
msg.angular.x = 0.0;
msg.angular.y = 0.0;
msg.angular.z = 0.0;
move_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
对于 Turtlebot,您有发布线速度 - x、y 和 z 以及角速度 - x、y 和 z 的主题。您需要了解的是它们各自的物理含义。
x 方向的线速度将使其向前移动。
z 方向的角速度会使其自行转动。
其他参数没有任何作用。 因此,在您的代码中,使用上述 2 个参数将移动机器人。其余参数不会以任何方式影响机器人。