无人机整机
反无人机系统
通信设备
导航与控制
动力与能源
任务载荷
发射与回收
材料与制造
无人机用品
无人机通用件
无人机租赁
无人机培训
当前位置:全球无人机网 » 无人机技术 » 技术 » 正文

上海硅步ROS连载系列48期 移动机器人自主导航

发布日期:2018-06-01  来源:上海硅步  作者:上海硅步我要投稿我要评论

本期通过对turtlebot的Kinect深度传感器进行地图构建,并通过路径规划完成自主导航。

ROS定位导航的框架图如图1所示:

图1 ROS导航定位框架

其中move_base提供了ROS导航的配置、运 行、交互接口,它主要包括两个部分:

(1) 全局路径规划(global planner):根据给定的目标位置进行总体路 径的规划;

(2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线 规划。

 

1.数据结构

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

   

2.配置文件

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

l  base_local_planner_params.yaml

l  costmap_common_params.yaml

l  global_costmap_params.yaml

l  local_costmap_params.yaml

 

3.全局路径规划

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

 

4.本地实时规划(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)重复上面过程。

 

5.ArbotiX仿真

安装ArbotiX模拟器:

$ sudo aptitude install   ros-indigo-arbotix –y

   

下载rbx1例子:

$ cd catkin_ws/src

$ git clone   https://github.com/pirobot/rbx1.git

   

为了简化,我们暂时使用空白地图(blank_map.pgm)在空地上进行无障碍仿真。首先运行ArbotiX节点,并且加载机器人的URDF文件:

$ roslaunch rbx1_bringup   fake_turtlebot.launch

   

然后运行move_base和加载空白地图的launch文件(fake_move_bas

e_blank_map.launch):

$ roslaunch rbx1_nav   fake_move_base_blank_map.launch

   

该文件的具体内容如下:

    

    

 

    

 

    

    

 

  

   

其中调用了fake_move_base.launch文件,是运行move_base节点并进行参数配置。

然后调用rviz就可以看到机器人了(如图2所示):

$ rosrun rviz rviz –d   ~/ catkin_ws /src/rbx1/rbx1_nav/nav_obstacles.rviz

图2 使用Rviz进行TurtleBot仿真

我们先以1m的速度进行一下测试, 让机器人前进一米:

$   rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped '{header: {frame_id:"base_link"},pose:{position:{x:1,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中的轨迹如图3:

图3 TurtleBot运动轨迹

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

图4 TurtleBot自主导航

 

6.ArbotiX仿真——带有障碍物的路径规划

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

$   rosrun rbx1_nav move_base_square.py

   

在rviz中可以看到图5所示的结果:

图5 TurtleBot绕正方形路径运动

图5中四个顶角的粉色圆盘就是我们设定的位置,正方形比较规则,可见定位还是比较准确的。TurtleBot绕正方形路径运动的代码如下:

#!/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)

           # 设定正方形的尺寸,默认是一米

           square_size =   rospy.get_param("~square_size", 1.0) # meters

 

           #创建一个列表,保存目标的角度数据

           quaternions = list()

 

           #定义四个顶角处机器人的方向角度

           #将上面的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)

 

           #创建一个列表存储导航点的位置

           waypoints = list()

 

           #创建四个导航点的位置(角度和坐标位置)

          waypoints.append(Pose(Point(square_size,   0.0, 0.0), quaternion s[0]))

          waypoints.append(Pose(Point(square_size,   square_size, 0.0), quaternions[1])) s[2]))

