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

评论

66条评论
  1. Gravatar 头像

    lx 回复

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

    • 古月

      古月 回复

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

  2. 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》里边的例程检查修改

  3. Gravatar 头像

    言雨 回复

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

    • 古月

      古月 回复

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

  4. Gravatar 头像

    Joseph 回复

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

    • 古月

      古月 回复

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

      • Gravatar 头像

        Joseph 回复

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

  5. Gravatar 头像

    翎风 回复

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

    • Gravatar 头像

      翎风 回复

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

    • 古月

      古月 回复

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

  6. 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方法可以取消目标。

  7. Gravatar 头像

    zcr 回复

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

    • 古月

      古月 回复

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

      • Gravatar 头像

        zcr 回复

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

  8. 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了,还是不行。请问怎么办?

  9. 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的方法,回出现同样的效果吗?

  10. 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.

  11. Gravatar 头像

    颜正杰 回复

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

  12. 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

  13. 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包,就出现了上述类似的问题,请问如何解决这个问题,您是如何解决的呢?

  14. 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 头像

      星空 回复

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

  15. Gravatar 头像

    zy 回复

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

发表评论

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