2

我正在尝试为 TurtleBot 编程,但机器人教程严重缺乏,我无法编写自己的 C++ 工作。我正在尝试使用另一个机器人的教程,只是为了让机器人在按下键时移动。

源教程在这里找到:,我只是将发布主题修改为“/cmd_vel”

#include <iostream>

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

class RobotDriver
{
private:
  //! The node handle we'll be using
  ros::NodeHandle nh_;
  //! We will be publishing to the "/base_controller/command" topic to issue commands
  ros::Publisher cmd_vel_pub_;

public:
  //! ROS node initialization
  RobotDriver(ros::NodeHandle &nh)
  {
    nh_ = nh;
    //set up the publisher for the cmd_vel topic
    cmd_vel_pub_ = nh_.advertise<geometry_msgs::Twist>("/cmd_vel", 1);
  }

  //! Loop forever while sending drive commands based on keyboard input
  bool driveKeyboard()
  {
    std::cout << "Type a command and then press enter.  "
      "Use '+' to move forward, 'l' to turn left, "
      "'r' to turn right, '.' to exit.\n";

    //we will be sending commands of type "twist"
    geometry_msgs::Twist base_cmd;

    char cmd[50];
    while(nh_.ok()){

      std::cin.getline(cmd, 50);
      if(cmd[0]!='+' && cmd[0]!='l' && cmd[0]!='r' && cmd[0]!='.')
      {
        std::cout << "unknown command:" << cmd << "\n";
        continue;
      }

      base_cmd.linear.x = base_cmd.linear.y = base_cmd.angular.z = 0;   
      //move forward
      if(cmd[0]=='+'){
        base_cmd.linear.x = 0.25;
      } 
      //turn left (yaw) and drive forward at the same time
      else if(cmd[0]=='l'){
        base_cmd.angular.z = 0.75;
        base_cmd.linear.x = 0.25;
      } 
      //turn right (yaw) and drive forward at the same time
      else if(cmd[0]=='r'){
        base_cmd.angular.z = -0.75;
        base_cmd.linear.x = 0.25;
      } 
      //quit
      else if(cmd[0]=='.'){
        break;
      }

      //publish the assembled command
      cmd_vel_pub_.publish(base_cmd);
    }
    return true;
  }

};

int main(int argc, char** argv)
{
  //init the ROS node
  ros::init(argc, argv, "robot_driver");
  ros::NodeHandle nh;

  RobotDriver driver(nh);
  driver.driveKeyboard();
}

代码可以正确编译和运行,但是发出命令时,turtlebot 不会移动。任何想法为什么?

附加信息:

当我使用 Turtlebot 随附的笔记本电脑时,消息似乎没有被发送(或没有被传递)。在单独的终端中,我有:

turtlebot@turtlebot-0516:~$ sudo service turtlebot start
[sudo] password for turtlebot:
turtlebot start/running, process 1470
turtlebot@turtlebot-0516:~$ rostopic echo /cmd_vel

turtlebot@turtlebot-0516:~$ rostopic pub /cmd_vel geometry_msgs/Twist '[1.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
publishing and latching message. Press ctrl-C to terminate

有信息:

turtlebot@turtlebot-0516:~$ rostopic info /cmd_vel
Type: geometry_msgs/Twist

Publishers:
 * /rosttopic_2547_1352476947372 (http://turtlebot-0516:40275/)

Subscribers:
 * /turtlebot_node (http://10.143.7.81:58649/)
 * /rostopic_2278_1352476884936 (http://turtlebot-0516:39291/)

根本没有回声的输出。

4

3 回答 3

1

我知道这篇文章现在已经有一千年的历史了,但我让这段代码运行没有问题。我必须使用 ncurses 库让它运行,而不必在输入每个字符后按回车键。

只是想我会让每个人都知道这确实有效。:PI 推动了 iRobot 使用它进行创作。

于 2014-06-12T18:01:05.730 回答
0

为刚入门的人写了一篇关于TurtleBot 的 Hello World教程。

对于其他任何为了让这个工作而努力工作的人。

更改/cmd_velcmd_vel_mux/input/teleop

我在用着:

  • 靛青
  • 海龟机器人2
于 2014-10-03T22:35:53.187 回答
0

您可以尝试sudo service turtlebot stop停止自动初始设置,然后roslaunch turtlebot bringup minimal.launch只运行您需要的最小设置。然后,您可以尝试roslaunch turtlebot_teleop keyboard_teleop.launch使用带键盘的遥控操作。

于 2014-08-22T15:14:30.627 回答