ROS探索总结(八)—— 键盘控制

44447
53
2016年2月19日 22时15分

       如果尝试过前面的例子,有没有感觉每次让机器人移动还要在终端里输入指令,这也太麻烦了,有没有办法通过键盘来控制机器人的移动呢?答案室当然的了。我研究了其他几个机器人键盘控制的代码,还是有所收获的,最后移植到了smartcar上,实验成功。

一、创建控制包

        首先,我们为键盘控制单独建立一个包:

 

roscreate-pkg smartcar_teleop rospy geometry_msgs std_msgs roscpp  
rosmake

 

        如果你已经忘记了怎么建立包,请参考:http://www.ros.org/wiki/ROS/Tutorials/CreatingPackage

二、简单的消息发布

        在机器人仿真中,主要控制机器人移动的就是Twist()结构,如果我们编程将这个结构通过程序发布成topic,自然就可以控制机器人了。我们先用简单的python来尝试一下。
        之前的模拟中,我们使用的都是在命令行下进行的消息发布,现在我们需要把这些命令转换成python代码,封装到一个单独的节点中去。针对之前的命令行,我们可以很简单的在smartcar_teleop /scripts文件夹下编写如下的控制代码:
#!/usr/bin/env python  
import roslib; roslib.load_manifest('smartcar_teleop')  
import rospy  
from geometry_msgs.msg import Twist  
from std_msgs.msg import String  
  
class Teleop:  
    def __init__(self):  
        pub = rospy.Publisher('cmd_vel', Twist)  
        rospy.init_node('smartcar_teleop')  
        rate = rospy.Rate(rospy.get_param('~hz', 1))  
        self.cmd = None  
      
        cmd = Twist()  
        cmd.linear.x = 0.2  
        cmd.linear.y = 0  
        cmd.linear.z = 0  
        cmd.angular.z = 0  
        cmd.angular.z = 0  
        cmd.angular.z = 0.5  
  
        self.cmd = cmd  
        while not rospy.is_shutdown():  
            str = "hello world %s" % rospy.get_time()  
            rospy.loginfo(str)  
            pub.publish(self.cmd)  
            rate.sleep()  
  
if __name__ == '__main__':Teleop()

 

       python代码在ROS中是不需要编译的。先运行之前教程中用到的smartcar机器人,在rviz中进行显示,然后新建终端,输入如下命令:
       rosrun smartcar_teleop teleop.py 

        也可以建立一个launch文件运行:

<launch>  
  <arg name="cmd_topic" default="cmd_vel" />  
  <node pkg="smartcar_teleop" type="teleop.py" name="smartcar_teleop">  
    <remap from="cmd_vel" to="$(arg cmd_topic)" />  
  </node>  
</launch>

 

        在rviz中看一下机器人是不是动起来了!

三、加入键盘控制

        当然前边的程序不是我们要的,我们需要的键盘控制。

1、移植

        因为ROS的代码具有很强的可移植性,所以用键盘控制的代码其实可以直接从其他机器人包中移植过来,在这里我主要参考的是erratic_robot,在这个机器人的代码中有一个erratic_teleop包,可以直接移植过来使用。
首先,我们将其中src文件夹下的keyboard.cpp代码文件直接拷贝到我们smartcar_teleop包的src文件夹下,然后修改CMakeLists.txt文件,将下列代码加入文件底部:
rosbuild_add_boost_directories()  
rosbuild_add_executable(smartcar_keyboard_teleop src/keyboard.cpp)  
target_link_libraries(smartcar_keyboard_teleop boost_thread)

 

        编译完成后,运行smartcar模型。重新打开一个终端,打开键盘控制节点:
ROS探索总结(八)—— 键盘控制插图
       
        在终端中按下键盘里的“W”、“S”、“D”、“A”以及“Shift”键进行机器人的控制。效果如下图:
ROS探索总结(八)—— 键盘控制插图(1)

2、复用

       因为代码是我们直接复制过来的,其中有很多与之前erratic机器人相关的变量,我们把代码稍作修改,变成自己机器人可读性较强的代码。
#include <termios.h>  
#include <signal.h>  
#include <math.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/poll.h>  
  
#include <boost/thread/thread.hpp>  
#include <ros/ros.h>  
#include <geometry_msgs/Twist.h>  
  
#define KEYCODE_W 0x77  
#define KEYCODE_A 0x61  
#define KEYCODE_S 0x73  
#define KEYCODE_D 0x64  
  
#define KEYCODE_A_CAP 0x41  
#define KEYCODE_D_CAP 0x44  
#define KEYCODE_S_CAP 0x53  
#define KEYCODE_W_CAP 0x57  
  
class SmartCarKeyboardTeleopNode  
{  
    private:  
        double walk_vel_;  
        double run_vel_;  
        double yaw_rate_;  
        double yaw_rate_run_;  
          
        geometry_msgs::Twist cmdvel_;  
        ros::NodeHandle n_;  
        ros::Publisher pub_;  
  
    public:  
        SmartCarKeyboardTeleopNode()  
        {  
            pub_ = n_.advertise<geometry_msgs::Twist>("cmd_vel", 1);  
              
            ros::NodeHandle n_private("~");  
            n_private.param("walk_vel", walk_vel_, 0.5);  
            n_private.param("run_vel", run_vel_, 1.0);  
            n_private.param("yaw_rate", yaw_rate_, 1.0);  
            n_private.param("yaw_rate_run", yaw_rate_run_, 1.5);  
        }  
          
        ~SmartCarKeyboardTeleopNode() { }  
        void keyboardLoop();  
          
        void stopRobot()  
        {  
            cmdvel_.linear.x = 0.0;  
            cmdvel_.angular.z = 0.0;  
            pub_.publish(cmdvel_);  
        }  
};  
  
SmartCarKeyboardTeleopNode* tbk;  
int kfd = 0;  
struct termios cooked, raw;  
bool done;  
  
int main(int argc, char** argv)  
{  
    ros::init(argc,argv,"tbk", ros::init_options::AnonymousName | ros::init_options::NoSigintHandler);  
    SmartCarKeyboardTeleopNode tbk;  
      
    boost::thread t = boost::thread(boost::bind(&SmartCarKeyboardTeleopNode::keyboardLoop, &tbk));  
      
    ros::spin();  
      
    t.interrupt();  
    t.join();  
    tbk.stopRobot();  
    tcsetattr(kfd, TCSANOW, &cooked);  
      
    return(0);  
}  
  
void SmartCarKeyboardTeleopNode::keyboardLoop()  
{  
    char c;  
    double max_tv = walk_vel_;  
    double max_rv = yaw_rate_;  
    bool dirty = false;  
    int speed = 0;  
    int turn = 0;  
      
    // get the console in raw mode  
    tcgetattr(kfd, &cooked);  
    memcpy(&raw, &cooked, sizeof(struct termios));  
    raw.c_lflag &=~ (ICANON | ECHO);  
    raw.c_cc[VEOL] = 1;  
    raw.c_cc[VEOF] = 2;  
    tcsetattr(kfd, TCSANOW, &raw);  
      
    puts("Reading from keyboard");  
    puts("Use WASD keys to control the robot");  
    puts("Press Shift to move faster");  
      
    struct pollfd ufd;  
    ufd.fd = kfd;  
    ufd.events = POLLIN;  
      
    for(;;)  
    {  
        boost::this_thread::interruption_point();  
          
        // get the next event from the keyboard  
        int num;  
          
        if ((num = poll(&ufd, 1, 250)) < 0)  
        {  
            perror("poll():");  
            return;  
        }  
        else if(num > 0)  
        {  
            if(read(kfd, &c, 1) < 0)  
            {  
                perror("read():");  
                return;  
            }  
        }  
        else  
        {  
            if (dirty == true)  
            {  
                stopRobot();  
                dirty = false;  
            }  
              
            continue;  
        }  
          
        switch(c)  
        {  
            case KEYCODE_W:  
                max_tv = walk_vel_;  
                speed = 1;  
                turn = 0;  
                dirty = true;  
                break;  
            case KEYCODE_S:  
                max_tv = walk_vel_;  
                speed = -1;  
                turn = 0;  
                dirty = true;  
                break;  
            case KEYCODE_A:  
                max_rv = yaw_rate_;  
                speed = 0;  
                turn = 1;  
                dirty = true;  
                break;  
            case KEYCODE_D:  
                max_rv = yaw_rate_;  
                speed = 0;  
                turn = -1;  
                dirty = true;  
                break;  
                  
            case KEYCODE_W_CAP:  
                max_tv = run_vel_;  
                speed = 1;  
                turn = 0;  
                dirty = true;  
                break;  
            case KEYCODE_S_CAP:  
                max_tv = run_vel_;  
                speed = -1;  
                turn = 0;  
                dirty = true;  
                break;  
            case KEYCODE_A_CAP:  
                max_rv = yaw_rate_run_;  
                speed = 0;  
                turn = 1;  
                dirty = true;  
                break;  
            case KEYCODE_D_CAP:  
                max_rv = yaw_rate_run_;  
                speed = 0;  
                turn = -1;  
                dirty = true;  
                break;                
            default:  
                max_tv = walk_vel_;  
                max_rv = yaw_rate_;  
                speed = 0;  
                turn = 0;  
                dirty = false;  
        }  
        cmdvel_.linear.x = speed * max_tv;  
        cmdvel_.angular.z = turn * max_rv;  
        pub_.publish(cmdvel_);  
    }  
}
参考链接:http://ros.org/wiki/turtlebot_teleop/Tutorials/Teleoperation
http://www.ros.org/wiki/simulator_gazebo/Tutorials/TeleopErraticSimulation

3、创新

        虽然很多机器人的键盘控制使用的都是C++编写的代码,但是考虑到python的强大,我们还是需要尝试使用python来编写程序。
首先需要理解上面C++程序的流程。在上面的程序中,我们单独创建了一个线程来读取中断中的输入,然后根据输入发布不同的速度和角度消息。介于线程的概念还比较薄弱,在python中使用循环替代线程。然后需要考虑的只是如何使用python来处理中断中的输入字符,通过上网查找资料,发现使用的API和C++的基本是一致的。最终的程序如下:
#!/usr/bin/env python  
# -*- coding: utf-8 -*  
  
import  os  
import  sys  
import  tty, termios  
import roslib; roslib.load_manifest('smartcar_teleop')  
import rospy  
from geometry_msgs.msg import Twist  
from std_msgs.msg import String  
  
# 全局变量  
cmd = Twist()  
pub = rospy.Publisher('cmd_vel', Twist)  
  
def keyboardLoop():  
    #初始化  
    rospy.init_node('smartcar_teleop')  
    rate = rospy.Rate(rospy.get_param('~hz', 1))  
  
    #速度变量  
    walk_vel_ = rospy.get_param('walk_vel', 0.5)  
    run_vel_ = rospy.get_param('run_vel', 1.0)  
    yaw_rate_ = rospy.get_param('yaw_rate', 1.0)  
    yaw_rate_run_ = rospy.get_param('yaw_rate_run', 1.5)  
  
    max_tv = walk_vel_  
    max_rv = yaw_rate_  
  
    #显示提示信息  
    print "Reading from keyboard"  
    print "Use WASD keys to control the robot"  
    print "Press Caps to move faster"  
    print "Press q to quit"  
  
    #读取按键循环  
    while not rospy.is_shutdown():  
        fd = sys.stdin.fileno()  
        old_settings = termios.tcgetattr(fd)  
        #不产生回显效果  
        old_settings[3] = old_settings[3] & ~termios.ICANON & ~termios.ECHO  
        try :  
            tty.setraw( fd )  
            ch = sys.stdin.read( 1 )  
        finally :  
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)  
  
        if ch == 'w':  
            max_tv = walk_vel_  
            speed = 1  
            turn = 0  
        elif ch == 's':  
            max_tv = walk_vel_  
            speed = -1  
            turn = 0  
        elif ch == 'a':  
            max_rv = yaw_rate_  
            speed = 0  
            turn = 1  
        elif ch == 'd':  
            max_rv = yaw_rate_  
            speed = 0  
            turn = -1  
        elif ch == 'W':  
            max_tv = run_vel_  
            speed = 1  
            turn = 0  
        elif ch == 'S':  
            max_tv = run_vel_  
            speed = -1  
            turn = 0  
        elif ch == 'A':  
            max_rv = yaw_rate_run_  
            speed = 0  
            turn = 1  
        elif ch == 'D':  
            max_rv = yaw_rate_run_  
            speed = 0  
            turn = -1  
        elif ch == 'q':  
            exit()  
        else:  
            max_tv = walk_vel_  
            max_rv = yaw_rate_  
            speed = 0  
            turn = 0  
  
        #发送消息  
        cmd.linear.x = speed * max_tv;  
        cmd.angular.z = turn * max_rv;  
        pub.publish(cmd)  
        rate.sleep()  
        #停止机器人  
        stop_robot();  
  
def stop_robot():  
    cmd.linear.x = 0.0  
    cmd.angular.z = 0.0  
    pub.publish(cmd)  
  
if __name__ == '__main__':  
    try:  
        keyboardLoop()  
    except rospy.ROSInterruptException:  
        pass
参考链接:http://blog.csdn.net/marising/article/details/3173848
http://nullege.com/codes/search/termios.ICANON

四、节点关系图

ROS探索总结(八)—— 键盘控制插图(2)

 

        代码包我已上传:http://download.csdn.net/detail/hcx25909/5496381
        希望大家一同学习,共同进步!

 

发表评论

后才能评论

评论列表(53条)

  • z6hnq_6050 2020年7月21日 下午3:43

    请问 第二步已经消息发布成功了 但在rviz中小车没有动是什么情况

  • 方远 2019年8月12日 上午9:03

    胡师兄好,我是11级huster~我平时使用anaconda3,另外创立了虚拟环境py27、想在py27中操作ROS。此前一切正常,但是在本文中“三、1”部分无法完成编译,显示
    (py27) fyo@fyo-Lenovo:~/catkin_ws$ rosmake smartcar_teleop
    bla bla bla
    [rosbuild] Building package smartcar_teleop
    Failed to invoke /opt/ros/kinetic/bin/rospack deps-manifests smartcar_teleop
    ImportError: No module named rosdep2.rospack
    [rospack] Error: could not find python module ‘rosdep2.rospack’. is rosdep up-to-date (at least 0.10.4)?
    CMake Error at /opt/ros/kinetic/share/ros/core/rosbuild/public.cmake:129 (message):
    Failed to invoke rospack to get compile flags for package
    ‘smartcar_teleop’. Look above for errors from rospack itself. Aborting.
    Please fix the broken dependency!

    于是我想了各种办法:
    (1) (py27) fyo@fyo-Lenovo:~/catkin_ws$ sudo rosdep fix-permissions
    (py27) fyo@fyo-Lenovo:~/catkin_ws$ rosdep update
    (2) (py27) fyo@fyo-Lenovo:~/catkin_ws$ rosdep –version
    0.15.2
    (3) (py27) fyo@fyo-Lenovo:~/catkin_ws$ catkin_make
    (py27) fyo@fyo-Lenovo:~/catkin_ws$ source devel/setup.bash
    (4) 我发现机器上其实有rosdep2,位置在‘fyo@fyo-Lenovo:~/anaconda3/lib/python3.5/site-packages/rosdep2’,于是想在虚拟环境中也按装一遍rosdep包,由于‘pip install’和‘conda install’此时不好用,遂采用
    (py27) fyo@fyo-Lenovo:~/anaconda3/envs/py27/lib/python2.7/site-packages$ git clone https://github.com/ros-infrastructure/rosdep
    (py27) fyo@fyo-Lenovo:~/anaconda3/envs/py27/lib/python2.7/site-packages$ cd rosdep
    (py27) fyo@fyo-Lenovo:~/anaconda3/envs/py27/lib/python2.7/site-packages/rosdep$ source
    结果还是报相同的错误
    (5) 后来我尝试source deactivate,退出虚拟环境py27之后,直接进行‘rosmake’编译时,编译似乎是成功了,不过还是有问题
    fyo@fyo-Lenovo:~/catkin_ws$ rosmake smartcar_teleop
    bla bla bla
    [ rosmake ] Last 40 linesartcar_teleop: 5.9 sec ] [ 1 Active 29/30 Complete ]
    {——————————————————————————-
    — BUILD_SHARED_LIBS is on
    [rosbuild] using multiarch ‘x86_64-linux-gnu’ for finding Boost
    — Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
    [ rosmake ] Halting due to failure in package smartcar_teleop.
    [ rosmake ] Waiting for other threads to complete.
    [ rosmake ] Results:
    [ rosmake ] Built 30 packages with 1 failures.
    [ rosmake ] Summary output to directory
    [ rosmake ] /home/fyo/.ros/rosmake/rosmake_output-20190811-215925

    编译完之后,运行上一篇文章中的‘’roslaunch smartcar_description smartcar_display.rviz.launch’’,一切正常,接着运行
    (py27) fyo@fyo-Lenovo:~/catkin_ws$ rosrun smartcar_teleop smatcar_keyboard_teleop
    [rosrun] Couldn’t find executable named smatcar_keyboard_teleop below /home/fyo/catkin_ws/src/smartcar_teleop
    所以我猜想可能是编译这个地方有问题。
    我能找到的csdn、ros_answer等网址似乎都没有针对我问题的解答,还请师兄赐教,谢谢!

    • 古月 回复 方远 2019年8月13日 下午3:32

      个人的使用经验,ros和anaconda很多配置和环境会有冲突,所以可以试下独立使用两个物理系统来运行两个环境

    • 方远 回复 古月 2019年8月14日 上午9:35

      嗯嗯,好嘞!多谢师兄^^

  • 小白 2019年7月1日 上午11:28

    没有币le可以发我邮箱一份吗?谢谢! 邮箱:295694619@qq.com

  • 牛大 2019年5月5日 下午3:21

    你好,古老师。假设一个6关节的工业机器人,我可以使用键盘的代码来实现控制每个关节的运动吗?在rviz中显示的那种。如果可以实现,有这方面的资料推荐吗

  • luke 2019年1月11日 下午9:05

    古月大神你好 我在学习您书中的导航部分内容时 调用了键盘控制小车在gazebo中运动 根据rqt_graph的图显示出 是mrobot_teleop节点发布话题/cmd_vel 而由/gazebo订阅 我想问的是gazebo是如何订阅的 这部分的订阅的代码又写在哪里 盼回复 感谢

    • 古月 回复 luke 2019年1月11日 下午11:12

      这个是gazebo差速控制插件订阅的,在小车的urdf里有配置

    • luke 回复 古月 2019年1月16日 下午4:03

      谢谢回复。还有一个问题就是,在实际通过无线操控真实机器人的时候 ,我想添加键盘操控mrobot_teleop,现在的情况是:在机器人端(192.168.0.200)启动起机器人后,我又在PC端(192.168.0.173)运行了rosluanch mrobot_teleop mrobot_teleop.launch文件。这时候我用rosnode info 去查看对该速度控制话题的订阅者和发布者,发现机器人上的订阅者连接的节点是:contacting node http://192.168.0.200:43718/;而PC上的发布者连接的节点是:contacting node http://192.168.0.173.42003/。
      另外之前的网络配置应该没有问题,URI做了设置,也能ping通,电脑端也能查看机器人摄像头传来的图片。
      盼回复 谢谢 ^ ^

    • 古月 回复 luke 2019年1月16日 下午6:14

      这个不清楚

    • luke 回复 古月 2019年1月16日 下午4:25

      您好,还有一个问题希望解答,就是在控制真实的机器人的时候。我看您的书上是这样写的
      roscore (PC)
      rosluanch mrobot_bringup mrobot.launch (树莓派)
      rosrun mrobot_teleop mrobot_teleop.py (PC)
      但是我的理解是:在设置好相应的网络配置后,不是应该是机器人上面运行roscore吗,为什么要在电脑上运行roscore?

    • 古月 回复 luke 2019年1月16日 下午6:15

      roscore在PC或树莓派上都可以,和Master的URI配置有关系,书中的URI配置的是PC,所以需要在PC启动

    • luke 回复 古月 2019年1月16日 下午9:03

      哦哦 好的 我的机器人启动的时候就启动所有节点了 它是把启动所有节点的launch文件放在了bashrc中 所以master必须在机器人上 然后我在pc上启动键盘控制也控制不了 我再看看吧 谢谢您的回复哈 ^ ^

  • 江坤 2018年7月23日 下午11:14

    ROS roscd找不到功能包 环境变量缺少/opt/ros/ingido/stacks
    您书上27页用的是indigo发行版本,可是我用您的推荐的kinetic,却显示不了stacks变量

  • cdlll 2018年5月21日 下午10:25

    月哥,你好。我在gazebo中加入了一个小车模型,但是用程序控制小车走直线时,小车总是误差越来越大,走的是斜线。请问有什么办法让小车走准确的直线呢?谢谢!

    • 古月 回复 cdlll 2018年5月23日 下午3:24

      准确的走直线其实是一件比较难的事情,一方面和模型有关系,一方面和控制有关系。首先模型的物理参数需要和真实情况尽量符合,但是我的经验是gazebo里做仿真的参数很难调;另外是控制,也就是让两个轮子运动速度一样,如果是仿真的话,这个和仿真用的控制器有关系,我不确定这个控制器的控制能不能达到走直线的水平,这个需要测试。也可以自己在上层做一层PID的控制,发现机器人走偏了,就及时调整指令。

    • cdlll 回复 古月 2018年5月25日 下午9:00

      谢谢月哥了!

  • pdmike 2018年4月24日 上午10:30

    古神 您好 想问下 现在我在运用ros进行ur机械臂的轨迹仿真。在仿真过程与实际机械臂运行过程,有所区别。主要是奇异点的问题。在仿真中,轨迹并没有出现手腕奇异点,但是同样的轨迹在实际的UR机械臂上出现了手腕奇异点,所以如何避免这个问题或者如何在仿真中将奇异点体现出来

    • 古月 回复 pdmike 2018年4月24日 上午11:43

      不好意思,这个我还没研究过,我们是自己做的机器人,配合rviz开发,出现奇异点时机器人和模型的状态是一致的。你可以在仿真中看一下出现奇异点时的数据,或者看下仿真控制器的代码,是不是已经对奇异点的情况做了特殊处理。

  • Rogers 2018年4月24日 上午8:44

    古大神您好,想请教您,我是用的Kinetic的ROS系统,将您的这个cpp文件直接复制粘贴了,但一直提示我编译失败,失败信息都是什么“stray/320”、”stray/204″是为什么?谢谢您的解答

    • 古月 回复 Rogers 2018年4月24日 上午11:39

      我这里是老版本的ROS,可以参考一下kinetic里turtlebot的键盘控制代码,差不多的

  • 张月 2018年4月19日 下午1:00

    古月你好,我把你的键盘控制文件直接和上一章的智能小车放在一块,当使用 rosrun smartcar_teleop smartcar_keyboard_teleop之后就一直显示/opt/ros/indigo/bin/rosrun: line 109: /home/zhang/catkin_ws/src/smartcar_teleop/bin/smartcar_keyboard_teleop: No such file or directory怎么回事

    • 古月 回复 张月 2018年4月20日 下午5:43

      给python文件添加可执行权限,否则运行不了

  • yhf 2018年4月7日 下午8:32

    键盘控制,把launch文件写到launch文件夹后,roslaunch不行,提示cannot launch node of type [smartcar_teleop/teleop.py]: can’t locate node [teleop.py] in package [smartcar_teleop],望古月大神解答

    • 古月 回复 yhf 2018年4月9日 上午10:06

      需要给teleop.py文件添加可执行权限

    • yhf 回复 古月 2018年4月10日 下午9:02

      谢谢古月大神的耐心解答,问题解决了

    • 东晓 回复 yhf 2018年7月23日 下午6:09

      你好,请问你是如何解决的呢?我搜了一下网上说是用chmod命令添加权限,可是试了很多次还是没有成功。想请教一下您,谢谢您。

  • Joey 2018年3月21日 下午2:27

    您好,请问在运行$ rosrun smartcar_teleop smartcar_keyboard_teleop后报错显示为:
    [rosrun] Couldn’t find executable named smartcar_keyboard_teleop /home/joeychan/catkin_ws_book/src/smartcar_teleop
    是什么原因呢,盼解答,谢谢!

    • 古月 回复 Joey 2018年3月23日 下午11:04

      这个应该是路径的问题,你先看下devel/lib/smartcar_teleop下有没有smartcar_keyboard_teleop的可执行文件,然后检查环境变量的设置

  • debutent 2017年11月12日 上午7:40

    您好古月大神,我在模仿您的代码写一段对turtle_gazebo进行键盘控制的python程序,我将smartcar_teleop替换成了turtle_gazebo,然后我将之后的pub = rospy.Publisher(‘cmd_vel’, Twist) 变成了 pub = rospy.Publisher(‘cmd_vel_mux/input/navi’, Twist),我在ros里面跑程序的时,它总是在turtle_gazebo那里开始报错。其他的地方都与您的程序差不多,请问我的py程序是在roslib.load_manifest(‘smartcar_teleop’) 这一步出现了问题吗?谢谢!

    • 古月 回复 debutent 2017年11月13日 下午1:24

      你好,这篇博客的程序适应早期版本ROS,现在的ROS版本已经不需要加roslib.load_manifest(‘smartcar_teleop’)这句代码了,另外,你也可以参考一下turtlebot或者ros by example书中的代码

  • 茉莉 2017年8月29日 下午4:28

    请问这个erratic_robot包在哪里

    • 古月 回复 茉莉 2017年8月29日 下午5:28

      请见:http://wiki.ros.org/erratic_robot,最新版ROS里好象没有维护了,可以参看turtlebot里的实现

  • 摇铃 2017年6月7日 下午4:56

    你好,如下问题是怎么回事?要怎么做才能消除。CMake Error at CMakeLists.txt:63 (rosbuild_add_boost_directories):
    Unknown CMake command “rosbuild_add_boost_directories”.

    • 古月 回复 摇铃 2017年6月7日 下午8:25

      ROS版本问题,indigo用不了这里的代码

  • heisenbeerg 2017年6月3日 下午9:51

    ROS_MASTER_URI=http://localhost:11311

    core service [/rosout] found
    process[smartcar_teleop-1]: started with pid [7054]
    /home/heisenberg/catkin_ws/src/smartcar_teleop/scripts/teleop.py:27: SyntaxWarning: The publisher should be created with an explicit keyword argument ‘queue_size’. Please see http://wiki.ros.org/rospy/Overview/Publishers%20and%20Subscribers for more information.
    pub = rospy.Publisher(‘cmd_vel’, Twist)
    这个就一直卡这里不忘下走了 怎么回事 阿

    • 古月 回复 heisenbeerg 2017年6月4日 上午12:20

      python代码有错误,应该是创建publisher的时候缺少queue_size参数

  • 小杰 2017年4月20日 下午9:26

    你好,古月大神,我在输入 rosrun smartcar_teleop smartcar_keyboard_teleop,老是遇到这个问题:
    error while loading shared libraries: libroscpp.so: cannot open shared object file: No such file or directory。
    重新卸载装了了roscpp也没用。

    • 古月 回复 小杰 2017年4月21日 上午9:12

      ROS是源码编译的么?参考一下:http://answers.ros.org/question/205962/cant-find-libroscppso-fedora-21/

    • 小杰 回复 古月 2017年4月21日 下午2:48

      这个ros源码的配置环境不会是32位的吧?

    • 古月 回复 小杰 2017年4月21日 下午3:55

      这个我不确定,没在64位上编译过,现在都可以直接安装了

  • 五十弦 2016年9月30日 下午4:21

    博主你好,运行rosrun smartcar_teleop smartcar_keyboard_teleop时候,一直提示:/opt/ros/indigo/bin/rosrun: line 109: /home/sun/catkin_ws/src/smartcar_teleop/bin/smartcar_keyboard_teleop: No such file or directory,请问可能是什么原因啊?

    • 古月 回复 五十弦 2016年10月8日 上午9:25

      没找到可执行文件,检查一下编译是否正确,路径是否正确

    • Intellege 回复 古月 2016年11月10日 下午6:51

      古月你好,我也碰到这个问题,而且我看到你的软件包比我自己新建的多个bin包,里面有smartcar_keyboard_teleop,不知道是什么文件,,,还请指点一下

    • 古月 回复 Intellege 2016年11月12日 下午5:26

      这个是编译之后生成的

    • 颜正杰 回复 Intellege 2017年4月19日 下午9:03

      你好,package ‘smartcar_teleop’ not found 这个问题你遇到过怎么解决的呀

    • 茉莉 回复 颜正杰 2017年8月29日 下午4:44

      你试一下 source ~/catkin_ws/devel/setup.bash

    • 茉莉 回复 颜正杰 2017年8月29日 下午4:52

      CMake Error at smartcar_teleop/CMakeLists.txt:202 (rosbuild_add_boost_directories):
      Unknown CMake command “rosbuild_add_boost_directories”.
      大神,请问如何解决?

    • 古月 回复 茉莉 2017年8月29日 下午5:29

      这个是很古老的ROS版本里边的命令了,现在ROS里已经没有了

  • slam小白 2016年6月13日 下午7:10

    rosrun smartcar_teleop keyboard_teleop
    一直到运行结束ctrl + C都没有问题。

    只是当我写成 launch 文件,然后运行:
    roslaunch smartcar_teleop keyboard_teleop.launch
    运行程序没有问题,只是当我用Ctrl + c结束后,控制台就会出问题,不能输入了。不知道楼主有没有遇到这个问题????

    • 古月 回复 slam小白 2016年6月16日 上午10:00

      这个问题我没遇到过,不能输入是指控制台不能再输入命令行了?

    • slam小白 回复 古月 2016年6月16日 下午9:49

      是的,感觉是执行ctrl + c ,主进程结束了,可是子进程还没有的样子