Ubuntu学习笔记6-ESP32接收并处理cmd_vel话题

前言

前面配置好了Arduino环境中的ros库,但是经过各种尝试总结出以下结论:
rosserial_Arduino的串口通讯只支持Arduino系列板子(ESP8266没有尝试),当将串口通讯的代码烧录至ESP32后,每次通讯时都会报错:

Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino

或者是另外一个M开头的报错,究其本质,感觉就是该库的串口对于ESP系列的不支持,由于本人技术有限,无法进行源码的修改及优化(当然也有可能是我菜没弄好,有懂行的大佬欢迎指点)
因此,根据网上的资料,本人尝试了另外一种通讯方式,通过ROS官方封装的TCP协议,将ESP板子接入该服务器中,即可通过局域网进行无线通讯,该方案有好也有坏。
好处:无需连接,可以直接按照ROS的节点方式进行编写ESP32端代码
缺点:不稳定,有时候连接异常,且数据通讯质量无法保证(估计受网络带宽等影响)
因此,随后还是放弃了这种方式,选择了直接通过串口库进行开发,本来想在Qt上开发ROS利用Qt的串口库进行通讯,但是冲浪发现ROS也有一个serial
库,类似封装Linux的串口库的产物,因此决定采用这种方式进行通讯。

ESP32端测试代码

对于ESP32而言,只需要简单的串口接收然后通过另外一个串口输出即可验证,主要的处理还是在上位机ROS端。
ESP32的串口0(该串口用于下载,使用了USB线就不能再用杜邦线接出)

TXD:GPIO1
RXD:GPIO3

ESP32的串口2

TXD:GPIO17
RXD:GPIO16


连接方式如上。
ESP32代码如下:

void setup() {// put your setup code here, to run once:Serial.begin(9600);Serial2.begin(115200);
}void loop() {// put your main code here, to run repeatedly:if(Serial.available()){String buf = Serial.readString();Serial2.println(buf);}
}

ROS端代码

ROS端需要订阅键盘节点话题(/cmd_vel),并将接收到的线速度及角速度转化为转速,然后通过串口下发给ESP32.

#include <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
#include <geometry_msgs/Twist.h>
#include <iostream>
#include <sstream>
using namespace std;//定义串口对象
serial::Serial ser;//cmd_vel回调函数,用于接收键盘话题下发ESP32
void com_vel_callback(const geometry_msgs::Twist::ConstPtr& msg){int leftSpeed = (msg->linear.x - msg->angular.z * 0.27 / 2) / 3.14 / 0.085 *100;int rightSpeed = (msg->linear.x + msg->angular.z *0.27 / 2) / 3.14 / 0.085 *100;std_msgs::String buf;std::stringstream ss;ss<<leftSpeed<<","<<rightSpeed;buf.data = ss.str();ser.write(buf.data);
}int rosSerial_init(string name,int baud)
{try{ser.setPort(name);ser.setBaudrate(baud);serial::Timeout to = serial::Timeout::simpleTimeout(1000);ser.setTimeout(to);ser.open();}catch (serial::IOException& e){ROS_ERROR_STREAM("Unable to open port ");return -1;}if(ser.isOpen()){ROS_INFO_STREAM("Serial Port initialized");}else{return -1;}
}int main (int argc, char** argv){ros::init(argc, argv, "serial_example_node");ros::NodeHandle nh;ros::Subscriber write_sub = nh.subscribe<geometry_msgs::Twist>("/cmd_vel", 1000, com_vel_callback);ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);if(rosSerial_init("/dev/ttyUSB0",115200) == -1)return -1;ros::Rate loop_rate(5);while(ros::ok()){ros::spinOnce();if(ser.available()){ROS_INFO_STREAM("Reading from serial port");std_msgs::String result;result.data = ser.read(ser.available());ROS_INFO_STREAM("Read: " << result.data);read_pub.publish(result);}loop_rate.sleep();}
}

关于线速度及角速度转化为转速的知识自行冲浪补习,此处提供下位机的数据处理方法,以供参考:

  target[0] = 0;target[1] = 0; String buf = str.data;char com[20];buf.toCharArray(com,10);int m = 0;for(int i = 0;i<20;i++){if(com[i] == ','){if(flag_1 == 1)target[m] *= -1;flag_1 = 0;   m++;}else if(com[i] == '\r'||com[i] == '\n'||com[i] == '\0')break;else{if(com[i] != '-')target[m] = target[m]*10+(com[i]-'0');elseflag_1 = 1;    }}if(flag_1 == 1){target[1] *= -1;flag_1 = 0;}target[0] /= 100;target[1] /= 100;if(target[0] >= 0)   Lpid.SetOutputLimits(500, 1000);else                Lpid.SetOutputLimits(-1000, -500);if(target[1] >= 0)   Rpid.SetOutputLimits(500, 1000);else                Rpid.SetOutputLimits(-1000, -500);Serial.print(target[0]);Serial.print(',');Serial.println(target[1]);

