键盘控制ROS车运动

键盘控制ROS车运动

上位机

使用pyseria库与stm32单片机进行通信控制

#!/usr/bin/env python
# -*- coding: utf-8 -*import sys, select, termios, tty
import serialmsg = """
---------------------------w     a    x    ds     w : +x    a : +y
s : -x    d : -y 
x : stop其他按键 : stopq/z : 线性速度增加/减少1RPM
e/c : 只增加/减少角速度1RPMCTRL-C 退出
---------------------------
"""moveBindings = {
'w':'w',
's':'s',
'a':'a',
'd':'d',
'x':'x',
'q':'q',
'z':'z',
'e':'e',
'c':'c'}def getKey():tty.setraw(sys.stdin.fileno())select.select([sys.stdin], [], [], 0)key = sys.stdin.read(1)termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)return keyif __name__=="__main__":settings = termios.tcgetattr(sys.stdin)port = '/dev/ttyUSB1'  # 串口号baud = 115200  # 波特率ser = serial.Serial(port, baud, timeout=0.5)flag = ser.isOpen()try:print(msg)print(port, "串口打开成功")if flag:while(1):key = getKey()if key in moveBindings.keys():data = moveBindings[key]ser.write(data.encode("gbk"))# print('串口发送数据:  ', data)else:if (key == '\x03'):breakexcept Exception as e:print(e)print("串口打开异常")

下位机

下位机采用USART1进行通信,轮毂电机的控制参考上篇文章STM32HAL库RS485-ModBus协议控制伺服电机

