YanZhirun's Blog

机器人项目

研二下学期接手机器人项目,采用Turtlebot展开学习,目标实现银行导领机器人,减轻甚至逐步取代大堂经理的工作。以下内容默认采取ROS indigo版本。

本文包括环境配置过程中遇到的问题、demo调试、ROS包分析以及对SLAM学习的内容,本文随项目进度记录要点而非完整过程。如遇到相似问题可通过sa615371@mail.ustc.edu.cn 与本人讨论,共同解决。

参考手册遇到问题

Tips

  1. 部分命令包含中文字符

  2. 注意文档中命令存在 大小写,多空格等错误

  3. 对应 版本不一致

安装配置注意事项与问题解决方案

  1. 添加源,需要和ubuntu 版本对应 如14.04 对应trusty

    发行版代号查看lsb_release -sc

  2. ROS版本,如14.04安装indigo版ROS

    安装Turtlebot对应软件E: Unable to locate package ros-groovy-turtlebot-apps

    ROS 与 Ubuntu版本要对应

    Ubuntu 14.04对应Indigo 版本的ROS

    之前尝试安装groovy对应的是12.04版,所以apt-get 找不到对应包,

  1. 环境变量

    看英文资料要注意细节

  2. 无法运行rosbash roslaunch 等命令

    环境变量设置出错,官方wiki提供说明

  3. 键盘无法操控

