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

72648
165
2016年2月19日 23时08分

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

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

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

一、数据结构

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

 

rosmsg show MoveBaseActionGoal  
  
[move_base_msgs/MoveBaseActionGoal]:  
std_msgs/Header header  
  uint32 seq  
  time stamp  
  string frame_id  
actionlib_msgs/GoalID goal_id  
  time stamp  
  string id  
move_base_msgs/MoveBaseGoal goal  
  geometry_msgs/PoseStamped target_pose  
    std_msgs/Header header  
      uint32 seq  
      time stamp  
      string frame_id  
    geometry_msgs/Pose pose  
      geometry_msgs/Point position  
        float64 x  
        float64 y  
        float64 z  
      geometry_msgs/Quaternion orientation  
        float64 x  
        float64 y  
        float64 z  
        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)。
ROS探索总结(十四)—— move_base(路径规划)插图(1)
        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 
        该文件的具体内容如下:

 

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

 

 

        其中调用了fake_move_base.launch文件,是运行move_base节点并进行参数配置。
        然后调用rviz就可以看到机器人了。
        rosrun rviz rviz -d `rospack find rbx1_nav`/nav_fuerte.vcg 
        ROS探索总结(十四)—— move_base(路径规划)插图(2)
        我们先以1m的速度进行一下测试:
        让机器人前进一米:

 

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

 

 

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

 

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

 

 

        在rviz中的轨迹图如下:

 

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

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

        首先我们让机器人走一个正方形的路线。先通过上面的命令,让机器人回到原始位置(0,0,0),然后按reset按键,把所有的箭头清除。接着运行走正方形路径的代码:
        rosrun rbx1_nav move_base_square.py 
        在rviz中可以看到:
ROS探索总结(十四)—— move_base(路径规划)插图(5)
        四个顶角的粉色圆盘就是我们设定的位置,正方形比较规则,可见定位还是比较准确的。然我们先来分析一下走正方形路线的代码:

 

#!/usr/bin/env python  
import roslib; roslib.load_manifest('rbx1_nav')  
import rospy  
import actionlib  
from actionlib_msgs.msg import *  
from geometry_msgs.msg import Pose, Point, Quaternion, Twist  
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal  
from tf.transformations import quaternion_from_euler  
from visualization_msgs.msg import Marker  
from math import radians, pi  
  
class MoveBaseSquare():  
    def __init__(self):  
        rospy.init_node('nav_test', anonymous=False)  
          
        rospy.on_shutdown(self.shutdown)  
          
        # How big is the square we want the robot to navigate?  
        # 设定正方形的尺寸,默认是一米  
        square_size = rospy.get_param("~square_size", 1.0) # meters  
          
        # Create a list to hold the target quaternions (orientations)  
        # 创建一个列表,保存目标的角度数据  
        quaternions = list()  
          
        # First define the corner orientations as Euler angles  
        # 定义四个顶角处机器人的方向角度(Euler angles:http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92)  
        euler_angles = (pi/2, pi, 3*pi/2, 0)  
          
        # Then convert the angles to quaternions  
        # 将上面的Euler angles转换成Quaternion的格式  
        for angle in euler_angles:  
            q_angle = quaternion_from_euler(0, 0, angle, axes='sxyz')  
            q = Quaternion(*q_angle)  
            quaternions.append(q)  
          
        # Create a list to hold the waypoint poses  
        # 创建一个列表存储导航点的位置  
        waypoints = list()  
          
        # Append each of the four waypoints to the list.  Each waypoint  
        # is a pose consisting of a position and orientation in the map frame.  
        # 创建四个导航点的位置(角度和坐标位置)  
        waypoints.append(Pose(Point(square_size, 0.0, 0.0), quaternions[0]))  
        waypoints.append(Pose(Point(square_size, square_size, 0.0), quaternions[1]))  
        waypoints.append(Pose(Point(0.0, square_size, 0.0), quaternions[2]))  
        waypoints.append(Pose(Point(0.0, 0.0, 0.0), quaternions[3]))  
          
        # Initialize the visualization markers for RViz  
        # 初始化可视化标记  
        self.init_markers()  
          
        # Set a visualization marker at each waypoint   
        # 给每个定点的导航点一个可视化标记(就是rviz中看到的粉色圆盘标记)  
        for waypoint in waypoints:             
            p = Point()  
            p = waypoint.position  
            self.markers.points.append(p)  
              
        # Publisher to manually control the robot (e.g. to stop it)  
        # 发布TWist消息控制机器人  
        self.cmd_vel_pub = rospy.Publisher('cmd_vel', Twist)  
          
        # Subscribe to the move_base action server  
        # 订阅move_base服务器的消息  
        self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)  
          
        rospy.loginfo("Waiting for move_base action server...")  
          
        # Wait 60 seconds for the action server to become available  
        # 等待move_base服务器建立  
        self.move_base.wait_for_server(rospy.Duration(60))  
          
        rospy.loginfo("Connected to move base server")  
        rospy.loginfo("Starting navigation test")  
          
        # Initialize a counter to track waypoints  
        # 初始化一个计数器,记录到达的顶点号  
        i = 0  
          
        # Cycle through the four waypoints  
        # 主循环,环绕通过四个定点  
        while i < 4 and not rospy.is_shutdown():  
            # Update the marker display  
            # 发布标记指示四个目标的位置,每个周期发布一起,确保标记可见  
            self.marker_pub.publish(self.markers)  
              
            # Intialize the waypoint goal  
            # 初始化goal为MoveBaseGoal类型  
            goal = MoveBaseGoal()  
              
            # Use the map frame to define goal poses  
            # 使用map的frame定义goal的frame id  
            goal.target_pose.header.frame_id = 'map'  
              
            # Set the time stamp to "now"  
            # 设置时间戳  
            goal.target_pose.header.stamp = rospy.Time.now()  
              
            # Set the goal pose to the i-th waypoint  
            # 设置目标位置是当前第几个导航点  
            goal.target_pose.pose = waypoints[i]  
              
            # Start the robot moving toward the goal  
            # 机器人移动  
            self.move(goal)  
              
            i += 1  
          
    def move(self, goal):  
            # Send the goal pose to the MoveBaseAction server  
            # 把目标位置发送给MoveBaseAction的服务器  
            self.move_base.send_goal(goal)  
              
            # Allow 1 minute to get there  
            # 设定1分钟的时间限制  
            finished_within_time = self.move_base.wait_for_result(rospy.Duration(60))   
              
            # If we don't get there in time, abort the goal  
            # 如果一分钟之内没有到达,放弃目标  
            if not finished_within_time:  
                self.move_base.cancel_goal()  
                rospy.loginfo("Timed out achieving goal")  
            else:  
                # We made it!  
                state = self.move_base.get_state()  
                if state == GoalStatus.SUCCEEDED:  
                    rospy.loginfo("Goal succeeded!")  
                      
    def init_markers(self):  
        # Set up our waypoint markers  
        # 设置标记的尺寸  
        marker_scale = 0.2  
        marker_lifetime = 0 # 0 is forever  
        marker_ns = 'waypoints'  
        marker_id = 0  
        marker_color = {'r': 1.0, 'g': 0.7, 'b': 1.0, 'a': 1.0}  
          
        # Define a marker publisher.  
        # 定义一个标记的发布者  
        self.marker_pub = rospy.Publisher('waypoint_markers', Marker)  
          
        # Initialize the marker points list.  
        # 初始化标记点的列表  
        self.markers = Marker()  
        self.markers.ns = marker_ns  
        self.markers.id = marker_id  
        self.markers.type = Marker.SPHERE_LIST  
        self.markers.action = Marker.ADD  
        self.markers.lifetime = rospy.Duration(marker_lifetime)  
        self.markers.scale.x = marker_scale  
        self.markers.scale.y = marker_scale  
        self.markers.color.r = marker_color['r']  
        self.markers.color.g = marker_color['g']  
        self.markers.color.b = marker_color['b']  
        self.markers.color.a = marker_color['a']  
          
        self.markers.header.frame_id = 'map'  
        self.markers.header.stamp = rospy.Time.now()  
        self.markers.points = list()  
  
    def shutdown(self):  
        rospy.loginfo("Stopping the robot...")  
        # Cancel any active goals  
        self.move_base.cancel_goal()  
        rospy.sleep(2)  
        # Stop the robot  
        self.cmd_vel_pub.publish(Twist())  
        rospy.sleep(1)  
  