uint16_t data[2] = {0, 0};
uint16_t data1[2] = {-16, 16};
uint16_t data2[2] = {6, 6};
uint16_t data3[2] = {0, 0};
uint8_t RxData;int main(void)
{/* USER CODE BEGIN 1 */uint16_t speed_flag, turn_flag;uint16_t speed = 10;uint16_t turn = 10;speed_flag = turn_flag = 1;/* USER CODE END 1 *///....初始化省略...../* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &RxData,1);//RS485发送模式HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);//电机初始化指令MBRTUMasterWriteSingleRegister(&MBRTUHandle, 1, 0X200D, 0x0003, 100);HAL_Delay(10);MBRTUMasterWriteSingleRegister(&MBRTUHandle, 1, 0X200E, 0x0008, 100);HAL_Delay(10);MBRTUMasterWriteSingleRegister(&MBRTUHandle, 1, 0X200E, 0x0010, 100);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);if(RxData == 'w'||RxData == 's'||RxData == 'a'||RxData == 'd'||RxData == 'x'||RxData == 'e'||RxData == 'c'||RxData == 'q'||RxData == 'z'){if(RxData == 'w' || RxData == 's'||RxData == 'q'||RxData == 'z'){if(RxData == 'w') speed_flag = 1;if(RxData == 's') speed_flag = -1;if(RxData == 'q') speed+=10;if(RxData == 'z') speed-=10;data[0] = speed_flag * speed;data[1] = -speed_flag * speed;}if(RxData == 'a'||RxData == 'd'||RxData == 'e'||RxData == 'c'){if (RxData == 'a') turn_flag = 1;if (RxData == 'd') turn_flag = -1;if(RxData == 'e') turn+=10;if(RxData == 'c') turn-=10;data[0] = turn_flag * turn;data[1] = turn_flag * turn;}if(RxData == 'x'){data[0] = 0;data[1] = 0;}//0x10指令便于给多寄存器发送指令,电机同时启动MBRTUMasterWriteMultipleRegisters(&MBRTUHandle, 1, 0X2088, 0X0002, data, 100);}RxData = ' ';}

加入按键外部中断控制,进行测试或急停

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin==WK_UP_EXTI_Pin){HAL_Delay(10);if(HAL_GPIO_ReadPin(WK_UP_EXTI_GPIO_Port, WK_UP_EXTI_Pin) == 1){MBRTUMasterWriteMultipleRegisters(&MBRTUHandle, 1, 0X2088, 0X0002, data3, 100);}}else if(GPIO_Pin==KEY0_EXTI_Pin){HAL_Delay(10);if(HAL_GPIO_ReadPin(KEY0_EXTI_GPIO_Port, KEY0_EXTI_Pin) == 0){
//            MBRTUMasterWriteMultipleRegisters(&MBRTUHandle, 1, 0X2088, 0X0002, data1, 100);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET);MBRTUMasterReadHoldingRegisters(&MBRTUHandle, 0x01, 0x20AB, 0x0002, 100);HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);}}else if(GPIO_Pin==KEY1_EXTI_Pin){HAL_Delay(10);if(HAL_GPIO_ReadPin(KEY1_EXTI_GPIO_Port, KEY1_EXTI_Pin) == 0){MBRTUMasterWriteMultipleRegisters(&MBRTUHandle, 1, 0X2088, 0X0002, data2, 100);}}
}

运行结果

赋予串口权限

sudo chmod 777 /dev/ttyUSB*
python3 keyboard_control.py 

image-20231120164116548

演示视频
键盘控制节点编写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广西柳州机械异形零部件三维扫描3D抄数全尺寸测绘建模-CASAIM中科广电

一、背景介绍 复杂机械异形零部件具有不规则的形状和复杂的结构,给生产制造带来了很大的检测难度。为了确保零部件的制造质量和精度,需要对零部件进行全面的尺寸检测和分析。 CASAIM三维扫描仪在机械异形零部件全尺寸检测应用可以实现对机械异形零部件…

腾讯云轻量数据库是什么?性能如何?费用价格说明

腾讯云轻量数据库测评,轻量数据库100%兼容MySQL 5.7和8.0,腾讯云提供1C1G20GB、1C1G40GB、1C2G80GB、2C4G120GB、2C8G240GB五种规格轻量数据库,腾讯云百科txybk.com分享腾讯云轻量数据库测评、轻量数据库详细介绍、特性、配置价格和常见问题解…

JVM 调优指南

文章目录 为什么要学 JVM一、JVM 整体布局二、Class 文件规范三、类加载模块四、执行引擎五、GC 垃圾回收1 、JVM内存布局2 、 JVM 有哪些主要的垃圾回收器?3 、分代垃圾回收工作机制 六、对 JVM 进行调优的基础思路七、 GC 情况分析实例 JVM调优指南 -- 楼兰 ​ JV…

口袋参谋:如何通过布局“问大家”,快速提高宝贝转化!

问大家对于中小卖家来说,是非常适合的,因为我们完全可以靠对问大家的布局,提高宝贝的转化率。 问大家的作用 问大家主要是方便买家在购买前,了解商品的一些问题,而作为该不该购买的参考。对于卖家来说,是…

boost test、google test、google benchmark使用

一、boost test 提供基于命令行的单元测试套件&#xff1a;Unit Test FrameWork,还可以检测内存泄漏&#xff0c;程序运行监控功能。 #include <boost/test/unit_test.hpp> 链接两个需要编译的库&#xff1a;boost_unit_test_framework、boost_test_exec_monitor 功能…

释放机器人潜力,INDEMIND深耕底层技术

市场转暖&#xff0c;但攘外需要同时安内。 市场降温之后&#xff0c;正迎来拐点 疫情之后&#xff0c;经济逐渐下行&#xff0c;服务机器人的“好日子”也随之结束&#xff0c;整个行业都在动荡中经历渡劫。根据TE智库报告显示&#xff0c;从2022年开始&#xff0c;我国服务…

解决一个Seurat依赖包版本问题 Error in getClassDef

Seurat4使用FindClusters报错&#xff1a; Error in getClassDef(xsuperClass, package packageSlot(x))virtual : no applicable method for applied to an object of class “NULL” 原因是使用conda安装Seurat时&#xff0c;Matrix默认安装的最新版1.6.2。降级到1.6.1 即…

强化学习算法TRPO的理解

Trust Region Policy Optimization 角度一&#xff1a;off-policy重要性采样 Importance Sampling梯度优化 角度二&#xff1a;数值优化置信域优化蒙特卡洛近似 TRPO算法的全称是 Trust Region Policy Optimization&#xff0c;即信赖域策略优化。 角度一&#xff1a;off-polic…

疑似openAI的BUG

Chat gpt 4.0 『最新数据2023年』 Chat gpt 3.5 智商不在线『最近数据2021年9月左右』 发现了疑似openAI的一个bug 通过固定连接访问就可以用chatgpt4.0 4.0版本的费用为20美金一个月 https://chat.openai.com/?modelgpt-4-gizmo

【Linux】C文件系统详解(四)——磁盘的物理和抽象结构

文章目录 磁盘结构磁盘物理结构磁盘的具体物理结构磁盘结构的逻辑抽象 文件系统BootBlockSuperBlockGroupDescriptorTableinode tableDataBlocksinodeBitmapblockBitmaplinux中的inode 和文件名如何理解文件的增删查改删 补充细节1.如果文件误删了,我们该怎么办?2.inode确定分…

服务器端请求伪造(SSRF)

概念 SSRF(Server-Side Request Forgery&#xff0c;服务器端请求伪造) 是一种由攻击者构造形成的由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要攻击目标网站的内部系统。&#xff08;因为内部系统无法从外网访问&#xff0c;所以要把目标网站当做中间人来…

reset函数的使用

在C中&#xff0c;"reset"函数用于智能指针和一些类的成员函数&#xff0c;作用是重新设置对象的状态&#xff0c;释放原有资源并可能分配新的资源。下面分别是从智能指针和一般的类成员函数两个方面解释&#xff1a; 智能指针的 reset 函数&#xff1a; 在 C 中&a…

Thinkphp6实现定时任务功能

本文主要介绍命令启动定时任务的功能&#xff0c;按照CRMEB标准版的程序为大家详细的进行实现过程的介绍 首先创建安装Worker&#xff0c;执行composer require topthink/think-worker 安装在config/console.php中定义指令 timer > \crmeb\command\Timer::class 3. 对应图1…

C++ Qt 学习(八):Qt 绘图技术与图形视图

1. 常见 18 种 Qt 绘图技术 1.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <memory> #include <QTreeView> #include "CPaintWidget.h"using namespace std;class Widget : public QWidget {Q_OBJECTpublic:Widget…

使用Python实现3D曲线拟合

曲线拟合是数据分析和数学建模领域中广泛使用的技术。它涉及到寻找最接近一组数据点的数学函数的过程。在3D曲线拟合中&#xff0c;该过程被扩展到三维空间&#xff0c;其中的目标是找到最好地表示一组3D数据点的函数。 Python是一种用于科学计算的流行编程语言&#xff0c;它…

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日&#xff0c;来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation&#xff08;APA&#xff09;&#xff0c;结合大模型智能体帮助人类进行工作流构建&#x…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…

广西南宁新能源汽车电机定子三维扫描3D尺寸测量检测-CASAIM中科广电

一、背景介绍 电机定子压圈是一种用于电机上对电机定子的两端进行固定的辅助装置&#xff0c;在电机制造业中&#xff0c;电机定子制造的工艺水平往往能够直接决定电机制造的性能质量。而传统电机定子检测主要通过三坐标测量以及人工卡尺测量两种测量方式&#xff0c;三坐标每…

在服务器上部署MVC 6应用程序

在服务器上成功部署MVC 6应用程序&#xff08;现在更为称为ASP.NET Core MVC&#xff09;涉及一系列步骤。以下是一般的指导步骤&#xff1a; 1. 准备服务器环境&#xff1a; - 确保服务器上安装了.NET Core Runtime和.NET Core SDK。可以从[.NET下载页面](https://dotnet.mi…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…