ROS进阶(一):机器人平台搭建

声明:ROS进阶教程参考了《ROS机器人开发实践》,由胡春旭老师所著。此系列教程唯一目的是学习与分享,与大家共勉。若感兴趣,请大家购买原版书籍进行学习,侵权删。

通过本教程,您将会了解到以下内容:

  • 什么是机器人?
  • 一个完整的机器人系统包含哪些部分?
  • 如何构建一个真实的机器人系统?

一、机器人的定义

机器人形态各异,不完全类似与人的样子,如下所示:

机器人这个词的诞生可追溯到20世纪初。1920年捷克斯洛伐克作家卡雷尔·恰佩克在他的科幻小说《罗萨姆的机器人万能公司》中,根据Robota(捷克文,原意为“劳役”)和Robotnik(波兰文,原意为“工人”)创造出“Robot”(机器人)这个词。

百度百科关于机器人的解释是:“机器人是自动执行工作的机器装置,它既可以接收人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作,如生产业、建筑业,或是危险的工作。”

美国机器人协会(RIA)关于机器人的定义是:“机器人是用以搬运材料、零件、工具的可编程的多功能操作器或是通过可改变程序动作来完成各种作业的特殊机械装置。”

我国科学家对机器人的定义是:“机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器。”

国际标准化组织(ISO)对机器人描述如下:
1)机器人的动作机构具有类似于人或者其他生物体的某些器官(肢体、感受等)的功能。
2)机器人具有通用性,工作种类多样,动作程序灵活易变。
3)机器人具有不同程度的智能,如记忆、感知、推理、决策、学习等。
4)机器人具有独立性,完整的机器人系统在工作中可以不依赖于人的干预。

机器人内涵是丰富的,随着科技不断进步,未来机器人的定义也必将发生改变,下一代机器人将涵盖更广泛的概念。以往并未定义成机器人的物体也将机器人化,如无人驾驶汽车、智能家电、智能手机、智能住宅等。

二、机器人的组成

机器人是一个机电一体化的设备,从控制的角度来看,机器人系统可以分成四大部分,即执行机构、驱动系统、传感器系统和控制系统,如下图所示。

各部分之间的控制关系如下图所示。

1、执行机构

执行机构是直接面向工作对象的机械装置,相当于人体的手和脚。根据不同的工作对象,适用的执行机构也不同。室内移动机器人一般采用直流电机作为移动的执行机构,而机械臂一般采用位置或力矩控制,需要使用伺服作为执行机构。

2、驱动系统

驱动系统负责驱动执行机构,将控制系统下达的命令转换成执行机构需要的信号,相当于人体的肌肉。不同执行机构使用的驱动也是不同的。直流电机采用较为简单的PWM驱动板,而伺服则需要专业的伺服驱动器,工业上也常用气压、液压驱动执行机构。

3、传感系统

传感系统主要完成信号的输入和反馈,包括内部传感和外部传感系统,相当于人体的感官和神经。

4、控制系统

控制系统进行信息处理,输出控制命令,类似于人的大脑。机器人的控制系统需要基于处理器实现,一般常用ARM、x86等架构的处理器,其性能不同,可以根据机器人的应用选择。在处理器之上,控制系统需要完成机器人的算法处理、关节控制、人机交互等丰富功能。

三、机器人系统搭建

本教程以Turtlebot3机器人为例,介绍机器人系统搭建过程。

1、Turtlebot3简介

Turtlebot3(简称TB3)是继Turtlebot2之后,又一款ROS官方打造的基于kinetic(Ubuntu16的ROS版本)的软硬件学习平台,更小,更便宜,更好玩。

有许多有趣的游戏可以边玩边学:

赛道竞速
物体夹取
迷宫找出口

2、硬件介绍

以TB3-burger机器人为例进行硬件介绍。

(1)尺寸和质量

整体尺寸为138mm×178mm×192mm,轮高66mm,轮间距160mm。

(2)组成结构