if __name__ == '__main__':  
    try:  
        MoveBaseSquare()  
    except rospy.ROSInterruptException:  
        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  
        这回我们可以看到,在全局路径规划的时候,机器人已经将障碍物绕过去了,下过如下图:
ROS探索总结(十四)—— move_base(路径规划)插图(6)
        在上图中,黑色的线是障碍物,周围浅色的椭圆形是根据配置文件中的inflation_radius参数计算出来的安全缓冲区。全局规划的路径基本已经是最短路径了。在仿真的过程中也可以动态重配置那四个配置文件,修改仿真参数。

 

发表评论

后才能评论

评论列表(165条)

  • 夜雨声烦烦烦 2020年7月8日 下午5:00

    古月老师您好,想向您请教一下,我在github上下载了一个源码,运行gazebo一切都正常,在运行启动rviz的时候会报错下面这个:
    [tb3_0/move_base-3] process has died [pid 16916, exit code -6, cmd /opt/ros/melodic/lib/move_base/move_base cmd_vel:=cmd_vel odom:=odom __name:=move_base __log:=/home/sln/.ros/log/eed05f2a-c0f5-11ea-9662-4439c439b431/tb3_0-move_base-3.log].
    [tb3_1/move_base-6] process has died [pid 16933, exit code -6, cmd /opt/ros/melodic/lib/move_base/move_base cmd_vel:=cmd_vel odom:=odom __name:=move_base __log:=/home/sln/.ros/log/eed05f2a-c0f5-11ea-9662-4439c439b431/tb3_1-move_base-6.log].
    log file: /home/sln/.ros/log/eed05f2a-c0f5-11ea-9662-4439c439b431/tb3_1-move_base-6*.log
    [tb3_2/move_base-9] process has died [pid 16946, exit code -6, cmd /opt/ros/melodic/lib/move_base/move_base cmd_vel:=cmd_vel odom:=odom __name:=move_base __log:=/home/sln/.ros/log/eed05f2a-c0f5-11ea-9662-4439c439b431/tb3_2-move_base-9.log].
    log file: /home/sln/.ros/log/eed05f2a-c0f5-11ea-9662-4439c439b431/tb3_2-move_base-9*.log

    是一个多车自主导航的源码,rviz能够启动,但是设定目标点没有反应,请问这个可能是因为什么原因导致的问题?

  • 2020年6月12日 上午8:24

    古月老师您好, 想向你请教一下, move_base一般是基于激光slam的, 基于视觉slam是可行的吗? 比如修改为使用orb-slam2, 并用rgbd相机生成点云. 请老师点拨一下, 谢谢!

  • 084u0_5233 2020年6月7日 下午10:18

    大佬问一下,就是我是全电脑仿真,没有实体机器人。在movebase仿真的时候不能出现障碍膨胀区,小车的方向和标记方向不一样,小车也不停闪烁,但是幅度不大也在差不多的位置。然后2d nav goal也没有用。但是我另一个同学的小车用一样的movebase代码就没有这个情况,我猜是小车的位置出错了,您能指点一下吗?

  • 胡十三刀 2020年5月29日 下午5:18

    古月老师您好,向您请教一下,我在学习模拟导航时怎么无法运动啊,用的是github下载的rbx1源码。
    1.roslaunch rbx1_bringup fake_turtlebot.launch
    出现黄色提示:xacro: Traditional processing is deprecated,估计是老版本的模型文件,后来我自己建了一个模型文件sim_car.urdf,里面只有一个简单的立方体。
    然后替换了launch文件里加载模型的参数:
    替换成 然后就没有黄色提示了。
    2.roslaunch rbx1_nav fake_move_base_blank_map.launch
    3.rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
    以上都跑起来了,都没有报错,rviz里也出现了模型

    但是存在以下问题:
    1.用键盘控制来测试rosrun teleop_twist_keyboard teleop_twist_keyboard.py
    只有odometry的红色箭头在移动,模型不移动,我估计跟自建模型有关系吧,但是还没想出来怎么改。
    2.运行rosrun rbx1_nav nav_square.py测试,但是完全没反应,而且箭头也不动
    提示以下错误
    [INFO] [1590742562.608280]: Waiting for move_base action server…
    [INFO] [1590742622.616944]: Connected to move base server
    [INFO] [1590742622.617452]: Starting navigation test
    [INFO] [1590742682.619143]: Timed out achieving goal
    [INFO] [1590742742.622729]: Timed out achieving goal
    [INFO] [1590742802.627544]: Timed out achieving goal
    [INFO] [1590742862.629792]: Timed out achieving goal
    [INFO] [1590742862.630759]: Stopping the robot…
    3.使用2D Nav Goal测试,终端上会出现定位点,但是rviz没有任何反应,模型也不动
    4.使用rqt_graph查看节点,发现一个问题,map_server发布的/map话题是独立的,跟其他任何节点没有关联,是不是这里的问题导致的,move_base不是应该订阅/map话题吗,怎么没有订阅呢?
    5.我又用源码按照上面的顺序跑了一下,除了启动arbotix时出现黄色提示,其他情况是一模一样的,为什么用源码也跑不出效果来呢,我什么都没有改呀
    后来我又找了另一个源码来跑,问题是一样的,用2D Nav Goal定位没有任何反应。

    我用的ubuntu虚拟机,ubuntu16.04,ros版本是kinetic
    请老师指点一下,这个问题困扰我一周了,从网上查的各种教学资料基本都是一样的,看别人讲的很简单,不知道我这里为什么就是跑不出效果

    • 胡十三刀 回复 胡十三刀 2020年5月30日 下午12:27

      唉,被我自己给蠢哭了。
      终于找到原因了,总觉得很奇怪我的move_base怎么没有订阅move_base_simple/goal话题,
      原来以前做其他的测试时,别的目录里也有一个move_base的包,并且也编译过。
      这里始终跑的是另一个move_base,而不是导航包里的move_base.
      把原来那个包改成其他名字,再跑一次,一切都对了。
      my god…搞了这么久,原来是个低级错误

  • 酱油 2020年5月15日 下午10:04

    古月老师你好,请问我在rviz中用2D Nav Goal给出全局规划后,我的小车却不能沿着路线行驶,而是乱跑,代码都是使用教材中的,运行也没有报错,用arbotix仿真也正常,ROS使用的版本是melodic,已经卡了好几天了,请求老师救援,谢谢老师。

    • 古月 回复 酱油 2020年5月15日 下午11:07

      如果你使用的是Kinetic或之前版本的代码,需要修改下URDF模型中差速控制插件的方向,melodic和之前版本方向刚好相反,比如以前是向左转,M版本里就是向右转,这个需要调换一下

    • 酱油 回复 古月 2020年5月16日 下午1:22

      十分感谢老师,问题解决了。

  • 优柔寡断 2019年8月27日 下午3:23

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

  • 初见 2019年7月14日 下午3:48

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

    • 小乖 回复 初见 2019年7月18日 下午4:56

      请问大神,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

    • 古月 回复 小乖 2019年7月18日 下午7:48

      感觉坐标系有问题

  • xman 2019年7月14日 下午1:41

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

    • 古月 回复 xman 2019年7月18日 下午7:29

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

  • leo 2019年7月2日 下午5:16

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

    • 古月 回复 leo 2019年7月2日 下午8:54

      这个不了解

    • qbw 回复 古月 2019年7月2日 下午10:18

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

  • 谭东旭 2019年6月25日 上午9:36

    古月大神,您好,我按照您的视频运行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用不了)。

  • hdy 2019年6月24日 下午4:48

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

    • 古月 回复 hdy 2019年6月28日 上午10:19

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

  • 谭东旭 2019年6月24日 下午1:25

    请问古月大神,我看了您的视频,运行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

  • 木东 2019年6月4日 下午3:36

    古月老师,您好,在您的《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竟连接起来了,想问一下是怎么回事

  • 木东 2019年6月3日 上午10:45

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

    • 古月 回复 木东 2019年6月4日 上午10:34

      例程并没有启动move_base3

    • 木东 回复 古月 2019年6月4日 上午11:11

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

  • Zz 2019年6月1日 下午4:28

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

  • 泽宇 2019年5月31日 下午3:37

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

    • 古月 回复 泽宇 2019年6月1日 上午8:11

      一个是全局路径,一个是实时速度

  • Raspi 2019年5月30日 下午7:17

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

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

    • 古月 回复 Raspi 2019年5月31日 上午9:58

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

  • 汪云云 2019年5月24日 下午4:15

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

    • 古月 回复 汪云云 2019年5月25日 下午9:32

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

    • tjy 回复 汪云云 2019年5月28日 下午3:36

      你好 请教一下 我的包里没有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.
      不知道 您有没有遇到过

  • leo 2019年4月25日 下午3:11

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

    • 古月 回复 leo 2019年4月25日 下午7:46

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

    • leo 回复 古月 2019年4月28日 上午11:17

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

    • 古月 回复 leo 2019年4月28日 上午11:43

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

  • naruto 2019年4月20日 下午4:29

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

  • pigorange 2019年3月8日 下午5:55

    老师您好,之前发的评论好像被吞掉了。感谢您上次的建议,我回去学习了一些相关的内容,有了一些收获。但是仍然还有一些疑问存在,还请和您共同探讨下,谢谢。
    第一个问题就是,我后面找到了在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代码来做相关的测试吗?

    • 古月 回复 pigorange 2019年3月9日 下午4:12

      这个我就不清楚了,没深入研究过这部分代码

    • PJ 回复 pigorange 2019年10月26日 下午12:08

      你好,你的第二个问题解决了吗?

  • pigorange 2019年3月4日 下午3:30

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

    • 古月 回复 pigorange 2019年3月5日 上午9:01

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

    • pigorange 回复 古月 2019年3月5日 下午7:19

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

    • pigorange 回复 古月 2019年3月8日 下午5:43

      老师您好,我查阅了一些资料也有一些收获,但是又有些新的疑问还请您赐教下。第一个就是我发现在修改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或是没有完善的地方吗?

    • 古月 回复 pigorange 2019年3月9日 下午4:12

      这个我就不清楚了,没深入研究过这部分代码

    • 陈伟伟 回复 pigorange 2019年4月25日 上午10:23

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

  • lll 2019年2月26日 上午9:20

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

    • 古月 回复 lll 2019年2月28日 下午9:09

      源码在github上,wiki上找链接

  • cby 2019年2月25日 下午10:39

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

    • 古月 回复 cby 2019年2月28日 下午9:09

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

    • rex ruan 回复 古月 2019年4月21日 下午10:08

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

    • 古月 回复 rex ruan 2019年4月21日 下午11:07

      小车嵌入式驱动板里的程序

  • nico 2019年2月21日 上午9:26

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

    • 古月 回复 nico 2019年2月21日 上午11:49

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

  • 2019年2月14日 下午5:26

    您好,使用源码安装 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包,在调用上述例程,却可以运行。
    请问您知道原因吗?

    • 古月 回复 2019年2月14日 下午10:37

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

    • 梅宏 回复 2019年4月3日 下午2:20

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

  • 三石 2019年1月25日 上午10:22

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

    • 古月 回复 三石 2019年1月25日 下午2:58

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

    • 三石 回复 古月 2019年1月26日 上午9:26

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

    • 古月 回复 三石 2019年1月26日 下午5:00

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

    • 李磊 回复 古月 2019年1月27日 下午10:11

      我看到的那个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

    • 古月 回复 李磊 2019年2月8日 下午3:51

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

  • Zeddy 2019年1月21日 下午4:43

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

    • 古月 回复 Zeddy 2019年1月22日 下午4:29

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

  • Lsj 2019年1月21日 下午4:41

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

    • 古月 回复 Lsj 2019年1月22日 下午4:29

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

  • 2019年1月14日 上午11:04

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

  • LY 2018年12月20日 下午5:11

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

    • 古月 回复 LY 2018年12月20日 下午7:53

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

  • 杨杨 2018年12月17日 下午8:48

    大神你好,我在运行跟随演示的时候出现了这样的错误,您能帮我看看吗?
    刚开始运行小车它会动一两秒之后就报错了。
    [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

    • 古月 回复 杨杨 2018年12月18日 下午4:14

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

  • x 2018年11月14日 上午10:10

    请问古月大神,我执行 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 2018年11月14日 下午8:27

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

  • 吴夏明 2018年11月7日 下午7:30

    请问古月大神,[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
    这个怎么解决啊?

    • 古月 回复 吴夏明 2018年11月12日 下午8:29

      test_map.ymal拼写错误了吧,难道不是test_map.yaml?

  • 汪云云 2018年11月6日 下午4:07

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

    • 古月 回复 汪云云 2018年11月6日 下午7:57

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

    • 汪云云 回复 古月 2018年11月8日 下午5:07

      嗯嗯,好的。非常感谢您!

    • cxw 回复 汪云云 2018年12月21日 上午10:03

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

  • ssssss 2018年10月30日 上午9:53

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

  • ssssss 2018年10月30日 上午9:53

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

    • 古月 回复 ssssss 2018年11月2日 下午3:55

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

  • Parker 2018年10月9日 上午12:25

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

    • 古月 回复 Parker 2018年10月9日 下午7:16

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

    • Parker 回复 古月 2018年10月15日 上午10:36

      好的,谢谢!

  • 蛋黄 2018年9月30日 上午9:37

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

    • 古月 回复 蛋黄 2018年10月3日 上午12:43

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

  • weitanwei 2018年9月1日 下午12:10

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

    • 古月 回复 weitanwei 2018年9月3日 上午9:57

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

  • arialn 2018年5月30日 上午8:22

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

    • 古月 回复 arialn 2018年5月30日 上午10:58

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

    • arialn 回复 古月 2018年5月30日 下午3:45

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

    • 古月 回复 arialn 2018年5月31日 上午11:47

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

  • lx 2018年4月17日 下午1:44

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

    • 古月 回复 lx 2018年4月18日 下午2:00

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

    • lx 回复 古月 2018年4月19日 上午11:37

      好的,谢谢您。

  • ccc 2018年4月14日 下午4:58

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

    • 古月 回复 ccc 2018年4月16日 上午10:46

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

    • ccc 回复 古月 2018年4月16日 下午2:48

      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,请问下面该怎么办?谢谢了!

    • ccc 回复 古月 2018年4月16日 下午2:52

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

    • 古月 回复 ccc 2018年4月16日 下午6:13

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

  • 言雨 2018年3月25日 下午4:52

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

    • 古月 回复 言雨 2018年3月26日 下午1:49

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

  • Joseph 2018年3月18日 下午4:13

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

    • 古月 回复 Joseph 2018年3月19日 上午9:59

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

    • Joseph 回复 古月 2018年3月19日 下午6:07

      好的我试过可以了,谢谢!

  • 翎风 2018年3月2日 下午2:51

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

    • 翎风 回复 翎风 2018年3月2日 下午2:56

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

    • 古月 回复 翎风 2018年3月2日 下午6:00

      没关系,我删掉了

    • 古月 回复 翎风 2018年3月2日 下午6:02

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

  • 杨辉 2018年1月31日 下午6:45

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

    • 古月 回复 杨辉 2018年1月31日 下午7:09

      你好,导航的命令是通过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方法可以取消目标。

  • zcr 2018年1月17日 上午12:46

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

    • 古月 回复 zcr 2018年1月17日 上午9:34

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

    • zcr 回复 古月 2018年1月17日 下午1:38

      好的,我去找找看。谢谢博主,

  • helloworld 2017年12月14日 上午11:40

    博主你好,我在输入 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了,还是不行。请问怎么办?

    • 古月 回复 helloworld 2017年12月14日 下午6:40

      没有装navigation包吧,map_server和move_base都找不到

    • helloworld 回复 古月 2017年12月25日 下午4:09

      你好,老师。根据您的指导,我下载了navigation包,放在了catkin_ws/src文件夹下,但是我运行 rosrun rviz rviz -d `rospack find rbx1_nav`/nav_fuerte.rviz后,在rviz中只看到了turtlebot机器人,无法加入Odometry,请问怎么办?

    • 古月 回复 helloworld 2017年12月25日 下午6:42

      你看下你用的rbx1_nav包里的配置文件名是不是nav_fuerte.rviz,这个是老版本ROS fuerte的,用包里与ROS版本匹配的配置文件

    • helloworld 回复 古月 2017年12月25日 下午7:17

      老师你好,我运行rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz可以了,另外我想问一下老师,这个例子能用在无人机避障的实验中吗?

    • 古月 回复 helloworld 2017年12月26日 上午10:37

      move_base只能控制平面机器人,无人机不能直接用

    • 天天 回复 helloworld 2018年2月27日 下午2:07

      你好,我也遇到了关于ERROR: cannot launch node of type [map_server/map_server]: map_server的问题,请问你是怎麽解决的?

  • yang 2017年10月27日 下午6:03

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

    • yang 回复 yang 2017年10月27日 下午6:05

      求大神解惑

    • 古月 回复 yang 2017年10月28日 下午9:34

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

    • yang 回复 古月 2017年10月30日 上午9:15

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

    • yang 回复 古月 2017年10月30日 上午9:17

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

  • 我要做机器人 2017年5月26日 上午11:32

    让机器人前进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.

    • 古月 回复 我要做机器人 2017年5月27日 上午10:43

      警告目标处于地图之外,加载的地图尺寸是不是有问题

    • 丁丁 回复 我要做机器人 2018年1月8日 下午7:51

      你好,我也遇到了这个问题,请问你解决了么?

  • 颜正杰 2017年4月19日 下午8:39

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

  • Hansen 2017年3月22日 下午1:40

    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
    请问这是什么错误,下载了这两个包也不行,编译不通过。

    • 古月 回复 Hansen 2017年3月23日 下午3:44

      找不到功能包,检查一下launch文件

    • 丰丰 回复 古月 2017年4月16日 下午3:31

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

    • 古月 回复 丰丰 2017年4月19日 上午9:10

      找不到包的问题

    • 杨木 回复 古月 2017年8月15日 下午5:15

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

    • 古月 回复 杨木 2017年8月16日 下午8:46

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

    • 茉莉 回复 古月 2017年9月6日 上午8:55

      月哥,编译时出现如下错误:
      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

    • 古月 回复 茉莉 2017年9月6日 上午9:37
    • 茉莉 回复 古月 2017年9月6日 下午5:53

      月哥我已解决,感谢回复,嘿嘿.

    • Justiiin 回复 茉莉 2018年1月23日 下午3:39

      我也出现了这个错误 请问是如何解决的? 麻烦了

  • 天羽军 2016年4月20日 下午6:59

    您好,此文章中,我在运行这个命令: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、、、、、问题不断,,,求解

    • 古月 回复 天羽军 2016年4月20日 下午9:30

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

    • comedy 回复 天羽军 2016年5月30日 下午2:39

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

    • jiahui dai 回复 天羽军 2016年7月22日 下午5:02

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

    • steveluo 回复 jiahui dai 2016年7月29日 下午6:32

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

    • 上帝之手 回复 steveluo 2016年11月3日 下午9:37

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

  • 天羽军 2016年4月20日 上午10:27

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

    • 天羽军 回复 天羽军 2016年4月20日 下午4:36

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

    • 天羽军 回复 天羽军 2016年4月20日 下午6:57

      此问题已解决!

    • 青虎 回复 天羽军 2017年7月5日 上午10:04

      如何解决的?

    • 张驰要当学霸 回复 天羽军 2016年6月15日 下午4:53

      无法打开map_server那个我也遇到过,将catkin_ws工作区删除重新建立新的catkin_ws工作区可以解决。别忘了source下setup.bash

    • 闫安 回复 张驰要当学霸 2017年3月3日 下午2:02

      我也是这个问题。。。请问如何解决?

    • 星空 回复 天羽军 2017年1月24日 下午11:03

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

    • 星空 回复 天羽军 2017年1月24日 下午11:03

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

  • zy 2016年3月19日 下午4:32

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

    • 古月 回复 zy 2016年3月20日 下午10:14

      没有全局坐标系么?