ROS中的机器人导航需要底层轮子驱动十分精确的对行进的速率和角速度进行控制。本文根据大量的实验数据进行图形化分析,找出线性速率、角速度和电机PWM线性关系,并得出计算公式。

1. ROS导航机器人驱动功能分析

ROS的navigation包内容十分丰富,并封装完整。开发机器人其实就是开发轮子驱动与ROS 进行通讯。这是一个双向通讯:

1.1 ROS -> 轮子驱动

ROS 在cmd_vel这个主题上发布Twist消息,这个消息包含的就是机器人的期望前进速度和转向速度。轮子驱动必须要精确的控制电机同时要以某个速度和某个角速度前进或后退。角速度就代表拐弯的弯度.

使用ctrl + alt + t 打开一个新的终端以后,输入如下命令,就可以查看Twist的消息类型了。

 rosmsg show geometry_msgs/Twist

Twist消息的结构,其中linear 的x就是代表前进方向的速度,单位为m/s。angular 的z就代表机器人的绕中心旋转的角速度,单位为 弧度/s (rad/s)。本文要研究这两个速度的关系。其余的4个成员可以忽略,它们对平面上的4轮机器人来说没有实际意义.

1.2  轮子驱动 -> ROS

电机执行的效果: 线性速度,角速度和机器人现在地图上的坐标需要实时反馈给ROS. 这是通过向odom主题发送nav_msgs/Odometry导航消息,报告角速度,线速度和巡航角度。

这部分请参照我的文章:ROS 学习系列 -- RViz中移动机器人来学习 URDF,TF,base_link, map,odom和odom 主题的关系

2. PWM, 线性速度,左右轮子速度和角速度的关系

机器人线性速度: RobotV

左右轮速度:       LeftWheelV   RightWheelV

角速度:             YawRate

RobotV  = ( LeftWheelV + RightWheelV ) / 2                               //公式1
YawRate =  delta_t * abs( LeftWheelV - RightWheelV )                     //公式2

PWM 与轮子的关系:

xxxxWheelV = PWM *factor + offset                                        //公式3

在实际运行中发现,左右轮的性能因为硬件有所差异,所以 delta_t, factor, offset 对左右两边来讲是不一样的。所以它们各有一套参数。这些参数的确定是要通过大量的数据采集后进行分析得出来的。下面我们讨论如何确定公式2,3中的参数

3. 左右轮子速度和PID控制

PWM与轮子转速的关系并不是不变的,当电池放电一段时间后,要增大factor的值才能达到期望的速度。这就是PID的作用,PID要求给一个初始PWM值,上面的公式3就可以算出这个初始值,剩下就交给反馈调整了, ROS有个pid类。

4. PWM与轮子速度实验数据分析

PWM从20至100的区间平均取10个值,跑10轮。每轮前行1米,然后后退1米,记录前进后退两个速度。左右两轮各一套数据,每次这样得到了4个数据样本,总共40个,图表分析如下:


1。左上图 Forward left wheel 前行左轮

2。左下图 Backward left wheel 后退左轮

3。右上图 Forward right wheel 前行右轮

4。右下图 Backward right wheel 后退右轮

横坐标是PWM值,纵坐标是速度(m/s)

采样数据的结果非常完美,标准的线性关系图。同时也能看出来左右两轮确实有不一致的地方,但是前进后退的数据很统一。这样就可以测出factor, offset两个参数,左右两轮个一套。

5.左右轮速度差与角速度实验数据分析

公式2的分析比较复杂,但是一旦确定就不变了,除非改变环境。分析出delta_t

转弯分为10种类型:

1,左轮不转,右轮PWM从20至100的区间平均取10个值,向前跑10轮。每轮跑360度,测出角速度和线速度。

2,右轮不转,左轮PWM从20至100的区间平均取10个值,向前跑10轮。每轮跑360度,测出角速度和线速度。

3,左轮比右轮转的慢,速度差逐渐加大取10个值,向前跑10轮。每轮跑360度,测出角速度和线速度。

4,右轮比左轮转的慢,速度差逐渐加大取10个值,向前跑10轮。每轮跑360度,测出角速度和线速度。

5,左轮向前,右轮向后,速度差逐渐加大取10个值,顺时针跑10轮。每轮跑360度,测出角速度和线速度。

6,   左轮不转,右轮PWM从20至100的区间平均取10个值,向后跑10轮。每轮跑360度,测出角速度和线速度。

7,右轮不转,左轮PWM从20至100的区间平均取10个值,向后跑10轮。每轮跑360度,测出角速度和线速度。

8,左轮比右轮转的慢,速度差逐渐加大取10个值,向后跑10轮。每轮跑360度,测出角速度和线速度。

9,右轮比左轮转的慢,速度差逐渐加大取10个值,向后跑10轮。每轮跑360度,测出角速度和线速度。

10,左轮向后,右轮向前,速度差逐渐加大取10个值,逆时针跑10轮。每轮跑360度,测出角速度和线速度。

1-4为前行,6-9为后行。转速都是逐渐加强。其中旋转角度的测量是通过电子罗盘HMC5883L 测算出来的,该芯片的干扰校准见我的文章 HMC5883L 电子指南针用树莓派进行磁场干扰过滤 校准

图表分析如下:

左边图表从上向下对应旋转编号为 1,2,3,4,5

右边图表从上向下对应旋转编号为 6,7,8,9,10

横坐标为左右两轮速度差的绝对值,纵坐标为角速度,观察图像得出下面结论:

1。很明显前进和后退比例系数(斜率)不一样

2。它们向左向下的延长线都是穿过原点的,就是说速度差为0时,没有旋转,这个跟实际很匹配

3。左右两轮转弯性能无差异

4。第3,4行数据点向上平移到1,2行数据点,两组数据可以完全拼接成一条线保持相同的斜率

根据上面的数据可以推断出,公式2中的delta_t在前行和后退时是不一样的,10类转弯可以归纳为2种了。

6.带方向的线性速度和角速度

在ROS中,线性速度向后是负值,向前是正值。角速度方向的规定如图,它符合右手原则,右图逆时针方向就是正值,顺时针为负值。就是上面的左转为正,右转为副。

               

我们把方向考虑到公式1,2,3中,推导出代码可用的公式从而算出左右轮的速度 LeftWheelV,  RightWheelV, 然后交给pid到树莓派执行。从而达到精确的同时控制线性速度和角速度。其中RobotV 和 YawRate是ROS下发的命令,程序运行时就是已知量。

RobotV  = ( LeftWheelV + RightWheelV ) / 2                               //公式1
YawRate =  delta_t * abs( LeftWheelV - RightWheelV )                     //公式2

当 LeftWheelV 大于 RightWheelV时 是右转,此时YawRate为负,反之为正。公式2中的abs决定值可以去掉了,变成公式4

YawRate =  delta_t * ( RightWheelV - LeftWheelV )                        //公式4YawRate / delta_t = RightWheelV - LeftWheelV

公式1不变,简单变换一下

RobotV  = ( LeftWheelV + RightWheelV ) / 2                               //公式1RobotV * 2 = LeftWheelV + RightWheelV

合并公式1 和 4,初中的二元一次方程,得出:

YawRate / delta_t + RobotV * 2 = RightWheelV * 2        两边除2
YawRate / delta_t / 2 + RobotV = RightWheelV   左右互换
RightWheelV = RobotV + YawRate / delta_t / 2

带入公式1

LeftWheelV  = RobotV * 2 - ( YawRate / delta_t / 2 + RobotV ) = RobotV - YawRate / delta_t / 2

这里的delta_t取值要根据第5段的结论来定,根据 RobotV 正负值选取。这样左右两个轮子的速度大小和方向都可以计算出来了。但是要注意这里的YawRate必须是弧度制。

Ros 的base_control 的C++代码

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <wiringPi.h>
#include <sstream>
#include "boost/shared_ptr.hpp"
#include <geometry_msgs/Twist.h>
#include "RunVelocity.h"boost::shared_ptr<RunVelocity> m_leftwheel;
boost::shared_ptr<RunVelocity> m_rightwheel;void cmd_vel_callback(const geometry_msgs::Twist& vel_cmd)
{double  LeftWheelV, RightWheelV;double RobotV = vel_cmd.linear.x;double YawRate = vel_cmd.angular.z;double delta_t = RobotV > 0 ? 5.9 : 4.45;RightWheelV = RobotV + YawRate / delta_t / 2 ;LeftWheelV = RobotV - YawRate / delta_t / 2 ;m_leftwheel->RunSpeedCommand(LeftWheelV);m_rightwheel->RunSpeedCommand(RightWheelV);
}int main(int argc, char **argv)
{ros::init(argc, argv, "base_control");ros::NodeHandle n;ros::Subscriber cmd_vel_sub = n.subscribe("/cmd_vel", 10, cmd_vel_callback);// 树莓派gpio控制轮子wiringPiSetup();int left_forward, left_backward, right_forward, right_backward;n.param("left_forward", left_forward, 1);n.param("left_backward", left_backward, 4);n.param("right_forward", right_forward, 6);n.param("right_backward", right_backward, 5);m_leftwheel = boost::shared_ptr<RunVelocity>(new RunVelocity(n, left_forward, left_backward));m_rightwheel = boost::shared_ptr<RunVelocity>(new RunVelocity(n, right_forward, right_backward));ROS_INFO("ready to run on /cmd_vel"); ros::spin();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

ROS 学习系列-- 四轮机器人线性速率、角速度和电机PWM线性关系的定量分析相关推荐

  1. ros中的电机速度控制_ROS 学习系列-- 四轮机器人线性速率、角速度和电机PWM线性关系的定量分析...

    ROS中的机器人导航需要底层轮子驱动十分精确的对行进的速率和角速度进行控制.本文根据大量的实验数据进行图形化分析,找出线性速率.角速度和电机PWM线性关系,并得出计算公式. 1. ROS导航机器人驱动 ...

  2. ROS 学习系列 -- iRobot 第二代机座 Roomba 作为Turtlebot使用时无法开关机

     iRobot 推出了第二代机座 Roomba来取代Create.  这是一个绿脸的机座. 如果使用在turtlebot上,几乎是完全兼容的,不用该什么代码,但是波特率提高了一倍,所以需要更改环境 ...

  3. ROS学习笔记-多机器人通信(1)-实现两台机器通信

    ROS是一个分布式的计算环境.一个正在运行的ROS可以在多个机器人之间分布成几十甚至上百个节点.取决于系统的配置方式,任何节点可能需要随时与任何其他节点进行通信,为实现使用同一个master控制多台机 ...

  4. ROS学习:创建机器人的urdf

    ROS学习之路08:创建机器人的urdf(xacro)模型并通过rviz可视化_Hi, Robotics-CSDN博客_urdf可视化 1 创建工作空间 mkdir -p ~/catkin_ws/sr ...

  5. ROS学习笔记之——机器人航向角的求解

    最近在做项目的时候,需要测量移动机器人的航向角,为此写下本博文,来作为学习笔记.本博文的主要内容来自于网上的各种资料,并附上参考链接. 目录 四元数 欧拉角 轴角 四元数(Quaternion)的定义 ...

  6. ros学习之多机器人导航(仿真)

    系列文章目录 (一).从solidworks转urdf文件,在gazebo中添加小车模型 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 系列文章目录 目录 前言 一.插件 二 ...

  7. ROS学习系列(一):ubuntu16.04下安装 ROS IDE RoboWare Studio 教程

    1.下载RoboWare Studio安装包 不要信从官网下载http://www.roboware.me/#/home 这个网站压根就进不去. 从github上下载安装包,链接https://git ...

  8. 资源 | 做一款炫酷的机器人需要哪些学习资源(机器人资源Awesome系列)

    翻译 | AI科技大本营 参与 | 赵博 SuiSui 为什么要制作机器人呢?想参加各种机器人大赛?看起来很炫酷?不过从学习角度说,机器人综合了信息技术.电子工程.机械学.程序设计.控制系统以及认知等 ...

  9. ROS wiki系列|通过ROS wiki-tutorials学习话题

    上一期指路:ROS wiki系列|通过ROS wiki-tutorials学习节点 这一期我们就用ROS wiki中的tutorials来学习ROS中另外一个重要的概念:topic--话题 在前面讲解 ...

最新文章

  1. Azure上的VM代理及可扩展程序
  2. 专访浪潮王虹莉 探互联网服务器市场的未来
  3. 从IT转行做网店奋斗历程
  4. SDN控制器策略制定和表项下发—Vecloud
  5. python一次性输入10个数_python如何一次性输入多个数
  6. php postgresql多条,PHP操作Postgresql封装类与应用完整实例
  7. MySQL ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
  8. 【Android】动态UI : LayoutParams.addRule(...) LayoutParams.addRule(..., ...)
  9. 新iPhone模具曝光:刘海屏无变化 后置三摄排布辣眼
  10. 排序算法(二)Sort with Swap(0,*)
  11. servletconfigservletcontext
  12. 点击鼠标出现漂浮字体(自信, 自强, 坚持...)效果实现
  13. java代码注释规范
  14. fftshift使用
  15. 微信小程序中引入 UI 组件库(Vant Weapp)
  16. Oracle12c CDB和PDB数据库的启动与关闭说明
  17. 学机器学习怎么可以不知道最小二乘法
  18. 《绝区零》首测遭破解,面临资源泄露风险
  19. 生成订单30分钟未支付,则自动取消,该怎么实现?
  20. Ionic入门学习(一)

热门文章

  1. 源代码世界3—海上高墙
  2. 2022湖南最新消防设施操作员模拟试题题库及答案
  3. 20210117noteexpress云端数据库经验分享
  4. linux内核进程cmd,linux – 如何在内核模块中使用proc_pid_cmdline
  5. PyTorch expand() 函数
  6. linux系统分辨率文件,Linux下显示分辨率低解决方法
  7. mongodb pymongo
  8. Go语言实战 - 我需要站内搜索
  9. anaconda3-2022.05 安装过程
  10. javaweb项目实战--学生管理系统