键盘控制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

演示视频
键盘控制节点编写
相关文章:
键盘控制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 …...
linux上交叉编译qt库
linux上交叉编译qt库 Qt程序从X86平台Linux移植到ARM平台Linux需要做什么 1.在ubuntu上使用qt的源码交叉编译出Qt库 2.将编译好的库拷贝到开发板上并设置相应的环境变量(库路径啥的) 前两步一劳永逸,做一次就行 3.X86上写好程序代码&…...
Nacos介绍与使用
Nacos介绍与使用 文章目录 Nacos介绍与使用一. 什么是Nacos1 Nacos功能1.1 配置中心1.2 注册中心 2.为什么要使用Nacos 二.Nacos 部署安装1. Nacos 部署方式2. Nacos 安装3. 配置数据源4. 开启控制台授权登录(可选) 三. Nacos配置中心的使用1. 创建配置信…...
网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪
01 字节跳动 招聘岗位:网络虚拟化高级研发工程师 职责描述: 1、负责字节跳动虚拟网络产品的研发,包括但不局限于网络VPC、NAT、LB负载均衡等; 2、负责字节跳动网络基础平台的研发,包括但不局限于网络控制面系统、容器…...
Git 远程仓库(Github)
目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…...
Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)
Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析) 我希望如春天般的你,身着白色的婚纱,向我奔赴而来,我愿意用全世界最温情的目光,朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…...
C#编程题分享(2)
输出所有整数的和 让⽤户输⼊整数,如果⽤户输⼊的不是0,就继续输⼊,如果输⼊的是0,结束整数,并输出所有整数的和。 Console.WriteLine("请输⼊⼀个整数:"); int n; int sum 0; do {n Convert…...
Dockerfile基础
前言 知识点整理 Dockerfile 简介 它是一个没有后缀名的文本文档,里面是组合镜像的一些命令,Docker build命令构建镜像时,通过读取Dockerfile中的指令的顺序(自上到下)自动生成镜像。 Dockerfile 命令 1. FROM 指…...
python+selenium实现web自动化(基础入门)
selenium 是一个自动化操控工具,支持对web端进行自动化操控,从而实现自动化测试。 相关文档: https://python-selenium-zh.readthedocs.io/zh-cn/latest/https://www.selenium.dev/documentation/ 安装配置 环境依赖: python…...
Spring Boot 自动配置
1. Spring Boot 自动配置 Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用程序的配置过程。这个特性通过合理的默认值以及根据类路径和其他因素自动配置Spring Beans来极大地减少了配置的工作量。以下是Spring Boot自动配置的详细讲解: 基本…...
力扣labuladong一刷day13天双指针8道链表题
力扣labuladong一刷day13天双指针7道链表题 一、21. 合并两个有序链表 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 思路:合并只需要新new一个虚拟头结点,然后遍历比较两个链表把较小的那一个顺序接在虚拟头结点后面。…...
【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点
🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点📝结语 Ὄ…...
被环境变量虐过一遍获得的启示
Oracle数据库环境存在两个数据库版本12C及19C,在执行一些操作时需要设置对应版本的环境变量 计划登录12C环境,于是按如下方式设置环境变量 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_HOME/product/12.2.0/dbhome_1 export ORACLE_S…...
关于Hbase的一些问题
HBase 1. RowKey如何设计,设计不好会产生什么后果 唯一原则:在设计上要保持RowKey的唯一性。 因为HBase中的数据是以KV的格式来存储的,所以如果向同一张表中插入RowKey相同的数据,旧的数据会被覆盖掉。 长度原则:建…...
level=warning msg=“failed to retrieve runc version: signal: segmentation fault“
安装docker启动后,发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv:是否覆盖"/usr/bin/runc&q…...
电力工作记录仪、智能安全帽、智能布控球助力智能电网建设
电力行业的建设和发展是国家经济发展的重要支撑,而智能电网作为电力系统的重要组成部分,它的安全高效运行关乎到整个电力系统乃至民生的稳定和安全。为了加快国家经济的发展以及满足人们对电力的需求和用电可靠性的要求,国家早在十二规划中就…...
【CSS】各百分比透明度 opacity 对应的 16 进制颜色值(例如:#FFFFFF80)
文章目录 使用:6位颜色值2位透明度值 color: #000000D4; /* 等价于 */ color: #000000; opacity : 0.83; /* 等价于 */ color: #000000; opacity : 83%; 对照表(0:完全透明,1:不透明) 透明度值百分百值十…...
有依次对应关系的数组X、Y、Z,如何排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应(C语言实现)
1. 目的 有依次对应关系的数组X、Y、Z,排序其中一个X数组,使得另外的数组还与排序完成后的数组相对应,并打印出排序完成后的X、Y、Z数组。 2. 具体实现 以下面的这个对应关系为例,进行相应编程实现。 X [3.7,7.7,-6.6,1.5,-4.5…...
Mysql之聚合函数
Mysql之聚合函数 什么是聚合函数常见的聚合函数GROUP BYWITH ROLLUPHAVINGHAVING与WHERE的对比 总结SQL底层原理 什么是聚合函数 对一组数据进行汇总的函数,但是还是返回一个结果 聚合函数也叫聚集,分组函数 常见的聚合函数 1.AVG(): 求平均值 2.SUM() :…...
Flutter笔记:拖拽手势
Flutter笔记 拖拽手势 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134485123 目 录 1. 概述2. 垂直拖…...
轻量化研究代理:基于Agent架构的自动化信息处理方案
1. 项目概述:轻量化研究代理的诞生背景与核心价值在信息爆炸的时代,无论是学术研究者、行业分析师,还是产品经理、内容创作者,都面临着一个共同的痛点:如何从海量的、碎片化的信息中,高效地筛选、整合、提炼…...
探索Emergence-Codex-OpenClaw:下一代任务导向型代码AI的架构与实践
1. 项目概述与核心价值 最近在AI和代码生成领域,一个名为 emergence-codex-openclaw 的项目在开发者社区里引起了不小的讨论。这个项目源自 menezis-ai 组织,从名字就能嗅到一股“涌现”和“代码”混合的味道。简单来说,它不是一个直接面…...
高性能SQL解析库-fast-sqlparse
原本是我写的一个C 17跨平台SQL解析库,后面用pybind11编译成了pyd和so文件,然后二次开发而来,他的速度有一定的损失,但是我们解析SQL更简单、更快、更直观了。经过一年7个大版本的迭代开发、反复测试和不断完善,今年我…...
PlenopticDreamer:单视频生成3D内容的动态NeRF技术解析
1. 项目背景与核心价值在计算机视觉和图形学领域,从单张图片或视频生成高质量3D内容一直是极具挑战性的任务。传统方法通常需要复杂的多视角拍摄设备或繁琐的手动建模流程,而PlenopticDreamer的出现彻底改变了这一局面。这个开源框架通过深度学习技术&am…...
开源AI对话聚合平台LibreChat:统一管理多模型,部署与实战指南
1. 项目概述:一个真正开源的AI对话聚合平台如果你和我一样,在过去一年里被各种AI聊天机器人搞得眼花缭乱,一会儿用这个查资料,一会儿用那个写代码,账号密码记了一堆,界面换来换去效率极低,那你一…...
发票查验验证码OCR识别接口(新版旧版兼容+本地部署)
一. 发票查验验证码OCR识别-API (/mobile/recognize) Mobile版使用多颜色专用模型(各颜色使用独立模型)。 关联视频: https://www.bilibili.com/video/BV1mkQ8BoEaE/ (2026年最新发票查验验证码OCR模型) https://www.bilibili.com/video/B…...
WebMCP:连接Web应用与AI模型的统一协议服务器实践
1. 项目概述:一个连接Web应用与AI模型的“万能适配器”最近在折腾一些AI应用开发时,我遇到了一个挺典型的痛点:手头有各种功能强大的大语言模型(LLM),比如OpenAI的GPT、Anthropic的Claude,或者开…...
AI Team OS:从被动助手到自主协作的AI团队操作系统深度解析
1. 项目概述:从“你问我答”到“自主运转”的AI团队操作系统如果你用过Claude Code、Cursor或者GitHub Copilot,那你一定熟悉这个场景:你输入一个指令,AI助手生成一段代码或一个建议,然后它就停在那里,等待…...
YOLO系列语义分割 下采样改进:全网首发--使用 LAWDS 改进 轻量自适应权重下采样 ✨
1. 工程简介 🚀 本工程基于 Ultralytics 框架扩展,面向语义分割与 YOLO 系列模型改进实验。核心特点是通过切换 yaml 配置文件,即可快速完成不同网络结构的训练、对比与验证,无需为每个模型单独编写训练脚本。 当前已支持的主要模型家族 🧩 语义分割模型:UNet、UNet+…...
09-扩展知识——02. 初识 datetime 模块
02. 初识 datetime 模块 概述 datetime 是 Python 处理日期和时间的核心模块,提供了 date、time、datetime、timedelta、tzinfo 五个主要类。掌握这个模块是时间处理的基础。维度内容Whatdatetime 模块的五大核心类及其基本用法Why日常日期时间操作的首选模块When需…...