Part Name
Chassis Parts Waffle Plate
Plate Support M3x35mm
Plate Support M3x45mm
PCB Support
Wheel
Tire
Ball Caster
Motors DYNAMIXEL (XL430-W250-T)
Boards OpenCR1.0
Raspberry Pi 3
USB2LDS
Sensors LDS-01 (HLS-LFCD2)
Memorys MicroSD Card
Cables Raspberry Pi 3 Power Cable
Li-Po Battery Extension Cable
DYNAMIXEL to OpenCR Cable
USB Cable
Powers SMPS 12V5A
A/C Cord
LIPO Battery 11.1V 1,800mAh
LIPO Battery Charger
Tools Screw driver
Rivet tool
Miscellaneous PH_M2x4mm_K
PH_T2x6mm_K
PH_M2.5x8mm_K 16
PH_T2.6x12mm_K 16
PH_M2.5x16mm_K 4
PH_M3x8mm_K 44
NUT_M2.5 20
NUT_M3 16
Rivet_1 14
Rivet_2 2
Spacer 4
Bracket 5
  • 执行机构

本体由三层空间构成,可通过扩展板调整机器人大小,执行机构较为简单,由两个直流电机带动主动轮,配合一个从动轮实现机器人移动。

  • 驱动系统

TB3-burger搭载一块如下图所示的主控板OpenCR,其中集成了电源驱动、电机驱动以及传感器接口等底层驱动功能。

OpenCR视频介绍:

OpenCR 07 Introduction
Melody 的视频

OpenCR详细介绍:

ROBOTIS e-Manual

  • 传感器系统

内部传感器主要是惯性测量单元(IMU)。IMU惯性传感器内部一般含有三轴的加速度计和三轴的陀螺仪。其中,加速度计用于输出物体在载体坐标系统中的三个坐标轴方向上的加速度信息,而陀螺仪用于输出载体相对于导航坐标系的三个坐标轴方向上的角速度信息,很据载体在三维空间中的角速度以及加速度值解算出对应的姿态。基于惯性传感器的定位方法主要优点是不依赖外部条件就可实现移动机器人定位,短时精度比较好。缺点就是随着时间的增长会有飘移,比较小的常数误差被积分后都会无限变大。

外部传感器有360°激光测距传感器LDS-01,用于实现建图、导航等功能。

(3)基于 Raspberry Pi的控制系统

主控板可以通过串口与控制系统通信,所以在控制系统硬件的选择上具有较大灵活性。主要有以下两种方案。

  • 使用单处理器

直接使用PC作为控制系统平台,控制系统的功能在PC上使用ROS系统实现,通过USB串口与TB3主控通信,采集机器人信息并控制机器人移动。这种方案简单易用,处理器性能强大,可以很快实现ROS中的功能;但PC体积较大,灵活性欠佳,接口种类、数量较少,而且无法进行远程监控,不作为推荐方案。

  • 使用多处理器

针对第一种方案的缺陷,可以利用ROS的分布式特性,使用第二台PC实现远程监控,但还是无法解决其他问题。常用“PC+嵌入式系统”的方案:嵌入式系统具有灵活性强、接口丰富、功耗低等特点,可在机器人上搭载嵌入式系统作为本体的控制系统,此外再配合PC,实现远程监控、图形化显示,以及处理复杂功能的运算。

控制系统结构如下图所示:

嵌入式系统选择有很多,TB3选择Raspberry Pi作为嵌入式系统平台。Raspberry Pi上搭载了Ubuntu系统,运行ROS。考虑到性能问题,Raspberry Pi主要实现与主控板的通信、外部传感器(摄像头、激光雷达等)的数据采集、其他外设连接等控制系统的基础功能。PC端运行需要图形化显示以及高性能处理的上层ROS功能包(图像处理、SLAM、导航等)。两者分工明确,使用无线网络通信。

四、快速配置TB3机器人

以下教程参考Turtlebot官网,详情请参考:

1、PC端配置

本文在Ubuntu18.04 + ROS melodic环境下完成,其他ROS版本类似。

(1)下载并安装Ubuntu18.04 LTS