不支持usb 3.0,bios中禁用usb3.0。未测试的[解决方案](http://learn.turtlebot.com/2015/02/01/8/)。
1
these have occurred because Kinect isn’t compatible with USB 3.0. Plug it into a USB 2.0 port. (Problems can also occur with USB 2.0 ports that are 3.0 compatible.).
  1. 无法找到设备

    缺少驱动,厂家提供了64位驱动不可使用,自行编译x86平台驱动,摄像头可以正常工作,但是加载3d launch仍然无法工作。

参考厂商网站kinect 3d sensor教程

depth image无法显示。

kinectdriver

  1. 其他

demo测试

  • 不开启Turtlebot笔记本,开启电源,按下底座B0按钮,可以在桌子上运动,悬崖传感器确保不会掉下桌子。

  • 仅运行一次roscore即可,如需要恢复初始状态,可重新启动roscore。

  • 系统对硬件有一定要求,部分型号笔记本可能无法正常使用,尝试更换。

  • 建议在搭建环境测试demo的同时,参考官方wiki学习。

  • 配备远程工作站会有利于开发。由于ROS支持分布式运算,建议大型程序运行在工作站。

  • 以下demo均需配备Turtlebot笔记本(可运行ROS的ubuntu,具有usb2.0接口)

  • 工作站开启rviz界面需要确保Turtlebot笔记本与工作站网段配置正确。

基础知识:

  • 需要设置环境变量确保ROS能够准确定位文件。

  • roscore 用来显式启动ROS的节点管理器,用来实现节点间的通讯。如果运行中中断,再次连接后当前运行的其他节点也无法重新连接,需要重启所有节点。底层通讯通过HTTP完成,本质是一个HTTP服务器。通常地址为本机11311端口。

  • roslaunch工具用来一次性启动多个节点,会自动启动roscore,或使用当前已运行的roscore。

  • rosrun 一次只能启动一个节点。

  • 节点通讯利用消息传递。消息存放在话题中。节点发布(Publish)或者订阅(Subscribe)消息对应的话题。节点不需要显式知道其他节点是否存在,消息并不通过节点管理器转交。

  • rqt_graph用于查看节点构成图。其本身也是一个节点。/rosout节点用于生成日志信息。

  • URDF(Unified Robot Description Format)统一机器人描述格式。ROS中的urdf功能包包含一个URDF的C++解析器,URDF文件使用XML格式描述机器人模型

工作站配置与检测

TurtleBot端(IP: IP_OF_TURTLEBOT)

  • deb安装 添加到 ~.bashrc

  • source 安装 添加到 ~/catkin_ws/devel/setup.bash

$ export ROS_MASTER_URI=http://localhost:11311

$ export ROS_HOSTNAME=IP_OF_TURTLEBOT

工作站端(IP:IP_OF_PC)

  • 添加到 ~/.bashrc

echo export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311
echo export ROS_HOSTNAME=IP_OF_PC

验证连接

工作站运行

rostopic list
rostopic echo /diagnostics

如果报warning 检查Turtlebot上ROS_MASTER_URI设置是否正确

rostopic pub -r 10 /hello std_msgs/String “hello”

TurtleBot运行

rostopic echo /hello

键盘控制

单纯的运动控制,不包含避障功能。运行在移动终端会方便操作。

1
2
3
$roscore
$roslaunch turtlebot_bringup minimal.launch
$roslaunch turtlebot_teleop keyboard_teleop.launch

三条命令分别在不同终端窗口运行,运行过程不可关闭。
第三条命令可运行在工作站,或者通过手机ssh到turtlebot笔记本,方便控制。

核心包:move_base

###构建地图

1
2
3
4
5
6
7
8
9
$roscore
$roslaunch turtlebot_bringup minimal.launch
$roslaunchturtlebot_navigation gmapping_demo.launch
//上述命令运行在turtlebot笔记本
$roslaunch turtlebot_rviz_launchers view_navigation.launch //建议运行在工作站
$roslaunch turtlebot_teleop keyboard_teleop.launch //建议运行在移动终端
$rosrun map_server map_saver -f /path/to/save/my_map //地图保存,保存后确认在指定目录下生成my_map.yaml和my_map.pgm两个文件

核心包:gmapping

自动导航与路径规划

1
2
3
4
5
6
7
8
$roscore
$roslaunch turtlebot_bringup minimal.launch
$roslaunch turtlebot_navigation amcl_demo.launch map_file:=/path/to/map/map.yaml
//odom received!才表示加载成功,中间有些warning可以忽略
//以上命令运行在turtlebot笔记本
$rosrun rviz rviz -d `rospack find rbx1_nav`/nav_test.rviz //消耗大量资源,建议运行在工作站

核心包:

  • amcl
  • move_base

前往指定点

使用git上的demo

其中包含前进,带有避障的前进,前往地图上特定点等python程序。可以直接使用。

在rviz中的地图找到对应坐标,在前一部分demo的基础上,直接在新终端运行即可。可以关闭rviz,rviz会占用大量资源和带宽。rviz仅为了方便观察机器人状态信息。

命令行发布消息

命令行驱动turtlebot运动的关键点

1
$rostopic pub /cmd_vel_mux/input/teleop geometry_msgs/Twist -1 -- '[0.2,0,0]' '[0,0,0]'

关键点:查找相关 topic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$rostopic list -v // 列出发布和订阅的话题及其类型的详细信息
//如,Twist消息控制运动
//cmd_vel_mux/input/switch [geometry_msgs/Twist] 1 subscriber
$rostopic echo /cmd_vel_mux
$rosmsg show geometry_msgs/Twist
$rostopic pub -1 [topic] [msg_type] [args]
//通过pub发布数据到某个正在广播的话题上,如下
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
//-1 代表发出一条消息后立刻退出 或者 使用参数 -r 3 代表以3Hz频率发表
//双破折号代表后面接的是参数而非命令
$rosrun rqt_graph rqt_graph
//个显示当前系统运行情况的动态图形
$rosrun rqt_plot rqt_plot
//绘制正在发布的数据变化图形,在弹出窗口中Topic输入框输入/turtlebot1/pose

常用工具

话题列表
rosnode list
显示出指定话题里发布的任何消息
rostopic echo /rosout 反斜杠“/”表明该节点名称属于全局命名空间

查看节点构成的计算图
rosrun rqt_graph rqt_graph

测量发布频率 有两个命令可以用来测量消息发布的频率以及这 些消息所占用的带宽:

rostopic hz topic-name rostopic bw topic-name

这些命令订阅指定的话题,并且输出一些统计量,其中第一 条命令输出每秒发布的消息数量,第二条命令输出每秒发布消息 所占的字节量。

查看话题

rostopic info topic-name

核心包分析

move_base

move_base包提供了一个动作的实现(参见actionlib包),在地图上给定一个目标,move_base将会规划出路径并使机器人避开障碍物从而到达目标。详见:http://wiki.ros.org/move_base

move_base节点将全局导航和局部导航链接在一起以完成其导航任务。全局导航用于建立到地图上最终目标或一个远距离目标的路径,局部导航用于建立到近距离目标和为了临时躲避障碍物的路径。

运行move_base 节点需要调节相应的参数,机器人半径,移动速度等,配置文件位于rbx1_nav包下turtlebot/config/ 包含以下四个文件

base_local_planner_params.yaml
global_costmap_params.yaml
costmap_common_params.yaml
local_costmap_params.yaml

由于turtlebot搭载的笔记本较宽,调整机器人半径以避免碰撞。

全剧路径规划(global planner)

通过navfn包实现。

  • Dijkstra最优路径算法
  • A*算法。
本地实时规划(local planner)

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

  1. 采样当前状态
  2. 针对每个采样速度,计算以该速度形式一段时间后的状态,得出行驶路线
  3. 利用评价标准评分
  4. 根据评分,选择最优路径
  5. 重复

amcl

amcl是移动机器人在2D环境中的概率定位系统。它实现了自适应(或KLD采样)蒙特卡罗定位方法,其使用粒子滤波器来针对已知的地图跟踪机器人的位姿。目前情况下,该节点仅能使用激光扫描数据和激光雷达地图来工作。

amcl接收基于激光的地图,激光扫描和tf变换消息,并输出位姿估计。在启动时,amcl根据提供的参数初始化其粒子滤波器。注意,如果没有设置初始化参数,则根据默认值初始滤波器状态将是以(0,0,0)为中心的中等大小的粒子云。在rviz中可以通过2D Pose Estimate按钮来初始化位姿。

`ospack find amcl`` 查找对应包位置

gmaping

ROS 提供的 gmaping 包用于生成地图,它是对著名的开源 OpenSlam 包在 ROS 框架下的一个实现。这个包提供了对激光设备的 Slam,根据激光设备的输入和姿态数据从而建立一个基于网格的的2D地图。它需要从 ROS 系统监听许多 Topic,并输出一个 Topic——map(nav_msgs/OccupancyGrid),这也是 RViz 的输入 Topic。

官方wiki 提供两个包,openslam_gmapping包是正宗源码,提供各种函数和接口供调用,gmapping包则是实现的一个机器视觉工程

ROS坐标框架

移动平台坐标框架命名惯例及语义

参考官网REP 部分内容翻译如下

1.base_link
base_link 可以以任意位置和角度与移动底座刚性相连。对于任意的硬件平台都会有一个明显的参考点提供相对位置信息。

2.odom
odom是一个世界坐标系。移动平台的位置在odom 框架中可以无限制的任意漂移。这种漂移使得odom 框架不能作为长期稳定的全局位置参考。但是,机器人的位置在odom 框架中是连续的,这意味着移动平台的位置在odom 框架中总是平滑无离散跳跃的。

在典型的设置中,odom 框架的计算基于里程计信息,如轮式里程计(wheel odometry)和视觉里程计(visual odometry)或者其他的惯性测量装置。

odom 框架作为精确的短期的局部参考是精确的,但是漂移让它不能作为长期的参考的框架。

3.map
map 是一个拥有指向天空的z轴的世界坐标系。移动平台的位置不能随着时间有明显的漂移。map 框架不是连续的,意味着移动平台的位置可以在任意时间有离散的跳跃。

在典型的设置中,定位组件根据传感器的观测值不断重新计算机器人在map 框架中的位置。因此消除了漂移,但是当新的传感器数据到达时会导致离散的跳跃

map 框架作为长期的全局参考是有效的,但是位置估计中的离散跳跃使得它在局部感知的表现不好。

通常设置x轴指向东,y轴指向北,z轴竖直向上。z为海平面。

map的配置文件为map_name.yaml,如下:

1
2
3
4
5
6
image: /home/ros/Desktop/map-307_std.pgm
resolution: 0.050000
origin: [-13.800000, -1.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

image为静态地图路径
resolution为地图分辨率,meters/pixel 像素与坐标间的倍数关系
origin即为坐标原点
occupied_thresh为单元占用概率大于这个阈值则认为完全占用(不可到达)
free_thresh单元占用概率小于该值则认为完全自由(可通过)
negate黑色/白色占用

4.earth
earth 框架用于不同map 框架下多个机器人的交互。如果在多个机器人运行在同一个地图中,可以不需要。如果有多个地图并且机器人之间桥接数据则需要该框架。

框架间关系

选择树形结构来表示坐标框架间的关系,每个坐标框架仅有一个父节点,可以有任意个孩子节点。关系如下:

尽管直观上mapodom 应该和base_link 直接相连,但是仅允许有一个父节点。
上图仅是最小表示。可以插入一些其他的连接提供额外的功能,但是基本的拓扑图应该和上图相同。

框架权限

从odom到base_link的转化由一个里程计计算和发布。
从map到base_link有定位组件计算。然而定位组件不会发布从map到base_link的转换。相反,它首先接收从odom到base_link的转换,并使用该信息来广播从地图到odom的转换。
从earth到map的转换是通过选择地图框架进行静态发布和配置的。如果没有特别配置,回退位置将使用小车的初始位置作为地图框架的原点。

地图间的转换

当机器人移动一个较远的距离是,预期会需要在地图之间进行转换。
在地图间移动时,定位框架有责任重新确定odom框架。计算map到odom框架的一个常见实现方法是将定位修复map到base_link减去odom到base_link的结果。当选择哪一个map框架时会隐式的处理。(翻译过来应该是这个意思,可能是从map到odom的结果,需要进行减法处理,不太明白

odom 框架的一致性

在地图之间转换时,不应该影响测量框架(可能是里程计信息的框架)。
应该调整在odom框架中收集数据的保留策略。以便在集成位置的误差积累到足够使数据失效之前丢弃旧的或者较远的数据(避免累积误差的数据处理方式)。
由于机器人里程计精度不同,这些策略会有很大不同。

SLAM学习

基础知识了解

SLAM包括定位、建图和路径规划三块内容。

地图构建主要是环境表达方式和传感器数据的解释。

定位是追踪和全局定位

研究方向主要是图像前端、优化后端、闭环检测三个部分。

RGB-D SLAM

  • 安装软件
    • OpenCV
    • PCL(点云处理)

图像到点云的转换

显示RGB和Depth图像

1
2
3
4
5
6
7
$roscore
$roslaunch freenect_launch freenect.launch
//报warning忽略即可
$rosrun image_view image_view image:=/camera/rgb/image_color
//显示RGB图像
$ rosrun image_view disparity_view image:=/camera/depth/disparity
//显示深度图像

显示图片和3d图像

1
2
3
4
$roscore
$roslaunch turtlebot_bringup minimal.launch
$roslaunch turtlebot_bringup 3dsensor.launch
$roslaunch turtlebot_rviz_launchers view_robot.launch

人脸识别

1
2
3
4
5
6
7
$roscore
$roslaunch openni_launch openni.launch
$roslaunch freenect_launch freenect.launch
$roslaunch rbx1_vision face_detector.launch
//人脸识别
$roslaunch rbx1_vision good_features.launch
//关键点检测

骨架追踪

1
2
3
4
$roscore
$roslaunch openni_launch openni.launch
$roslaunch skeletcon_makers markers_from_tf.launch
$rosrun rviz rviz -d `rospack find skeleton_markers`/markers_from_tf.rviz

参考资料

ros版本对应

在Ubuntu中安装ROS Indigo

TurtleBot

rosbash

源码安装环境

Network Configuration

INSTALLING OPENNI, NITE, SENSORKINECT ON UBUNTU 12.04

论坛入门

在已知地图上导航方法

kinect介绍

kinect骨骼跟踪

官方wiki提供中文社区

http://www.itwendao.com/article/detail/164397.html

OpenSLAM gmapping

ROS坐标框架