实现效果

PC的串口助手成功接收上位机下发的转速信息

后记

尽管这种方法能够接收ROS下发的控制信息,但是ESP32端的odam及里程计信息等如何上传还需要研究一下,希望一切顺利。

Ubuntu学习笔记6-ESP32接收并处理cmd_vel话题相关推荐

  1. Ubuntu学习笔记:VMware 导入虚拟机 .ova 文件

    Ubuntu学习笔记:VMware 导入虚拟机 .ova 文件 首先要有一个需要导入的虚拟化格式程序包,(.ova:开放虚拟化格式分发程序包) 打开VMware,文件→打开,选择需要的导入的包后,为虚 ...

  2. Ubuntu学习笔记:使用命令查看当前登录系统的用户信息

    Ubuntu学习笔记:使用命令查看当前登录系统的用户信息 1 查看当前登录的用户名 2 查看当前登录的用户名.终端类型.时间.IP地址 3 服务器连接的所有用户及正在使用的进程 4 显示系统中有哪些使 ...

  3. Ubuntu学习笔记:使用命令查询系统开机信息

    Ubuntu学习笔记:使用命令查询系统开机信息 dmesg

  4. Ubuntu 学习笔记之——下载神器aria2

    前言: 刚刚接触Linux两天,之前也玩过几天Ubuntu,当时搞双系统感觉比较繁琐,于是几天之后便放弃了.前几天,突然发现了一个小东西,一个叫Aria2c的下载器,兴趣突然上来了,决定真正的体验一下 ...

  5. Ubuntu学习笔记(二)

    1.重复指令 1.1 重复执行先前的指令,可以使用!!命令 运行如下 zjq@ubuntu:~$ ls -l Music total 0 zjq@ubuntu:~$ !! ls -l Music to ...

  6. linux笔记软件,Linux Ubuntu学习笔记_软件管理

    管理软件包工具:dpkg.rpm (dpkg管理deb软件包.rpm管理rpm软件包) 安装程序:sudo dpkg -i *.deb (Ubuntu文件后缀为.deb SuSE.Fedora为.rp ...

  7. ubuntu学习笔记之安装oracle客户端

    Oracle 为 Ubuntu 用户设立了专门的 apt 源服务器,只需要在 /etc/apt/source.list 中添加一行: deb http://oss.oracle.com/debian ...

  8. Ubuntu学习笔记2-网络部分

    Ubuntu server配置IP地址 第一种方法:常规方法 1.登录Ubuntu Server,然后通过"sudo -s" 切换到root用户. 2.输入"cd  /e ...

  9. ubuntu 学习笔记2--安装tomcat

    参考维基百科http://wiki.ubuntu.org.cn/Tomcat 安装Tomcat sudo apt-get install tomcat6 设置Tomcat运行的JAVA环境 如果已经设 ...

最新文章

  1. node sqlite 插入数据_安卓手机中的应用数据都保存在哪些文件中?
  2. 分享|如何制作高质量的图文摘要(Graphical Abstract)
  3. R语言exists函数检查数据对象是否存在实战
  4. 双11背后的技术力量,阿里云神龙治愈云计算阿克琉斯之踵
  5. 前有教授被骗千万,后有某重点高校青年教师晒出月薪900的工资条,大学老师工资待遇如何?...
  6. Christopher G. Atkeson 简介
  7. Chrome每次打开时报的关于扩展程序的警告信息
  8. HDU 5777 domino
  9. (转)Arcgis for JS之地图自适应调整
  10. mysql drop user 并删除_MySQL删除用户( DROP USER)
  11. Maven学习总结(51)——Maven 常用属性和常量说明
  12. java.util.ConcurrentModificationException错误解决方案
  13. coursera机器学习-聚类,降维,主成分分析
  14. 黑马程序员传智播客python 协程greenlet gevent学习笔记
  15. 用 Python 分析某医院药品销售案例!
  16. undefined reference to 问题汇总及解决方法
  17. C# 二维与三维计算多边形面积的方法
  18. Ubuntu上安装QQ,无法显示图片和头像
  19. 记一次内网SSH后门误报事件
  20. Matlab:图像轮廓的曲率计算

热门文章

  1. 花拳绣腿的「融360」:金融AI第一股今安在?|| 新芒X
  2. 推荐10款效率可以翻倍的IDEA插件,撸码利器
  3. 5-RNN-01_字符集RNN
  4. 1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构!
  5. Android组件化架构实践,成功拿下大厂offer
  6. tableau之仪表板与故事
  7. ocx找不到指定模块
  8. DSP-EALLOW和EDIS
  9. c语言英文版孤独怎么说,孤独的伤感的英文句子
  10. 股票入门浅学20210721