(2)在PC上安装ROS 1以及相关功能包

  • 使用Ctrl + Alt + T打开终端,然后输入以下命令:
$ sudo apt update
$ sudo apt upgrade
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_melodic.sh
$ chmod 755 ./install_ros_melodic.sh 
$ bash ./install_ros_melodic.sh

如果以上安装失败,请参阅 the official ROS1 Melodic installation guide 

  • 安装相关的ROS 1软件包
$ sudo apt-get install ros-melodic-joy ros-melodic-teleop-twist-joy \
  ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc \
  ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan \
  ros-melodic-rosserial-arduino ros-melodic-rosserial-python \
  ros-melodic-rosserial-server ros-melodic-rosserial-client \
  ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server \
  ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro \
  ros-melodic-compressed-image-transport ros-melodic-rqt* \
  ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers
  • 安装TB3功能包
$ sudo apt-get install ros-melodic-dynamixel-sdk
$ sudo apt-get install ros-melodic-turtlebot3-msgs
$ sudo apt-get install ros-melodic-turtlebot3
  • 设置TB3型号名称

将默认的TURTLEBOT3_MODEL名称设置为您的模型。在终端输入以下命令。

如果是TB3 Burger:

$ echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc

如果是TB3 Waffle Pi:

$ echo "export TURTLEBOT3_MODEL=waffle_pi" >> ~/.bashrc

(3)网络配置

  • 将PC连接到WiFi设备,并使用以下命令查找分配的IP地址。
$ ifconfig
  • 打开.bashrc文件并更新ROS IP设置。
$ sudo gedit ~/.bashrc

使用从上述终端窗口获取的IP地址,修改ROS_MASTER_URI和ROS_HOSTNAME中localhost的地址。

  • 使用以下命令刷新.bashrc文件
$ source ~/.bashrc

2、SBC配置

(1)准备microSD卡

您需要一个微型SD卡读卡器才能在PC或笔记本电脑上刻录OS映像。

(2)启动Raspberry Pi

  • 将显示器的HDMI电缆连接到Raspberry Pi的HDMI端口。
  • 将输入设备连接到Raspberry Pi的USB端口。
  • 插入microSD卡。
  • 连接电源(通过USB或OpenCR)以打开Raspberry Pi。

(3)配置Raspberry Pi

  • 使用默认的用户名(ubuntu)和密码(ubuntu)登录。登录后,系统会要求您更改密码。
  • 打开自动更新设置文件。
$ sudo nano /etc/apt/apt.conf.d/20auto-upgrades

如下,更改更新设置。

APT::Periodic::Update-Package-Lists "0"; 
APT::Periodic::Unattended-Upgrade "0";
  • 输入以下命令以配置WiFi网络设置。
$ sudo nano /etc/netplan/50-cloud-init.yaml

打开编辑器后,在文件末尾附加以下内容。将WIFI_SSID和WIFI_PASSWORD替换为您的wifi SSID和密码。

  • 重启树莓派
$ sudo reboot
  • 设置systemd以防止启动延迟,即使启动时没有网络也是如此。运行以下命令设置对systemd进程的掩码。
$ systemctl mask systemd-networkd-wait-online.service
  • 禁用挂起和休眠
$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
  • 安装并启用SSH
$ sudo apt install ssh
$ sudo systemctl enable --now ssh
$ reboot
  • 重新启动Raspberry Pi后,如果希望使用SSH在远程PC上工作,请在远程PC终端上使用以下命令。默认密码是ubuntu。
$ ssh ubuntu@{IP Address of Raspberry PI}

(4)安装ROS Melodic Morenia以及相关功能包

  • 向终端输入以下命令:
$ sudo apt-get update
$ sudo apt-get upgrade
$ wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_melodic_rp3.sh
$ chmod 755 ./install_ros_melodic_rp3.sh
$ bash ./install_ros_melodic_rp3.sh

如果以上安装失败,请参阅 the official ROS1 Melodic installation guide 

  • 安装ROS功能包

安装并构建TB3功能包:

