【Autolabor初级教程】ROS机器人入门
1. 电机与电机驱动板
1.1 直流减速电机
-
电机主体通过输入轴与减速箱相连接,通过减速箱的减速效果,最终外端的输出轴会按照比例 (取决于减速箱减速比) 降低电机输入轴的转速,当然速度降低之后,将提升电机的力矩
-
尾部是 AB 两相霍尔编码器,通过 AB 编码器输出的波形图,可以判断电机的转向以及计算电机转速
- 电机主要参数
-
额定扭矩:额定扭矩和机器人质量以及有效负荷相关,二者正比例相关,额定扭矩越大,可支持的机器人质量以及有效负荷越高;
-
减速比:电机输入轴与输出轴的减速比例,比如: 减速比为90,意味着电机主体旋转90圈,输出轴旋转1圈。
-
减速后转速:与减速比相关,是电机减速箱输出轴的转速,单位是 rpm(转/分),减速后转速与减速前转速存在转换关系: 减速后转速 = 减速前转速 / 减速比。另外,可以根据官方给定的额定功率下的减速后转速结合车轮参数来确定小车最大速度。
-
编码器精度:是指编码器旋转一圈单相 (当前编码器有 AB 两相) 输出的脉冲数
- 注意:电机输入轴旋转一圈的同时,编码器旋转一圈,如果输出轴旋转一圈,那么编码器的旋转圈数和减速比一致(比如减速比是90,那么输出轴旋转一圈,编码器旋转90圈)
- 编码器输出的脉冲数计算公式:输出轴旋转一圈产生的脉冲数 = 减速比 * 编码器旋转一圈发送的脉冲数(比如:减速比为90,编码器旋转一圈输出 11 个脉冲,那么输出轴旋转一圈总共产生 11 * 90 也即 990 个脉冲)
-
1.2 电机驱动板
- 为什么需要选配合适的电机驱动板?
- 因为 Arduino 的输出电流不足以直接驱动电机,需要通过电机驱动板放大电机控制信号
2. 电机测速理论
2.1 编码器
- 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备
- 编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺
- 按照读出方式编码器可以分为接触式和非接触式两种
- 按照工作原理编码器可分为增量式和绝对式两类
- 增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小
- 绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关
2.2 测速原理
- AB 相增量式编码器测速原理
- AB 相编码器主要构成为 A 相与 B 相,每一相每转过单位的角度就发出一个脉冲信号(一圈可以发出 N 个脉冲信号),A 相、B 相为相互延迟 1/4 周期的脉冲输出,根据延迟关系可以区别正反转,而且通过取 A 相、B 相的上升和下降沿可以进行单频或 2 倍频或 4 倍频测速
- AB 相编码器主要构成为 A 相与 B 相,每一相每转过单位的角度就发出一个脉冲信号(一圈可以发出 N 个脉冲信号),A 相、B 相为相互延迟 1/4 周期的脉冲输出,根据延迟关系可以区别正反转,而且通过取 A 相、B 相的上升和下降沿可以进行单频或 2 倍频或 4 倍频测速
3. 电机调速:PID 控制理论
-
场景:速度信息可以以 m/s 为单位,或者也可以转换成转速 r/s,而电机的转速是由 PWM 脉冲宽度来控制的,如何根据速度信息量化成合适的 PWM 值呢?
- 比如:现有一辆行驶中的无人车,要求将车速调整至 100KM/h,那么应该如何向电机输出 PWM 值?或换言之,如何控制油门?
调速实现策略由多种,PID 较为常用
3.1 PID 简介
- PID 算法是一种经典、简单、高效的动态速度调节方式,P(Proportional) 代表比例,I(Integral) 代表积分,D(Derivative) 代表微分
3.2 PID 公式
- e(t) 作为 PID 控制的输入
- u(t) 作为 PID 控制器的输出和被控对象的输入
- Kp 控制器的比例系数
- Ki 控制器的积分时间,也称积分系数
- Kd 控制器的微分时间,也称微分系数
3.3 PID 控制原理框架图
3.4 比例 P(Proportional)
3.5 积分 I(Integral)
3.6 微分 D(Derivative)
4. 分布式框架搭建
以树莓派作为主机、PC 作为从机为例
-
硬件准备:使用显示屏或 HDMI 采集卡连接树莓派并启动
-
为树莓派连接无线网络
-
为树莓派配置静态 IP
-
配置分布式框架
-
准备
- 先要保证不同计算机处于同一网络中,最好分别设置固定 IP,如果为虚拟机,需要将网络适配器改为桥接模式
-
配置文件修改
- 分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名
从机的IP 从机计算机名
主机的IP 主机计算机名
设置完毕,可以通过 ping 命令测试网络通信是否正常
- IP 地址查看名:ifconfig
- 计算机名称查看:hostname
-
配置主机 IP
- ~/.bashrc 追加
export ROS_MASTER_URI=http://主机IP:11311 export ROS_HOSTNAME=主机IP
-
配置从机 IP
- ~/.bashrc 追加
export ROS_MASTER_URI=http://主机IP:11311 export ROS_HOSTNAME=从机IP
-
测试
- 主机启动 roscore(必须)
- 主机启动订阅节点,从机启动发布节点,测试通信是否正常
- 反向测试,主机启动发布节点,从机启动订阅节点,测试通信是否正常
-
5. ssh 远程连接
在多处理器的分布式架构中,不同的 ROS 系统之间可能会频繁的涉及到文件的传输,比如:在 PC 端编写 ROS 程序,而最终需要在树莓派上运行,如何将相关目录以及文件从PC上传到树莓派?
- ssh 是常用手段之一
-
概念
- SSH(Secure Shell)是一种通用的、功能强大的、基于软件的网络安全解决方案。计算机每次向网络发送数据时,SSH 都会自动对其进行加密。数据到达目的地时,SSH 自动对加密数据进行解密。整个过程都是透明的,使用 OpenSSH 工具将会增进你的系统安全性,且 SSH 安装容易、使用简单
-
实现
-
SSH 实现架构上分为客户端和服务器端两大部分,客户端是数据的发送方,服务端是数据的接收方,当前场景下,我们需要从PC端发送数据到树莓派,那么PC端属于客户端,而树莓派属于服务端,整个实现具体流程
-
安装 SSH 客户端与服务端
默认情况下,Ubuntu 系统已经安装了 SSH 客户端,因此只需要在树莓派安装服务端即可(如果树莓派安装的是服务版的 Ubuntu,默认会安装 SSH 服务并已设置成了开机自启动)
$ sudo apt install openssh-server
$ sudo apt install openssh-client
-
服务端启动 SSH 服务
- 树莓派启动 ssh 服务
$ sudo /etc/init.d/ssh start
- 启动后查看服务是否正常运行
$ ps -e | grep ssh
- 以后需要频繁的使用ssh登录树莓派,为了简化实现,可以将树莓派的ssh服务设置为开机自启动
$ sudo systemctl enable ssh
-
客户端远程登陆服务端
- 登陆树莓派可以调用如下命令
$ ssh 账号@ip地址
- 如果退出登陆,可以调用exit命令
$ exit
-
实现数据传输
- 上传文件
$ scp 本地文件路径 账号@ip:树莓派路径
- 上传文件夹
$ scp -r 本地文件夹路径 账号@ip:树莓派路径
- 下载文件
$scp 账号@ip:树莓派路径 本地文件夹路径
- 下载文件夹
$ scp -r 账号@ip:树莓派路径 本地文件夹路径
-
6. VScode 远程开发
借助于 ssh 可以远程操作树莓派端,但是也存在诸多不便,比如:编辑文件内容时,需要使用 vim 编辑器,且在一个终端内,无法同时编辑多个文件,本节将介绍一较为实用的功能——VSCode 远程开发,我们可以在 VScode 中以图形化的方式在树莓派上远程开发程序,比 ssh 的使用更方便快捷,可以大大提高程序开发效率
-
为 VScode 安装远程开发插件
-
配置远程连接
-
使用快捷键 ctrl + shift + p 打开命令输入窗口,并输入Remote-SSH:Connect to Host…,弹出列表中选择与之同名的选项
-
上一步完成将弹出一个新的命令窗口,选择下拉列表中的 Add New SSH Host
-
上一步完成又将弹出一个新的命令窗口,在其中输入:ssh ubuntu@192.168.43.164,其中,ubuntu 需要替换为你的登录账号,192.18.43.164 则替换为你的树莓派的 ip 地址
-
选择上一步完成后的弹窗列表中的第一个选项(或直接回车),即可完成配置,配置成果后会有提示信息
-
-
使用
-
继续使用快捷键 ctrl + shift + p 打开命令输入窗口,并输入Remote-SSH:Connect to Host…,此时列表中将显示步骤 3 中配置的 ip 地址,直接选择,选择后,VScode 将打开一个新的窗口
或者,也可以点击侧边栏的远程资源管理器,在弹出的服务器列表中选择要连接的服务器,并右击,选择在本窗口或新窗口中实现远程连接
-
选择菜单栏的文件下的打开文件夹,在弹窗列表中选择需要打开的文件夹并点击确定即可
-