ROS探索总结(十四)——move_base(路径规划)

  • 内容
  • 评论
  • 相关

        在上一篇的博客中,我们一起学习了ROS定位于导航的总体框架,这一篇我们主要研究其中最重要的move_base包。


           在总体框架图中可以看到,move_base提供了ROS导航的配置、运行、交互接口,它主要包括两个部分:
      (1) 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划;
      (2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线规划。

一、数据结构

        ROS中定义了MoveBaseActionGoal数据结构来存储导航的目标位置数据,其中最重要的就是位置坐标(position)和方向(orientation)。

  1. rosmsg show MoveBaseActionGoal  
  2.  
  3. [move_base_msgs/MoveBaseActionGoal]:  
  4. std_msgs/Header header  
  5.   uint32 seq  
  6.   time stamp  
  7.   string frame_id  
  8. actionlib_msgs/GoalID goal_id  
  9.   time stamp  
  10.   string id  
  11. move_base_msgs/MoveBaseGoal goal  
  12.   geometry_msgs/PoseStamped target_pose  
  13.     std_msgs/Header header  
  14.       uint32 seq  
  15.       time stamp  
  16.       string frame_id  
  17.     geometry_msgs/Pose pose  
  18.       geometry_msgs/Point position  
  19.         float64 x  
  20.         float64 y  
  21.         float64 z  
  22.       geometry_msgs/Quaternion orientation  
  23.         float64 x  
  24.         float64 y  
  25.         float64 z  
  26.         float64 w

二、配置文件

        move_base使用前需要配置一些参数:运行成本、机器人半径、到达目标位置的距离,机器人移动的速度,这些参数都在rbx1_nav包的以下几个配置文件中:
        ? base_local_planner_params.yaml
        ? costmap_common_params.yaml
        ? global_costmap_params.yaml
        ? local_costmap_params.yaml

三、全局路径规划(global planner)

        在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。
        navfn通过Dijkstra最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。将来在算法上应该还会加入A*算法。
        具体见:
http://www.ros.org/wiki/navfn?distro=fuerte

四、本地实时规划(local planner)

        本地的实时规划是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。

        base_local_planner这个包通过地图数据,通过算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。
其中,Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下:
      (1) 采样机器人当前的状态(dx,dy,dtheta);
      (2) 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
      (3) 利用一些评价标准为多条路线打分。
      (4) 根据打分,选择最优路径。
      (5) 重复上面过程。
      具体参见:
http://www.ros.org/wiki/base_local_planner?distro=groovy

五、ArbotiX仿真——手动设定目标

        在这一步,我们暂时使用空白地图(blank_map.pgm),就在空地上进行无障碍仿真。
        首先运行ArbotiX节点,并且加载机器人的URDF文件。
        roslaunch rbx1_bringup fake_turtlebot.launch 
        然后运行move_base和加载空白地图的launch文件(fake_move_base_blank_map.launch):
        roslaunch rbx1_nav fake_move_base_blank_map.launch 
        该文件的具体内容如下:

  1. <launch>  
  2.   <!-- Run the map server with a blank map -->  
  3.   <node name="map_server" pkg="map_server" type="map_server" args="$(find rbx1_nav)/maps/blank_map.yaml"/>  
  4.  
  5.   <include file="$(find rbx1_nav)/launch/fake_move_base.launch" />  
  6.  
  7.   <!-- Run a static transform between /odom and /map -->  
  8.   <node pkg="tf" type="static_transform_publisher" name="odom_map_broadcaster" args="0 0 0 0 0 0 /map /odom 100" />  
  9.  
  10. </launch>

        其中调用了fake_move_base.launch文件,是运行move_base节点并进行参数配置。
        然后调用rviz就可以看到机器人了。
        rosrun rviz rviz -d `rospack find rbx1_nav`/nav_fuerte.vcg 
       
        我们先以1m的速度进行一下测试:
        让机器人前进一米:

  1. rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped \  
  2. '{ header: { frame_id: "base_link" }, pose: { position: { x: 1.0, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }'

        让机器人后退一米,回到原来的位置:

  1. rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped \  
  2. '{ header: { frame_id: "map" }, pose: { position: { x: 0, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }'

        在rviz中的轨迹图如下:

        在机器人移动过程中,有一条蓝色的线(被黄线挡住了)就是机器人的全局规划的路径;红色的箭头是实施规划的路线,会不断更新,有的时候会呈现很大的弧线,那是因为机器人在转向的过程中尽量希望保持平稳的角度。如果觉得路径规划的精度不够,可以修改配置文件中的pdist_scale参数进行修正。
        然后我们可以认为的确定目标位置,点击rviz上方的2D Nav Goal按键,然后左键选择目标位置,机器人就开始自动导航了。

六、ArbotiX仿真——带有障碍物的路径规划

        首先我们让机器人走一个正方形的路线。先通过上面的命令,让机器人回到原始位置(0,0,0),然后按reset按键,把所有的箭头清除。接着运行走正方形路径的代码:
        rosrun rbx1_nav move_base_square.py 
        在rviz中可以看到:

        四个顶角的粉色圆盘就是我们设定的位置,正方形比较规则,可见定位还是比较准确的。然我们先来分析一下走正方形路线的代码:

  1. #!/usr/bin/env python  
  2. import roslib; roslib.load_manifest('rbx1_nav')  
  3. import rospy  
  4. import actionlib  
  5. from actionlib_msgs.msg import *  
  6. from geometry_msgs.msg import Pose, Point, Quaternion, Twist  
  7. from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal  
  8. from tf.transformations import quaternion_from_euler  
  9. from visualization_msgs.msg import Marker  
  10. from math import radians, pi  
  11.  
  12. class MoveBaseSquare():  
  13.     def __init__(self):  
  14.         rospy.init_node('nav_test', anonymous=False)  
  15.  
  16.         rospy.on_shutdown(self.shutdown)  
  17.  
  18.         # How big is the square we want the robot to navigate?  
  19.         # 设定正方形的尺寸,默认是一米  
  20.         square_size = rospy.get_param("~square_size", 1.0) # meters  
  21.  
  22.         # Create a list to hold the target quaternions (orientations)  
  23.         # 创建一个列表,保存目标的角度数据  
  24.         quaternions = list()  
  25.  
  26.         # First define the corner orientations as Euler angles  
  27.         # 定义四个顶角处机器人的方向角度(Euler angles:http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92)  
  28.         euler_angles = (pi/2, pi, 3*pi/2, 0)  
  29.  
  30.         # Then convert the angles to quaternions  
  31.         # 将上面的Euler angles转换成Quaternion的格式  
  32.         for angle in euler_angles:  
  33.             q_angle = quaternion_from_euler(0, 0, angle, axes='sxyz')  
  34.             q = Quaternion(*q_angle)  
  35.             quaternions.append(q)  
  36.  
  37.         # Create a list to hold the waypoint poses  
  38.         # 创建一个列表存储导航点的位置  
  39.         waypoints = list()  
  40.  
  41.         # Append each of the four waypoints to the list.  Each waypoint  
  42.         # is a pose consisting of a position and orientation in the map frame.  
  43.         # 创建四个导航点的位置(角度和坐标位置)  
  44.         waypoints.append(Pose(Point(square_size, 0.0, 0.0), quaternions[0]))  
  45.         waypoints.append(Pose(Point(square_size, square_size, 0.0), quaternions[1]))  
  46.         waypoints.append(Pose(Point(0.0, square_size, 0.0), quaternions[2]))  
  47.         waypoints.append(Pose(Point(0.0, 0.0, 0.0), quaternions[3]))  
  48.  
  49.         # Initialize the visualization markers for RViz  
  50.         # 初始化可视化标记  
  51.         self.init_markers()  
  52.  
  53.         # Set a visualization marker at each waypoint   
  54.         # 给每个定点的导航点一个可视化标记(就是rviz中看到的粉色圆盘标记)  
  55.         for waypoint in waypoints:             
  56.             p = Point()  
  57.             p = waypoint.position  
  58.             self.markers.points.append(p)  
  59.  
  60.         # Publisher to manually control the robot (e.g. to stop it)  
  61.         # 发布TWist消息控制机器人  
  62.         self.cmd_vel_pub = rospy.Publisher('cmd_vel', Twist)  
  63.  
  64.         # Subscribe to the move_base action server  
  65.         # 订阅move_base服务器的消息  
  66.         self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)  
  67.  
  68.         rospy.loginfo("Waiting for move_base action server...")  
  69.  
  70.         # Wait 60 seconds for the action server to become available  
  71.         # 等待move_base服务器建立  
  72.         self.move_base.wait_for_server(rospy.Duration(60))  
  73.  
  74.         rospy.loginfo("Connected to move base server")  
  75.         rospy.loginfo("Starting navigation test")  
  76.  
  77.         # Initialize a counter to track waypoints  
  78.         # 初始化一个计数器,记录到达的顶点号  
  79.         i = 0  
  80.  
  81.         # Cycle through the four waypoints  
  82.         # 主循环,环绕通过四个定点  
  83.         while i < 4 and not rospy.is_shutdown():  
  84.             # Update the marker display  
  85.             # 发布标记指示四个目标的位置,每个周期发布一起,确保标记可见  
  86.             self.marker_pub.publish(self.markers)  
  87.  
  88.             # Intialize the waypoint goal  
  89.             # 初始化goal为MoveBaseGoal类型  
  90.             goal = MoveBaseGoal()  
  91.  
  92.             # Use the map frame to define goal poses  
  93.             # 使用map的frame定义goal的frame id  
  94.             goal.target_pose.header.frame_id = 'map'  
  95.  
  96.             # Set the time stamp to "now"  
  97.             # 设置时间戳  
  98.             goal.target_pose.header.stamp = rospy.Time.now()  
  99.  
  100.             # Set the goal pose to the i-th waypoint  
  101.             # 设置目标位置是当前第几个导航点  
  102.             goal.target_pose.pose = waypoints[i]  
  103.  
  104.             # Start the robot moving toward the goal  
  105.             # 机器人移动  
  106.             self.move(goal)  
  107.  
  108.             i += 1  
  109.  
  110.     def move(self, goal):  
  111.             # Send the goal pose to the MoveBaseAction server  
  112.             # 把目标位置发送给MoveBaseAction的服务器  
  113.             self.move_base.send_goal(goal)  
  114.  
  115.             # Allow 1 minute to get there  
  116.             # 设定1分钟的时间限制  
  117.             finished_within_time = self.move_base.wait_for_result(rospy.Duration(60))   
  118.  
  119.             # If we don't get there in time, abort the goal  
  120.             # 如果一分钟之内没有到达,放弃目标  
  121.             if not finished_within_time:  
  122.                 self.move_base.cancel_goal()  
  123.                 rospy.loginfo("Timed out achieving goal")  
  124.             else:  
  125.                 # We made it!  
  126.                 state = self.move_base.get_state()  
  127.                 if state == GoalStatus.SUCCEEDED:  
  128.                     rospy.loginfo("Goal succeeded!")  
  129.  
  130.     def init_markers(self):  
  131.         # Set up our waypoint markers  
  132.         # 设置标记的尺寸  
  133.         marker_scale = 0.2  
  134.         marker_lifetime = 0 # 0 is forever  
  135.         marker_ns = 'waypoints'  
  136.         marker_id = 0  
  137.         marker_color = {'r': 1.0, 'g': 0.7, 'b': 1.0, 'a': 1.0}  
  138.  
  139.         # Define a marker publisher.  
  140.         # 定义一个标记的发布者  
  141.         self.marker_pub = rospy.Publisher('waypoint_markers', Marker)  
  142.  
  143.         # Initialize the marker points list.  
  144.         # 初始化标记点的列表  
  145.         self.markers = Marker()  
  146.         self.markers.ns = marker_ns  
  147.         self.markers.id = marker_id  
  148.         self.markers.type = Marker.SPHERE_LIST  
  149.         self.markers.action = Marker.ADD  
  150.         self.markers.lifetime = rospy.Duration(marker_lifetime)  
  151.         self.markers.scale.x = marker_scale  
  152.         self.markers.scale.y = marker_scale  
  153.         self.markers.color.r = marker_color['r']  
  154.         self.markers.color.g = marker_color['g']  
  155.         self.markers.color.b = marker_color['b']  
  156.         self.markers.color.a = marker_color['a']  
  157.  
  158.         self.markers.header.frame_id = 'map'  
  159.         self.markers.header.stamp = rospy.Time.now()  
  160.         self.markers.points = list()  
  161.  
  162.     def shutdown(self):  
  163.         rospy.loginfo("Stopping the robot...")  
  164.         # Cancel any active goals  
  165.         self.move_base.cancel_goal()  
  166.         rospy.sleep(2)  
  167.         # Stop the robot  
  168.         self.cmd_vel_pub.publish(Twist())  
  169.         rospy.sleep(1)  
  170.  
  171. if __name__ == '__main__':  
  172.     try:  
  173.         MoveBaseSquare()  
  174.     except rospy.ROSInterruptException:  
  175.         rospy.loginfo("Navigation test finished.")

        但是,在实际情况中,往往需要让机器人自动躲避障碍物。move_base包的一个强大的功能就是可以在全局规划的过程中自动躲避障碍物,而不影响全局路径。障碍物可以是静态的(比如墙、桌子等),也可以是动态的(比如人走过)。
        现在我们尝试在之前的正方形路径中加入障碍物。把之前运行fake_move_base_blank_map.launch的中断Ctrl-C掉,然后运行:
 
        roslaunch rbx1_nav fake_move_base_obstacle.launch 
        然后就会看到在rviz中出现了障碍物。然后在运行之前走正方形路线的代码: 
        rosrun rbx1_nav move_base_square.py  
        这回我们可以看到,在全局路径规划的时候,机器人已经将障碍物绕过去了,下过如下图:
        在上图中,黑色的线是障碍物,周围浅色的椭圆形是根据配置文件中的inflation_radius参数计算出来的安全缓冲区。全局规划的路径基本已经是最短路径了。在仿真的过程中也可以动态重配置那四个配置文件,修改仿真参数。


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(十四)——move_base(路径规划)

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