$ sudo apt install ros-melodic-rosserial-python ros-melodic-tf
$ mkdir -p ~/catkin_ws/src && cd ~/catkin_ws/src
$ sudo apt install ros-melodic-hls-lfcd-lds-driver
$ sudo apt install ros-melodic-turtlebot3-msgs
$ sudo apt install ros-melodic-dynamixel-sdk
$ git clone -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git
$ cd ~/catkin_ws/src/turtlebot3
$ rm -r turtlebot3_description/ turtlebot3_teleop/ turtlebot3_navigation/ turtlebot3_slam/ turtlebot3_example/
$ cd ~/catkin_ws/
$ echo 'source /opt/ros/melodic/setup.bash' >> ~/.bashrc
$ source ~/.bashrc
$ cd ~/catkin_ws && catkin_make -j1
$ echo 'source ~/catkin_ws/devel/setup.bash' >> ~/.bashrc
$ source ~/.bashrc

USB端口设定:

$ rosrun turtlebot3_bringup create_udev_rules

(5)网络配置

  • ROS网络配置
$ sudo gedit ~/.bashrc
  • 修改ROS_MASTER_URI和ROS_HOSTNAME的IP地址
export ROS_MASTER_URI=http://{IP_ADDRESS_OF_REMOTE_PC}:11311
export ROS_HOSTNAME={IP_ADDRESS_OF_RASPBERRY_PI_3}
  • 使用下面的命令应用更改
$ source ~/.bashrc

3、OpenCR配置

  • 使用微型USB电缆将OpenCR连接到Raspberry Pi。
  • 在Raspberry Pi上安装所需的软件包以上传OpenCR固件。
$ sudo dpkg --add-architecture armhf
$ sudo apt-get update
$ sudo apt-get install libc6:armhf
  • 根据平台的不同,使用burger或waffle作为OPENCR_MODEL名称。
$ export OPENCR_PORT=/dev/ttyACM0
$ export OPENCR_MODEL=burger
$ rm -rf ./opencr_update.tar.bz2
  • 下载固件和加载程序,然后解压缩文件。
$ wget https://github.com/ROBOTIS-GIT/OpenCR-Binaries/raw/master/turtlebot3/ROS1/latest/opencr_update.tar.bz2 
$ tar -xvf opencr_update.tar.bz2 
  • 将固件上传到OpenCR。
$ cd ./opencr_update
$ ./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr

成功上传TB3 Burger的固件将如下所示。

  • 如果固件上传失败,请尝试以恢复模式上传。以下顺序激活OpenCR的恢复模式。在恢复模式下,OpenCR的状态指示灯将定期闪烁。
    ①按住PUSH SW2按钮。②按下RESET按钮。③释放RESET按钮。④释放PUSH SW2按钮
  • OpenCR测试

您可以使用PUSH SW 1和PUSH SW 2按钮查看机器人是否已正确组装。此过程将测试左右DYNAMIXEL和OpenCR板。

组装TurtleBot3后,将电源连接到OpenCR,然后打开OpenCR的电源开关。红色的电源LED将亮起。将机器人放在宽阔的平坦地面上。 对于测试,建议安全半径为1米(40英寸)。按住PUSH SW 1几秒钟,以命令机器人向前移动30厘米(约12英寸)。按住PUSH SW 2几秒钟,以命令机器人将其旋转180度。

4、硬件组装

说明手册下载网址:

组装视频:

Assembling the TurtleBot3 Basic
Melody 的视频
Assembling the TurtleBot3 Premium
Melody 的视频
TurtleBot3 Burger Assembly
Melody 的视频

5、启动TB3机器人

  • 从PC运行roscore。
$ roscore
  • 使用Ctrl + Alt + T从PC打开一个新终端,并使用其IP地址连接到Raspberry Pi。默认密码是turtlebot。
$ ssh pi@{IP_ADDRESS_OF_RASPBERRY_PI}
  • 启动TurtleBot3应用程序。
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch

如果TurtleBot3模型是burger,则终端将在下面显示消息。

 SUMMARY
 ========

 PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.3
 * /turtlebot3_core/baud: 115200
 * /turtlebot3_core/port: /dev/ttyACM0
 * /turtlebot3_core/tf_prefix:
 * /turtlebot3_lds/frame_id: base_scan
 * /turtlebot3_lds/port: /dev/ttyUSB0

 NODES
 /
     turtlebot3_core (rosserial_python/serial_node.py)
     turtlebot3_diagnostics (turtlebot3_bringup/turtlebot3_diagnostics)
     turtlebot3_lds (hls_lfcd_lds_driver/hlds_laser_publisher)

 ROS_MASTER_URI=http://192.168.1.2:11311

 process[turtlebot3_core-1]: started with pid [14198]
 process[turtlebot3_lds-2]: started with pid [14199]
 process[turtlebot3_diagnostics-3]: started with pid [14200]
 [INFO] [1531306690.947198]: ROS Serial Python Node
 [INFO] [1531306691.000143]: Connecting to /dev/ttyACM0 at 115200 baud
 [INFO] [1531306693.522019]: Note: publish buffer size is 1024 bytes
 [INFO] [1531306693.525615]: Setup publisher on sensor_state [turtlebot3_msgs/SensorState]
 [INFO] [1531306693.544159]: Setup publisher on version_info [turtlebot3_msgs/VersionInfo]
 [INFO] [1531306693.620722]: Setup publisher on imu [sensor_msgs/Imu]
 [INFO] [1531306693.642319]: Setup publisher on cmd_vel_rc100 [geometry_msgs/Twist]
 [INFO] [1531306693.687786]: Setup publisher on odom [nav_msgs/Odometry]
 [INFO] [1531306693.706260]: Setup publisher on joint_states [sensor_msgs/JointState]
 [INFO] [1531306693.722754]: Setup publisher on battery_state [sensor_msgs/BatteryState]
 [INFO] [1531306693.759059]: Setup publisher on magnetic_field [sensor_msgs/MagneticField]
 [INFO] [1531306695.979057]: Setup publisher on /tf [tf/tfMessage]
 [INFO] [1531306696.007135]: Note: subscribe buffer size is 1024 bytes
 [INFO] [1531306696.009083]: Setup subscriber on cmd_vel [geometry_msgs/Twist]
 [INFO] [1531306696.040047]: Setup subscriber on sound [turtlebot3_msgs/Sound]
 [INFO] [1531306696.069571]: Setup subscriber on motor_power [std_msgs/Bool]
 [INFO] [1531306696.096364]: Setup subscriber on reset [std_msgs/Empty]
 [INFO] [1531306696.390979]: Setup TF on Odometry [odom]
 [INFO] [1531306696.394314]: Setup TF on IMU [imu_link]
 [INFO] [1531306696.397498]: Setup TF on MagneticField [mag_link]
 [INFO] [1531306696.400537]: Setup TF on JointState [base_link]
 [INFO] [1531306696.407813]: --------------------------
 [INFO] [1531306696.411412]: Connected to OpenCR board!
 [INFO] [1531306696.415140]: This core(v1.2.1) is compatible with TB3 Burger
 [INFO] [1531306696.418398]: --------------------------
 [INFO] [1531306696.421749]: Start Calibration of Gyro
 [INFO] [1531306698.953226]: Calibration End

五、TB3机器人基本操作

TB3可以通过各种遥控器进行遥控操作。确保您的SBC和ROS版本支持必要的ROS软件包。

从远程PC启动turtlebot3_teleop_key节点,以使用键盘进行远程操作。将$ {TB3_MODEL}参数替换为您的模型名称,例如burger,waffle,waffle_pi。

$ export TURTLEBOT3_MODEL=${TB3_MODEL}
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

如果节点成功启动,则以下指示将显示在终端窗口中:

Control Your Turtlebot3
Moving around
     w
 a   s   d
     x
w/x : increase/decrease linear velocity
a/d : increase/decrease angular velocity
space key, s : force stop
CTRL-C to quit
TurtleBot3 Teleoperation Example
Melody 的视频

其他好玩的操作请查阅官网: