发布询价单
您的位置:首页 > 资讯 > 企业动态 > 正文

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

2018-06-01 08:30 性质:转载 作者:上海硅步 来源:上海硅步
免责声明:无人机网(www.youuav.com)尊重合法版权,反对侵权盗版。(凡是我网所转载之文章,文中所有文字内容和图片视频之知识产权均系原作者和机构所有。文章内容观点,与本网无关。如有需要删除,敬请来电商榷!)
本期通过对turtlebot的Kinect深度传感器进行地图构建,并通过路径规划完成自主导航。ROS定位导航的框架图如图1所示:图1ROS导航定位框架其中mo...

本期通过对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

   

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

硅步机器人(Gaitech Robotics) 是专业提供机器人整体解决方案的创新型公司,在香港、首尔、台北、上海、山东五地拥有分支机构。硅步的业务和合作伙伴遍布全球多个国家,拥有健全的销售和服务网络。同时硅步拥有一支国际化的高水平技术团队,致力于为客户提供业内领先的产品、技术和专业的服务。公司目前主要业务是基于ROS(Robot Operating System)系统的智能机器人的集成、生产、销售和技术支持服务。

硅步机器人于2016年3月参与投资了加拿大Agile Sensor Technologies Inc.(www.agilesensors.com),致力于机器人电机控制系统、无人机飞行稳定系统、智能相机和高性能传感器等技术和产品的研究和开发。

硅步机器人联合协作移动机器人技术先驱西班牙Robotnik公司和协作机械臂国际知名公司北京遨博智能共同研发了工业智能移动抓取机器人JR2,它代表了目前国际上协作机器人的最高技术水平,有着巨大的市场潜力。

考虑到山东的人文环境、地理区位、产业基础等多个有利因素,硅步机器人于2017年3月斥资3亿元在山东邹城建造了科教无人机及工业机器人研发生产基地。这意味着硅步机器人正式进入机器人生产、加工产业链条,与研发和销售互为有效补充,标志着硅步机器人的发展从此迈上一个新的台阶。

同时,硅步所属企业积极参与了多项国家自然科学基金和973项目,拥有多项产品专利和软件著作权。在引进消化吸收国际先进技术的同时,硅步所属企业与国内科研单位紧密合作,不断创新,加速中国智造的前进步伐。

网友评论
文明上网,理性发言,拒绝广告

相关资讯

推荐图文

关注官方微信

手机扫码看新闻