156条评论
  1. Gravatar 头像

    优柔寡断 回复

    古月老师你好,我想在ros环境下实现模拟仿真机器人走s形路径,需要怎么做?

  2. Gravatar 头像

    初见 回复

    古月老师您好,我想在rviz的一张地图内在起点和终点各设置一个点,然后就不再操作,可以实现机器人的全程自主运动。可是实际上,标点的时候不能标记很远,远了机器人无法计算路径,必须一小段一小段的标,等上一段运动结束再进行下一段运动的标点,请问老师,改什么参数,可以实现较远距离的标点运动呢 ?

    • Gravatar 头像

      小乖 回复

      @初见 请问大神,move_base导航,出现这个问题是怎么回事[ WARN] [1563438965.572419973]: MessageFilter [target=map ]: Discarding message from [/move_base_node] due to empty frame_id. This message will only print once.
      [ WARN] [1563438965.572522867]: Invalid argument passed to canTransform argument source_frame in tf2 frame_ids cannot be empty

  3. Gravatar 头像

    xman 回复

    古月老師您好,拜讀您的書之後受益良多,很謝謝您。此外我有一個疑惑,那就是move_base這個包裡,是否有針對機器人移動時的"Yaw角"的策略呢。
    我在做實驗時,發現機器人會有到達目標點後修正Yaw角角度的行為,而非一邊移動、一邊同時修正Yaw角,我的目標是希望到達目標點後,Yaw角跟我所指的一樣(不要到了才修正),所以想問關於這方面move_base的策略是什麼呢,謝謝您。

    • 古月

      古月 回复

      @xman 这方面的策略我没有深入研究过,需要看下源码

  4. Gravatar 头像

    leo 回复

    古月老师您好,请问您了解关于导航方面的任务进度吗? 好比手机地图软件上,能算出距离目标点有多少距离,已走了多少,预计还要多久,这样就可以得到整个导航的任务进度了。 您是否在ROS当中接触过这些呢?

      • Gravatar 头像

        qbw 回复

        @古月 古月老师您好,我在跑您的讲的mbot_gazrbo那些包时,报错是project'gazebo_plugins' specifies,我也安装了这些包的依赖包,请问这个问题如何解决呢?

  5. Gravatar 头像

    谭东旭 回复

    古月大神,您好,我按照您的视频运行arbotixe的launch文件:arbotix_mbot_with_camera_xacro.launch,总会出现如下错误---
    tandongxu@tandongxu-ThinkPad-Edge-E440:~/catkin_ws$ roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch
    ... logging to /home/tandongxu/.ros/log/53363cc0-96e8-11e9-95af-38b1d87fac7f/roslaunch-tandongxu-ThinkPad-Edge-E440-6189.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.

    started roslaunch server http://tandongxu-ThinkPad-Edge-E440:36595/

    SUMMARY
    ========

    PARAMETERS
    * /arbotix/controllers/base_controller/Kd: 12
    * /arbotix/controllers/base_controller/Ki: 0
    * /arbotix/controllers/base_controller/Ko: 50
    * /arbotix/controllers/base_controller/Kp: 12
    * /arbotix/controllers/base_controller/accel_limit: 1.0
    * /arbotix/controllers/base_controller/base_frame_id: base_footprint
    * /arbotix/controllers/base_controller/base_width: 0.26
    * /arbotix/controllers/base_controller/ticks_meter: 4100
    * /arbotix/controllers/base_controller/type: diff_controller
    * /arbotix/sim: True
    * /robot_description: <?xml version="1....
    * /rosdistro: kinetic
    * /rosversion: 1.12.14
    * /use_gui: False

    NODES
    /
    arbotix (arbotix_python/arbotix_driver)
    joint_state_publisher (joint_state_publisher/joint_state_publisher)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    rviz (rviz/rviz)

    auto-starting new master
    process[master]: started with pid [6202]
    ROS_MASTER_URI=http://localhost:11311

    setting /run_id to 53363cc0-96e8-11e9-95af-38b1d87fac7f
    process[rosout-1]: started with pid [6215]
    started core service [/rosout]
    process[arbotix-2]: started with pid [6228]
    process[joint_state_publisher-3]: started with pid [6233]
    process[robot_state_publisher-4]: started with pid [6234]
    process[rviz-5]: started with pid [6235]
    Traceback (most recent call last):
    File "/home/tandongxu/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_driver", line 33, in
    from arbotix_msgs.msg import *
    ImportError: No module named arbotix_msgs.msg
    [arbotix-2] process has died [pid 6228, exit code 1, cmd /home/tandongxu/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_driver __name:=arbotix __log:=/home/tandongxu/.ros/log/53363cc0-96e8-11e9-95af-38b1d87fac7f/arbotix-2.log].
    log file: /home/tandongxu/.ros/log/53363cc0-96e8-11e9-95af-38b1d87fac7f/arbotix-2*.log
    ^C[rviz-5] killing on exit
    [robot_state_publisher-4] killing on exit
    [joint_state_publisher-3] killing on exit
    [rosout-1] killing on exit
    [master] killing on exit
    shutting down processing monitor...
    ... shutting down processing monitor complete
    done
    tandongxu@tandongxu-ThinkPad-Edge-E440:~/catkin_ws$ roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch
    ... logging to /home/tandongxu/.ros/log/888624f8-96e8-11e9-95af-38b1d87fac7f/roslaunch-tandongxu-ThinkPad-Edge-E440-6427.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.

    started roslaunch server http://tandongxu-ThinkPad-Edge-E440:40267/

    SUMMARY
    ========

    PARAMETERS
    * /arbotix/controllers/base_controller/Kd: 12
    * /arbotix/controllers/base_controller/Ki: 0
    * /arbotix/controllers/base_controller/Ko: 50
    * /arbotix/controllers/base_controller/Kp: 12
    * /arbotix/controllers/base_controller/accel_limit: 1.0
    * /arbotix/controllers/base_controller/base_frame_id: base_footprint
    * /arbotix/controllers/base_controller/base_width: 0.26
    * /arbotix/controllers/base_controller/ticks_meter: 4100
    * /arbotix/controllers/base_controller/type: diff_controller
    * /arbotix/sim: True
    * /robot_description: <?xml version="1....
    * /rosdistro: kinetic
    * /rosversion: 1.12.14
    * /use_gui: False

    NODES
    /
    arbotix (arbotix_python/arbotix_driver)
    joint_state_publisher (joint_state_publisher/joint_state_publisher)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    rviz (rviz/rviz)

    auto-starting new master
    process[master]: started with pid [6440]
    ROS_MASTER_URI=http://localhost:11311

    setting /run_id to 888624f8-96e8-11e9-95af-38b1d87fac7f
    process[rosout-1]: started with pid [6453]
    started core service [/rosout]
    process[arbotix-2]: started with pid [6464]
    process[joint_state_publisher-3]: started with pid [6471]
    process[robot_state_publisher-4]: started with pid [6472]
    process[rviz-5]: started with pid [6473]
    Traceback (most recent call last):
    File "/home/tandongxu/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_driver", line 36, in
    from arbotix_python.arbotix import ArbotiX, ArbotiXException
    ImportError: No module named arbotix
    [arbotix-2] process has died [pid 6464, exit code 1, cmd /home/tandongxu/catkin_ws/src/arbotix_ros/arbotix_python/bin/arbotix_driver __name:=arbotix __log:=/home/tandongxu/.ros/log/888624f8-96e8-11e9-95af-38b1d87fac7f/arbotix-2.log].
    log file: /home/tandongxu/.ros/log/888624f8-96e8-11e9-95af-38b1d87fac7f/arbotix-2*.log
    ^C[rviz-5] killing on exit
    [robot_state_publisher-4] killing on exit
    [joint_state_publisher-3] killing on exit
    [rosout-1] killing on exit
    [master] killing on exit
    shutting down processing monitor...
    ... shutting down processing monitor complete
    done
    我看其他博主说要把arbotix模块添加到环境里,可是我添加以后还是这样,请问该怎么解决(从书上下载的代码也是这样,arbotix用不了)。

  6. Gravatar 头像

    hdy 回复

    古月老师您好,我想问一下,在机器人周围出现动态障碍物时,激光雷达仅仅检测出一排的点,而没有显示为障碍物,并且无法规划路径绕过该动态障碍物,采用默认导航参数是否只能做到这样?

    • 古月

      古月 回复

      @hdy 调整参数后应该可以做到动态避障的

  7. Gravatar 头像

    谭东旭 回复

    请问古月大神,我看了您的视频,运行roslaunch mrobot_description arbotix_mrobot_with_laser.launch。。可是会出现下面的问题,请问是怎么回事。我看了其他博主说是要把arbotix模块加载环境里,可是我加了以后还是有问题。求大神帮忙看一下。
    ROS_MASTER_URI=http://localhost:11311

    setting /run_id to 3676242a-963d-11e9-940d-38b1db7fac7f
    process[rosout-1]: started with pid [2952]
    started core service [/rosout]
    process[arbotix-2]: started with pid [2955]
    Traceback (most recent call last):
    File "/home/tandongxu/catkin_ws/src/ros_exploring/robot_mrobot/arbotix_ros/arbotix_python/bin/arbotix_driver", line 33, in
    from arbotix_msgs.msg import *
    ImportError: No module named arbotix_msgs.msg
    process[joint_state_publisher-3]: started with pid [2956]
    process[robot_state_publisher-4]: started with pid [2959]
    [arbotix-2] process has died [pid 2955, exit code 1, cmd /home/tandongxu/catkin_ws/src/ros_exploring/robot_mrobot/arbotix_ros/arbotix_python/bin/arbotix_driver __name:=arbotix __log:=/home/tandongxu/.ros/log/3676242a-963d-11e9-940d-38b1db7fac7f/arbotix-2.log].
    log file: /home/tandongxu/.ros/log/3676242a-963d-11e9-940d-38b1db7fac7f/arbotix-2*.log
    process[rviz-5]: started with pid [2962]
    ^C[rviz-5] killing on exit
    [robot_state_publisher-4] killing on exit
    [joint_state_publisher-3] killing on exit
    [rosout-1] killing on exit
    [master] killing on exit
    shutting down processing monitor...
    ... shutting down processing monitor complete
    done

  8. Gravatar 头像

    木东 回复

    古月老师,您好,在您的《ROS 机器人开发实践》自主导航中,我将move_base节点的名称修改为move_base3,然后在机器人自主导航这一节中将self.move_base =actionlib.SimpleActionClient("move_base", MoveBaseAction) ,中move_base用move_base3代替,但是在rqt_graph中move_base3包和random_navigation并没有连接起来,但是如果只把节点名字改为move_base3,但在自主导航中依旧是订阅move_base,结果在在rqt_graph中move_base3节点和random_navigation竟连接起来了,想问一下是怎么回事

  9. Gravatar 头像

    木东 回复

    古月老师你好,在您的《ROS 机器人开发实践》自主导航中,self.move_base =actionlib.SimpleActionClient("move_base", MoveBaseAction) ,我想把move_base改为move_base3但是在rqt_graph中move_base3包和random_navigation并没有连接起来,想问一下是怎么回事

      • Gravatar 头像

        木东 回复

        @古月 我的move_base节点已经改名为了move_base3

  10. Gravatar 头像

    Zz 回复

    古月老师,您好,我想问一下,在rviz中显示机器人移动的所有轨迹是怎么实现的?我现在只是实时显示最新的一段路径,随着路径的增长,前边的就消失了。谢谢

  11. Gravatar 头像

    泽宇 回复

    大神你好,我想请问现在的全局路径规划在代价地图中加入障碍物层后,已经可以实现避障,那为什么还需要局部路径规划呢?

  12. Gravatar 头像

    Raspi 回复

    请问古月大神,如何得到路径规划的具体信息呢,比如说规划好全局路径后,在rviz可以显示一条线出来对吧,那这条线是已什么文件形式存在于电脑当中的呢,或者如何得到这条线的具体信息?

    因为我想让小车过急转弯的时候降速,这样就得提前知道它在什么时候转弯...

    • 古月

      古月 回复

      @Raspi 有topic发布路径数据的,看rviz中订阅的话题

  13. Gravatar 头像

    汪云云 回复

    请教古月大神一个问题,move_base、全局规划器、局部规划器他们之间的关系是什么样的?还有大神,当局部规划器接收到全局规划器规划的路径时,怎么处理成所需速度和角速度?谢谢大神!

    • 古月

      古月 回复

      @汪云云 move_base里包含全局规划和本地规划,具体看wiki里介绍的算法

    • Gravatar 头像

      tjy 回复

      @汪云云 你好 请教一下 我的包里没有nav_fuerte.rviz 这个文件 而且 运行roslaunch rbx1_nav fake_move_base_obstacle.launch 会提示 Timed out waiting for transform from base_footprint to map to become available before running costmap, tf error: canTransform: target_frame map does not exist.. canTransform returned after 0.100324 timeout was 0.1.
      不知道 您有没有遇到过

  14. Gravatar 头像

    leo 回复

    古月老师您好,我想请教的问题是:1、小车在向目标移动过程中如果move_base节点崩掉(目前是手动关闭模拟意外)的话,那么小车就会停在原地不会走了。2、重新打开move_base节点后,相当于一切从头来过,请问如何能在重开节点后继续之前的工作呢?

    • 古月

      古月 回复

      @leo 只能自己想办法保存崩溃前的数据,ros没有这个功能

      • Gravatar 头像

        leo 回复

        @古月 古月老师,如果想做这方面的工作,需要掌握哪些知识呢?对哪一部分的框架需要深入理解呢?私认为这是机器人很重要的一个部分,但开源资料似乎很少,可否请您指点一二。

        • 古月

          古月 回复

          @leo 先用ros把框架跑起来,然后理解框架中每个部分的功能,再深入研究下代码中的算法,算法都是比较通用的,wiki上可以找到算法介绍

  15. Gravatar 头像

    naruto 回复

    胡老师,您好,想问下有没有基于高程地图(DEM)图做的全局路径规划,局部路径规划相关的功能包,或者成熟地源码框架谢谢@古月

  16. Gravatar 头像

    pigorange 回复

    老师您好,之前发的评论好像被吞掉了。感谢您上次的建议,我回去学习了一些相关的内容,有了一些收获。但是仍然还有一些疑问存在,还请和您共同探讨下,谢谢。
    第一个问题就是,我后面找到了在yaml配置文件里有通过修改dwa参数为true或者false来判断是否使用或不使用dwa算法。但是我看不管参数的值如何,move_base节点在调用local_planner时都是调用的TrajectoryPlannerROS,也就是Trajectory Rollout算法,那这样的话这个参数有什么意义呢?并且改变前后我发现测试的结果并没有什么区别,所以比较疑惑。
    第二个问题就是,我因为发现上面的问题一直都是调用TrajectoryPlannerROS所以我尝试在move_base中将代码修改后使它调用的是DWAPlannerROS,也就是dwa_planner_ros.cpp文件中的相关内容。但是这样的话在仿真测试时,当小车走到比较靠近角落的地方时通常都会报错,DWA can't produce a path,然后最后崩溃,但是使用Trajectory_planner_ros.cpp时完全没有这个问题,所以我想请问您对此有什么看法,您有使用过dwa_planner_ros代码来做相关的测试吗?

  17. Gravatar 头像

    pigorange 回复

    老师您好,有一些问题就是您上面介绍说局部路径规划(本地)使用的是Trajectory Rollout 和Dynamic Window approaches算法,那请问是这两种算法都使用了吗?从哪里可以看到这两种算法的调用?还有如果我想对算法里的一些部分进行修改的话是否需要同时修改这两个算法的相关代码?期待您的回复,谢谢。

    • 古月

      古月 回复

      @pigorange 两种二选一,在yaml配置文件中设置,修改只需要针对自己要用的修改

      • Gravatar 头像

        pigorange 回复

        @古月 好的,我先查找一些做一些修改,如果有问题之后再请教您。非常感谢。

      • Gravatar 头像

        pigorange 回复

        @古月 老师您好,我查阅了一些资料也有一些收获,但是又有些新的疑问还请您赐教下。第一个就是我发现在修改base_local_planner里的用yaml文件设置的参数时候,对于dwa这个属性如果设置为true的话是会使用DWA算法,然后false的时候是使用Trajectory Rollout,至少在官方文档里是这么解释的。但是这样即使我设置dwa为true,在运行相关代码时还是调用的是Trajectory_planner_ros.cpp文件,而没有调用dwa_local_planner包下的dwa_planner_ros.cpp文件。这是怎么回事呢? 第二个问题就是我如果仅仅改dwa参数的值,在实验测试的时候结果几乎看不出来任何区别。但是我如果将move_base_ros.cpp文件中local_planner那里的对象从TrajectoryPlannerROS换成DWAPlannerROS的时候,结果会有不同,但是往往在一些靠近角落的地方程序就会因为找不到合适的路径就崩溃,是dwa_planner_ros.cpp有什么bug或是没有完善的地方吗?

    • Gravatar 头像

      陈伟伟 回复

      @pigorange 我最近看了一些dwa的源码,首先就是use_dwa这个参数是决定速度采样方式的,dwa算法是调用了trajectory rollout 里面的函数的,其实两者之间很相似。

  18. Gravatar 头像

    lll 回复

    请问古月大神,有关路径规划的源码具体在哪个文件夹里呢

  19. Gravatar 头像

    cby 回复

    你好!古月大神,我能向你请教一下么?我按照你的书和视频来做,进行真实机器人导航,把自己建好的图放进nav_demo.launch里,发现在rviz里可以看到自己建的图和小车等,但是在用2D Nav Goal进行自主导航时,却发现自己的移动小车不动,

    • 古月

      古月 回复

      @cby 检查cmd_vel是否发布,以及小车收到这个话题后有没有具体驱动

      • Gravatar 头像

        rex ruan 回复

        @古月 胡老师,您好,我与cby同学有一样的问题。我看了cmd_vel在topic list中,收到话题后具体驱动是在哪里看呢?

  20. Gravatar 头像

    nico 回复

    你好,学长,我想问下move_base功能包中具体是在那个文件中给底盘发布的控制信息

    • 古月

      古月 回复

      @nico 具体请在源码中搜索,输出是cmd_vel话题

  21. Gravatar 头像

    回复

    您好,使用源码安装 navigation包,编译通过后,根据《ROS 机器人开发实践》P268调用例程, roslaunch mrobot_navigation fake_nav_demo.launch时:
    出现[move_base-2] process has died [pid 16990, exit code -11, cmd /home/drikold_linux/navigation/catkin_ws/devel/lib/move_base/move_base __name:=move_base __log:=/home/drikold_linux/.ros/log/b772b144-3024-11e9-a9fa-28b2bd4f996c/move_base-2.log].
    log file: /home/drikold_linux/.ros/log/b772b144-3024-11e9-a9fa-28b2bd4f996c/move_base-2*.log
    问题

    但是当使用二进制安装 navigation包,在调用上述例程,却可以运行。
    请问您知道原因吗?

    • 古月

      古月 回复

      @文 下载的navigation包可能和二级制安装的版本不同,依赖库也有差异

    • Gravatar 头像

      梅宏 回复

      @文 版本不对,https://github.com/rst-tu-dortmund/teb_local_planner,选择合适打indigo或者kinetic,然后解压放进工作空间,如果遇到依赖问题就直接sudo apt-get install ros-kinetic-navigation*安装navigation,再重新编译,编译成功后remove,移除掉安装的navigation,这样就可以使用你的navigation了。

  22. Gravatar 头像

    三石 回复

    你好,想问一下move_base不是已经发布了输出到机器人底盘的速度命令,为什么还需要在random_navigation.py在发布一次cmd_vel?

    • 古月

      古月 回复

      @三石 可以看下程序,只是用来发布停止机器人的指令

      • Gravatar 头像

        三石 回复

        @古月 可以将move_base发布的速度订阅然后在进行处理利用串口通信发布到底盘上,除了这个还有别的方法吗,还有就是我想知道怎么才能知道地图的障碍信息,然后发布沿着障碍走的目标

        • 古月

          古月 回复

          @三石 move_base负责把速度算出来,至于这个速度怎么发给底盘,任何通讯方式都可以,tcp、232、485等等,不过需要自己写驱动或者找已有的包做修改,串口比较简单,所以用的多。地图数据是可以获取到的,障碍信息得自己分析

          • Gravatar 头像

            李磊 回复

            @古月 我看到的那个slam发布的occupancygrid,是不是可以利用那个信息进行分析,但怎么分析我还没查明白,还有一个问题就是关于你的书中的nav_demo.launch和fake_nav_demo.launch,两个其实只是在定位上有区别,但是我在电脑仿真环境下nav_demo.launch无法进行move_base的规划,并且感觉发布的/move_base/goal在运行nav_demo.launch下无法接收。并且在运行时会出现:Warning: Invalid argument "/map" passed to canTransform argument target_frame in tf2 frame_ids cannot start with a '/' like:
            at line 134 in /home/lilei/catkin_ws/src/geometry2/tf2/src/buffer_core.cpp

            • 古月

              古月 回复

              @李磊 看错误提示,你是在自己的工作空间下载了tf包做修改么?似乎和系统默认的版本不同

  23. Gravatar 头像

    Zeddy 回复

    学长你好,如果想要turtlebot遇到障碍停止而不是绕过去,应该怎么办

    • 古月

      古月 回复

      @Zeddy 如果用move_base的话只能调整参数做优化

  24. Gravatar 头像

    Lsj 回复

    古月大神你好,机器人导航中如果·构建好了一张地图,建好之后再次导入地图,进行给坐标点导航,那么如何确定机器人自身的坐标和地图的坐标系。接触ROS几个月的时间,学习途径是您的课程。

    • 古月

      古月 回复

      @Lsj 机器人自身的位置在odom坐标系,地图中的位置估计在map坐标系下

  25. Gravatar 头像

    回复

    请问古月大神,我建出来的.pgm都是4000*4000的,造成里面的地图显示很小,怎样更改.pgm的大小或者.pgm大小根据建出来的地图大小进行自适应。

  26. Gravatar 头像

    LY 回复

    古月老师,请问一下局部规划部分,如果自己想要实现其他的算法,(VFH、VFH+)。请问应从哪方面入手,需要照猫画虎地参考DWAPlanner吗?本人目前已阅读了DWA代码但仍未有头绪。 另外请问下机器人的代码只有launch文件,调用的都是ROS本身的文件,但命令行下载的方式未有源码。如果我在launch的文件夹内写VFHROS算法,如果让我的机器人识别呢? 问题有点多有点幼稚,谢谢古月老师~

    • 古月

      古月 回复

      @LY 1. 可以参考已有的源码,主要看这些算法是如何集成到ROS当中的
      2. launch是用来启动节点的,源码一般在github上,google搜一般都可以搜到

  27. Gravatar 头像

    杨杨 回复

    大神你好,我在运行跟随演示的时候出现了这样的错误,您能帮我看看吗?
    刚开始运行小车它会动一两秒之后就报错了。
    [mobile_base_nodelet_manager-3] process has died [pid 2621, exit code -6, cmd /opt/ros/kinetic/lib/nodelet/nodelet manager __name:=mobile_base_nodelet_manager __log:=/home/yangyunchuan/.ros/log/d5919b54-01f8-11e9-9ea3-54e1ad293bf2/mobile_base_nodelet_manager-3.log].
    log file: /home/yangyunchuan/.ros/log/d5919b54-01f8-11e9-9ea3-54e1ad293bf2/mobile_base_nodelet_manager-3*.log

    • 古月

      古月 回复

      @杨杨 程序跑飞了,具体问题看不出来,一般是由于缺少某些依赖导致的

  28. Gravatar 头像

    x 回复

    请问古月大神,我执行 roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml出现如下错误:
    [map_server-1] process has died [pid 30728, exit code -11, cmd /opt/ros/kinetic/lib/map_server/map_server /home/yangxing/catkin_ws/src/rbx1/rbx1_nav/maps/test_map.yaml __name:=map_server __log:=/home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/map_server-1.log].
    log file: /home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/map_server-1*.log
    [move_base-2] process has died [pid 30729, exit code -11, cmd /opt/ros/kinetic/lib/move_base/move_base __name:=move_base __log:=/home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/move_base-2.log].
    log file: /home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/move_base-2*.log
    [fake_localization-3] process has died [pid 30730, exit code -11, cmd /opt/ros/kinetic/lib/fake_localization/fake_localization base_pose_ground_truth:=odom __name:=fake_localization __log:=/home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/fake_localization-3.log].
    log file: /home/yangxing/.ros/log/a4bd051e-e7f3-11e8-9a38-c821589ea764/fake_localization-3*.log

    • 古月

      古月 回复

      @x 只能看到是map_server等节点挂了,但是看不到具体原因,有可能是软件依赖的问题,可以实现重新安装ros

  29. Gravatar 头像

    吴夏明 回复

    请问古月大神,[ERROR] [1541589865.586689704]: Map_server could not open /home/wxm/catkin_ws/src/rbx1/rbx1_nav/maps/test_map.ymal.
    [map_server-1] process has died [pid 13432, exit code 255, cmd /opt/ros/kinetic/lib/map_server/map_server /home/wxm/catkin_ws/src/rbx1/rbx1_nav/maps/test_map.ymal __name:=map_server __log:=/home/wxm/.ros/log/a87ab5a8-e27f-11e8-862c-a088698dbad5/map_server-1.log].
    log file: /home/wxm/.ros/log/a87ab5a8-e27f-11e8-862c-a088698dbad5/map_server-1*.log
    这个怎么解决啊?

  30. Gravatar 头像

    汪云云 回复

    古月大神请问一下,我想自己在.pgm地图上规划一条路线,然后让机器人根据规划出的固定路径移动,您能给些可行的思路吗?我自己想的是通过自己在地图上画的路线,来代替move_base自动规划的路径,但是不知道move_base规划路径是否提供可供修改的接口??

    • 古月

      古月 回复

      @汪云云 可以看下move_base的接口和API,相当于用你自己的路径代替move_base中的全局路径,我没试过

    • Gravatar 头像

      cxw 回复

      @汪云云 您好,请问您的问题解决的吗?我也想用一条固定的路径代替小车规划出来的路径,您有方法吗?

  31. Gravatar 头像

    ssssss 回复

    古月大神您好,我看几乎所有到move_base教程里都说:“作为机器人的全局路线。将来在算法上应该还会加入A*算法。” 听说13年就已经可以使用A*算法了,请问能不能指导下怎么在全局路径规划中使用A*算法呀

  32. Gravatar 头像

    ssssss 回复

    古月大神您好,我看几乎所有到move_base教程里都说:“作为机器人的全局路线。将来在算法上应该还会加入A*算法。” 听说13年就已经可以使用A*算法了,请问能不能指导下怎么在全局路径规划中使用A*算法呀

    • 古月

      古月 回复

      @ssssss 可以的,修改yaml配置文件,参考:http://wiki.ros.org/global_planner

  33. Gravatar 头像

    Parker 回复

    古月大神,您好!我的小车在跑导航时,有时会出现一直转圈最后导致线程死掉的现象(move_base里recovery behaviors清除障碍物均失败),遇到这种情况,我想让小车能避免这种卡死的情况,想问一下我应该在move_base里做哪些改动?谢谢!

    • 古月

      古月 回复

      @Parker 这个我不太清楚,可能需要看move_base的源码,看下为什么会死掉

  34. Gravatar 头像

    蛋黄 回复

    胡老师您好,有几个问题想请教:
    1.在使用movebase导航的时候,全局规划器规划出全局路径,局部规划器在控制机器人移动的过程中,每次移动的距离(步长)怎么看啊,或者怎么设定?
    2.规划出路线后,机器人移动的过程中使用局部规划器计算并发布速度,用controller_frequency参数设置的频率会产生什么影响?
    3.导航行驶的过程中,机器人是如何按照规划的路线行驶的,即,是按照规划出的路径一个点一个点的行走,还是根据局部规划器发布速度的频率每次计算局部最优路径行驶?

    • 古月

      古月 回复

      @蛋黄 1. 这个不太明白你的意思
      2. 发布频率和底层的机器人控制器有关系,只要底层控制器能够响应的过来,频率一般越高越好,可以提高控制精度。
      3. 是根据局部规划器发布速度的频率每次计算局部最优路径行驶
      算法的具体内容请参考move_base的相关wiki、源码、论文

  35. Gravatar 头像

    weitanwei 回复

    请问要怎样让turtlebot可以说出所有的路线,比如当向前走的时候会说向前,转左会说转左

    • 古月

      古月 回复

      @weitanwei 集成科大讯飞的SDK,然后在相应的运动时语音输出需要的字符串

  36. Gravatar 头像

    arialn 回复

    您好,我在用movebase进行导航的时候规划路径和实际路径差别很大,是哪里的参数调整的有问题么?

    • 古月

      古月 回复

      @arialn 主要是movebase启动时候的几个yaml配置文件,调整一下里边的参数

      • Gravatar 头像

        arialn 回复

        @古月 我在想是不是跟我没有输出footprint有关系...frame里没有footprint...导航的时候这个是必须的么?

        • 古月

          古月 回复

          @arialn footprint是一个坐标系,不是必须的,如果没有的话,要确定没有其他模块使用到这个坐标系,也就是参数配置里没有footprint相关的设置

  37. Gravatar 头像

    lx 回复

    您好,请教一下move_base是怎么控制机器人跟踪全局路径规划计算出来的路径的呢?麻烦您给些指导、提示,谢谢!

    • 古月

      古月 回复

      @lx 算法么?通过本地规划控制机器人尽量靠近全局路线,本地规划通过概率方法计算最优控制,具体要参考相关的论文

  38. Gravatar 头像

    ccc 回复

    胡老师你好,想问您一个问题。我把blank_map的地图换成自己的实验室的地图(hector_slam得到的地图map.pgm 和map.yaml),但是我在仿真机器人全局路径的时候,rviz中的机器人按照正方形路线行走,停留在原地,只是箭头在动,请问这是怎么回事啊?

    • 古月

      古月 回复

      @ccc 首先看下你的rviz中的固定坐标系对不对,应该是odom或者map,然后检查机器人有没有成功发布状态信息,也就是robot state publiesher和joint state publisher

      • Gravatar 头像

        ccc 回复

        @古月 rviz 下的坐标系是map,但是我发布一条最简单的topic rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped \'{ header: { frame_id: "map" }, pose: { position: { x: 1.0, y: 0, z:0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }',但是模拟机器人还是不动,我只是将书中的指令
        roslaunch rbx1_nav fake_move_base_blank_map.launch改为我自己的地图
        roslaunch rbx1_nav my_map.launch,也修改了fake_move_base_blank_map.launch文件下的map_server的参数args,我用rostopic list查看了只有/joint_states ,没有/robot state,请问下面该怎么办?谢谢了!

      • Gravatar 头像

        ccc 回复

        @古月 我用rostopic list 查看,只有/joint state话题,没有/robot state 话题,下面该怎么办啊?谢谢!!!

        • 古月

          古月 回复

          @ccc 检查launch里启动robot state publiesher了么,就是对照着《ROS by example》里边的例程检查修改

  39. Gravatar 头像

    言雨 回复

    您好,一直跟随您的教程学习ROS,想问下路径规划部分:规划出的全局路径数据和移动机器人行驶过程的实际路径数据可以分别存储吗,怎样存储呢或者哪里可找到呢,想比较一下两组数据。谢谢!

    • 古月

      古月 回复

      @言雨 你好,可以的,全局路径可以通过订阅路径的话题得到,实际路径就是小车的里程计变化,也可以通过订阅里程计信息得到。

  40. Gravatar 头像

    Joseph 回复

    古大神您好!我想请教一下,在您教程中带有障碍物的路径规划中,我想尝试改变机器人的初始位姿,让机器人的初始位置不在地图的原点处,不知道如何实现?需要使用amcl包还是只在launch文件中添加代码即可实现?麻烦您帮忙解答一下啦~

    • 古月

      古月 回复

      @Joseph 改一下地图yaml配置文件中的初始位置就行

      • Gravatar 头像

        Joseph 回复

        @古月 好的我试过可以了,谢谢!

  41. Gravatar 头像

    翎风 回复

    大神,在已知地图下进行路径规划的时候,初始位姿一定手动设置吗?能不能让机器人自己获得,我想过在未知初始位姿时,利用amcl定位在行进过程中及时更新当前位姿,这样好像也行,但是感觉不准确,不知道你有没有好的一些想法?还望多多指教,非常感谢,谢谢

    • Gravatar 头像

      翎风 回复

      @翎风 哇,不好意思,网页一直没有反应,就多点了几下,怎么删除不了?

    • 古月

      古月 回复

      @翎风 机器人初始位置比较难自动确定,需要将传感器信息和环境进行匹配,有可能存在传感器信息一致但是位置不同的情况,这方面我没深入了解过,没办法给你提供建议,找找论文吧

  42. Gravatar 头像

    杨辉 回复

    您好,这句话可以取消一个导航:rostopic pub /move_base/cancel actionlib_msgs/GoalID -- {}
    我想用python程序去取消导航,怎么把上面那句话翻译成python程序?也就是本次导航之前先把之前的导航清掉。
    谢谢!

    • 古月

      古月 回复

      @杨辉 你好,导航的命令是通过action实现的,action的低层通讯也是话题,所以你可以通过rostopic命令取消,也可以在node里发布这个话题。最好的方法还是使用action的接口,可以参考action的python API:http://docs.ros.org/jade/api/actionlib/html/classactionlib_1_1simple__action__client_1_1SimpleActionClient.html,里边有cancel_goal方法可以取消目标。

  43. Gravatar 头像

    zcr 回复

    博主您好,我的研究项目是用一辆汽车做自动驾驶,现在我有velodyne LIDAR,然后我想通过move base来输出速度传达给汽车的CAN,请问您能给我一些提示吗?谢谢

    • 古月

      古月 回复

      @zcr 您好,自动驾驶汽车也可以看成是一种自主移动机器人,所以使用ROS navigation框架的方法和移动机器人是一样的,需要输入雷达信息、里程计信息,输出速度控制指令,可以参考ROS教程中关于移动机器人使用navigation的方法,推荐《ROS by example》等英文教程

      • Gravatar 头像

        zcr 回复

        @古月 好的,我去找找看。谢谢博主,

  44. Gravatar 头像

    helloworld 回复

    博主你好,我在输入 roslaunch rbx1_nav fake_move_base_blank_map.launch
    后出现:
    core service [/rosout] found
    ERROR: cannot launch node of type [map_server/map_server]: map_server
    ROS path [0]=/opt/ros/kinetic/share/ros
    ROS path [1]=/home/cdl/catkin_ws/src
    ROS path [2]=/opt/ros/kinetic/share
    ERROR: cannot launch node of type [move_base/move_base]: move_base
    ROS path [0]=/opt/ros/kinetic/share/ros
    ROS path [1]=/home/cdl/catkin_ws/src
    ROS path [2]=/opt/ros/kinetic/share
    上述错误,我在launch文件夹下面找到了fake_move_base_blank_map.launch 文件,就是启动不了,同时,我也source devel/setup.bash了,还是不行。请问怎么办?

  45. Gravatar 头像

    yang 回复

    你好,我现在用ros命令停止导航节点,rosnode kill /auto_checkpoints.节点停止了,当时机器人依然在导航。请问大神,遇到过这样的问题吗?代码和您的一样,我只更换了导航点坐标

    • Gravatar 头像

      yang 回复

      @yang 求大神解惑

    • 古月

      古月 回复

      @yang 导航是一个action,试一下cancel这个action

      • Gravatar 头像

        yang 回复

        @古月 在shutdown函数中调用了cancel_goal(),但是我打印move_base话题,在取消之后,程序输出了其他的目标点,我感到很奇怪,我使用python版本的

      • Gravatar 头像

        yang 回复

        @古月 大神可以试试,不用ctrl+c的方法,用rosnode kill nodename的方法,回出现同样的效果吗?

  46. Gravatar 头像

    我要做机器人 回复

    让机器人前进1m的时候报这个错,用的是kinetic版本的,大神解惑
    [ WARN] [1495769419.640069435]: The goal sent to the navfn planner is off the global costmap. Planning will always fail to this goal.
    [ WARN] [1495769420.647139837]: The goal sent to the navfn planner is off the global costmap. Planning will always fail to this goal.

  47. Gravatar 头像

    颜正杰 回复

    你好,古月大神,这路径规划的有没有代码呀?

  48. Gravatar 头像

    Hansen 回复

    ERROR: cannot launch node of type [map_server/map_server]: map_server
    ROS path [0]=/opt/ros/indigo/share/ros
    ROS path [1]=/home/hzz/catkin_ws/src
    ROS path [2]=/opt/ros/indigo/share
    ROS path [3]=/opt/ros/indigo/stacks
    ERROR: cannot launch node of type [move_base/move_base]: move_base
    ROS path [0]=/opt/ros/indigo/share/ros
    ROS path [1]=/home/hzz/catkin_ws/src
    ROS path [2]=/opt/ros/indigo/share
    ROS path [3]=/opt/ros/indigo/stacks
    请问这是什么错误,下载了这两个包也不行,编译不通过。

      • Gravatar 头像

        丰丰 回复

        @古月 我也是这个问题,不知道有解决吗

      • Gravatar 头像

        杨木 回复

        @古月 我也有这个问题,之前可以顺利跑,在工作空间里面加了一个新的包,把整个工作空间都编译了一下,但是没通过。又把新的包删除了,后来再跑这个就出现了上面的问题,这是怎么回事?

        • 古月

          古月 回复

          @杨木 仔细检查功能包是否安装成功,还有环境变量的设置

          • Gravatar 头像

            茉莉 回复

            @古月 月哥,编译时出现如下错误:
            CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
            Could NOT find Bullet (missing: BULLET_DYNAMICS_LIBRARY
            BULLET_COLLISION_LIBRARY BULLET_MATH_LIBRARY BULLET_SOFTBODY_LIBRARY
            BULLET_INCLUDE_DIR)
            Call Stack (most recent call first):
            /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
            /usr/share/cmake-2.8/Modules/FindBullet.cmake:76 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
            map_server/CMakeLists.txt:11 (find_package)
            -- Configuring incomplete, errors occurred!
            See also "/home/moli/catkin_ws/build/CMakeFiles/CMakeOutput.log".
            See also "/home/moli/catkin_ws/build/CMakeFiles/CMakeError.log".
            Invoking "cmake" failed

  49. Gravatar 头像

    天羽军 回复

    您好,此文章中,我在运行这个命令:roslaunch rbx1_nav fake_move_base_blank_map.launch 的时候出现这个
    [ WARN] [1461203683.399138352]: Detected jump back in time. Clearing TF buffer.
    [move_base-2] process has died [pid 8817, exit code -11, cmd /opt/ros/indigo/lib/move_base/move_base __name:=move_base __log:=/home/exbot/.ros/log/adeb2d14-0763-11e6-bb5d-000c29e5426d/move_base-2.log].
    log file: /home/exbot/.ros/log/adeb2d14-0763-11e6-bb5d-000c29e5426d/move_base-2*.log、、、、、问题不断,,,求解

    • 古月

      古月 回复

      @天羽军 你好,这个例程是ros by example上的,你看一下ros版本和代码版本和书上的是否一致,应该不会有这么多问题的。

    • Gravatar 头像

      comedy 回复

      @天羽军 你好,这个问题我也遇到了,你的解决了没有呢?如何解决的呢?多谢

    • Gravatar 头像

      jiahui dai 回复

      @天羽军 你好,你的问题解决了吗?解决方法能不能说一下?

      • Gravatar 头像

        steveluo 回复

        @jiahui dai 从git上下载move_base的源码,与rbx的源码放在一起然后编译,究其原因是因为movebase的版本不是最新版本(版本号一样未必源码是一样的,有一些bug的修复不计版本号)
        参看:http://blog.csdn.net/improve100/article/details/50721004

        • Gravatar 头像

          上帝之手 回复

          @steveluo 请问navigation包和rbx1包不冲突吗,我之前装了rbx1没有出现问题,但现在编译了navigation包,就出现了上述类似的问题,请问如何解决这个问题,您是如何解决的呢?

  50. Gravatar 头像

    天羽军 回复

    您好,此文章中,我在运行这个命令:roslaunch rbx1_nav fake_move_base_blank_map.launch 的时候出现这个ERROR: cannot launch node of type [map_server/map_server]: map_server,,,求解!!!

    • Gravatar 头像

      天羽军 回复

      @天羽军 我用此命令安装时sudo apt-get install ros-indigo-map-server ros-indigo-fake-localization,,,显示未发现这两个包,,求解决办法

    • Gravatar 头像

      星空 回复

      @天羽军 我也遇到赖这个问题,请问是怎么解决的?

    • Gravatar 头像

      星空 回复

      @天羽军 我也遇到了这个问题,请问是怎么解决的?

  51. Gravatar 头像

    zy 回复

    请问古月大神,我如果在ROS环境下想要进行双机定位,比如利用两个turtlebot互相确定对方的坐标,这个该如何确定?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据