waypoints.append(Pose(Point(0.0,   square_size, 0.0), quaternion

                 waypoints.append(Pose(Point(0.0, 0.0,   0.0), quaternions[3]))

 

              #初始化可视化标记

              self.init_markers()

 

            #给每个定点的导航点一个可视化标记

              p = Point()

              p = waypoint.position

              self.markers.points.append(p)

 

              #发布TWist消息控制机器人

              self.cmd_vel_pub =   rospy.Publisher('cmd_vel', Twist)

 

            #订阅move_base服务器的消息

              self.move_base =   actionlib.SimpleActionClient("move_base", Move

baseAction)

 

           rospy.loginfo("Waiting for   move_base action server...")

 

           # 等待move_base服务器建立

             self.move_base.wait_for_server(rospy.Duration(60))

 

           rospy.loginfo("Connected to   move base server")

           rospy.loginfo("Starting   navigation test")

 

           #初始化一个计数器,记录到达的顶点号

           i = 0

 

 

           # 主循环,环绕通过四个定点

           while i < 4 and not   rospy.is_shutdown():

               # 发布标记指示四个目标的位置,每个周期发布一起                 self.marker_pub.publish(self.markers)

 

               #初始化goal为MovebaseGoal类型

               goal = MovebaseGoal()

   

在实际中,往往需要让机器人自动躲避障碍物。move_base包的一个强大的功能就是可以在全局规划的过程中自动躲避障碍物,而不影响全局路径。障碍物可以是静态的(比如墙、桌子等),也可以是动态的(比如人走过)。现在我们尝试在之前的正方形路径中加入障碍物。

把之前运行fake_move_base_blank_map.launch的终端停止(Ctrl­C)掉,然后运行:

$   roslaunch rbx1_nav fake_move_base_obstacle.launch

   

运行结果如图6所示,在rviz中出现了障碍物:

图6 Rviz中出现的障碍物

然后再运行之前绕正方形运动的节点:

$   rosrun rbx1_nav move_base_square.py

   

这回可以看到,在全局路径规划的时候,机器人已经将障碍物绕过去了,如图7所示:

图7 TurtleBot避障

图7中,中间的线是障碍物,周围红色的椭圆形是根据配置文件中的inflation_radius参数计算出来的安全缓冲区。全局规划的路径基本已经是最短路径了。在仿真的过程中也可以动态重配置那四个配置文件,修改仿真参数。

 

7.实物测试

首先启动turtlebot:

$   roscore

   

 

$   roslaunch turtlebot_bringup minimal.launch

   

运行地图绘制demo:

$   roslaunch turtlebot_navigation maping_demo.launch

   

打开rviz查看地图:

$   roslaunch turtlebot_rviz_launchers view_navigation.launch

   

通过键盘控制机器人移动,建立地图:

$   roslaunch turtlebot_teleop keyboard.launch

   

    建图过程如图8所示:

图8 TurtleBot建图

此时,可以选中2D Pose Estimate,然后用鼠标选中一个位置单击鼠标左键,机器人就会移动至你所指定的位置。

要保存建立的地图,运行:

$   rosrun map_server map_saver –f /tmp.my_map

   

要加载保存过的地图,运行:

$roslaunch   turtlebot_navigation amcl_demo.launch

map_file:=/tmp/my_map.yaml

   

接下来的操作和上面一样,机器人会根据你指定的位置进行自主导航。

 
本文链接:http://www.81uav.cn/tech/201806/01/752.html
标签:  上海硅步
0条 [查看全部]  相关评论
免责声明:凡注明来源全球无人机网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,请注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

图文推荐

推荐品牌

论坛新贴

会员
会员及权限
会员注册
会员登录
完善资料
修改会员资料
找回密码
常见问题
产品
查找产品
发布采购
发布产品
招聘
查找招聘
发布招聘
查找简历
发布简历
培训
发布培训课程
发布培训需求
查找培训课程
展会
展会合作
查找展会
发布展会
租赁
查找租赁服务
发布租赁需求
发布租赁任务
文章
发布新闻
发布技术
发布百科
投稿指南
本站服务
网站广告
VIP会 员
新闻营销
专题策划
活动赞助
商务访谈
关于本站
操作手册
网站简介
网站招聘
联系我们
服务介绍
版权隐私
战略合作
联系我们
客服热线:0759-2216160
广告合作: 2539058330(QQ)
展会合作: 2751594898(QQ)
Copyright©2005-2017 81UAV.CN All Rights Reserved  访问和使用全球无人机网,即表明您已完全接受和服从我们的用户协议。 ICP备案号:粤ICP备15079343号-1 SITEMAPS 网站地图 网站留言
运营商: 湛江中龙网络科技有限公司 全球无人机网 
全国公安机关 备案信息 可信网站不良举报 文明转播