麻烦移动turtlebot_gazebo

时间:2018-08-16 13:14:30

标签: c++ geometry move ros robot

我开始了一个小项目,我想将乌龟机器人移到凉亭中。我启动了:roslaunch turtlebot_gazebo turtlebot_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来找出输入是如何完成的。但是我找不到通往它的道路。那么,我该怎么做才能移动它?以及如何找到该节点的路径?

2 个答案:

答案 0 :(得分:2)

您发布的主题和参数错误。

1-启动乌龟机器人后,从另一个终端输入“ rostopic list”,然后查找包含cmd_vel或cmd_vel_mux的主题。如果没有cmd_vel_mux,则只发布cmd_vel,否则发布cmd_vel_mux / input之一。

2-对于Turtlebot的线性运动,只有x起作用。

我的运动学中的示例节点:

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();
    }

}

答案 1 :(得分:0)

对于Turtlebot,您有发布线性速度-x,y和z以及角速度-x,y和z的主题。您需要了解的是这些物理含义。

x中的线速度将使其向前移动。

z中的角速度将使其绕自身旋转。

其他参数没有任何作用。 因此,在您的代码中,使用上述2个参数将移动机器人。其余参数不会以任何方式影响机器人。