首页 > 解决方案 > 移动turtlebot_gazebo的麻烦

问题描述

我开始了一个小项目,我想在凉亭中移动turtlebot。我启动了: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 以了解它是如何通过输入完成的。但我找不到它的路径。那么我需要做些什么来移动它呢?我怎样才能找到节点的路径?

标签: c++geometrymoverosrobot

解决方案


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

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

}

推荐阅读