python机器人编程——用python调用API控制wifi小车的实例程序

目录

  • 一、前言
  • 二、一个客户端的简单实现
    • 2.1 首先定义一个类及属性
    • 2.2 其次定义连接方法
    • 2.3 定义一些回调函数
    • 2.4 定义发送小车指令方法
    • 2.5 定义一个正常关闭方法
  • 三、python编程控制小车的demo实现
  • 四、小结
  • PS.扩展阅读
    • ps1.六自由度机器人相关文章资源
    • ps2.四轴机器相关文章资源
    • ps3.移动小车相关文章资源
    • ps3.wifi小车控制相关文章资源

一、前言

前一篇博文python机器人编程——用手机web远程视频监控并控制小车驾驶(中篇真机实现)我们实现了手机远程操控小车:
在这里插入图片描述
同样的,由于我们的小车通讯用的时通用的websocket,我们可以用python也能操控小车。下面是客户端的实现及demo示例。

二、一个客户端的简单实现

我们小车实现了简单的控制接收指令,格式是json的。指令如下:

{               
            'stop': 0,               
            'allcontrl': 0,
            'vleft': 0,
            'vright': 0,   
            'track': 0
        }

针对这个指令,我们实现一个websocket客户端,并实现连接、发送心跳、断了自动重新连接等功能。
我们依赖一个库websocket-client实现:

pip install websocket-client

2.1 首先定义一个类及属性

import websocket
import threading
import time
import json
class CarClient:
    def __init__(self, ip="localhost"):
        self.ws = None
        self.connected = False 
        self.ip = ip       
        self.ping_interval = 2  # Ping interval in seconds
        # Define control commands
        self.cmd = {               
            'stop': 0,               
            'allcontrl': 0,
            'vleft': 0,
            'vright': 0,   
            'track': 0
        }
        self.isSelfClose=False
        self.attempts=0

以上属性包括ip,为小车的远程ip地址。self.attempts为断开连接后尝试重连的次数。

2.2 其次定义连接方法

这里我们通过开启一个新线程实现连接:

    def connect(self):
        self.ws = websocket.WebSocketApp("ws://" + self.ip + ":9000/ws",
                                         on_open=self.on_open,
                                         on_message=self.on_message,
                                         on_error=self.on_error,
                                         on_close=self.on_close)
        
        wst = threading.Thread(target=self.ws.run_forever)
        wst.daemon = True
        wst.start()

2.3 定义一些回调函数

主要定义一个on_open,连接后发送心跳包,这里简单的是"ping",发送间隔为2秒。

def on_open(self, ws):
        print("WebSocket connection opened")
        self.connected = True
        self.isSelfClose=False
        self.attempts=0
        self.start_pinger()  # Start the pinger when the connection is opened

def start_pinger(self):
        # Define a function to send ping
        def ping():
            while self.connected:
                if self.ws.sock is not None:
                    self.ws.send("ping")
                    print("Sent ping")
                time.sleep(self.ping_interval)
        threading.Thread(target=ping).start()

定义异常断开后重连机制:

    def on_close(self, ws, close_status_code, close_msg):
        print("WebSocket connection closed")
        self.connected = False
        if self.isSelfClose:
            return
        if self.attempts!=0:
            return
        self.reconnect()

    def reconnect(self, max_attempts=5):
        self.attempts = 0
        while self.attempts < max_attempts and not self.connected:
            print(f"Attempting to reconnect... (Attempt {self.attempts + 1}/{max_attempts})")
            try:
                self.connect()
                if self.connected:
                    print("Successfully reconnected")
                    break
            except:
                print("Reconnection failed")
            self.attempts += 1
            time.sleep(2)  # Wait for 2 seconds before next attempt

        if not self.connected:
            print("Failed to reconnect after maximum attempts")

2.4 定义发送小车指令方法

定义一个send方法,用于发送左右轮速度及停止指令:

    def send(self, vl, vr, istop=0):
        if not self.connected:
            print("WebSocket is not connected. Cannot send message.")
            return        
        self.cmd['vleft'] = vl
        self.cmd['vright'] = vr
        self.cmd['stop'] = istop        
        message = json.dumps(self.cmd)
        self.ws.send(message)
        print(f"Sent message: {message}")

2.5 定义一个正常关闭方法

    def close(self):
        if self.ws and self.ws.sock is not None:
            self.isSelfClose=True
            self.attempts=0
            self.ws.close()
            print("WebSocket connection closed manually")
            self.connected = False

至此,完成了一个远程控制客户端的类。

三、python编程控制小车的demo实现

有了以上的客户端类,我们就可以导入这个类,然后对小车进行控制了,示例程序如下:

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 19 13:02:10 2024

@author: JAMES FEI
python API 使用实例
第一步:打开小车的.exe文件,进入运行状态
第二步:打开全局控制开关、打开远程控制开关
第三步: 进入下面编程:
"""
import time
#(1)导入客户端模块
from CarClient import CarClient
#(2)实例化一个类,ip根据小车界面获取,同一个机器为localhost
car=CarClient(ip="localhost")
#(3)连接小车
car.connect()
#(4)等待连接完成
time.sleep(2)
#(5)设置左右轮速度为 10,10 r/min
car.send(10,10)
# (6) 行走运行2秒钟
time.sleep(3)
#(7)慢慢停下来,速度为 0,0 r/min
for i in range(6):
    time.sleep(0.5)    
    car.send(10-i*2,10-i*2)

具体操作见以下视频:

无线小车的python的API开发示例

四、小结

小车使用通用websocket的好处是可以进行多语言跨平台的交互,在网络满足实时性的基础上,可以方便的进行二次开发。websocket既可以用html实现,也可以用python等其它语言进行接口实现。这样就有利于掌握不同语言技能的人进行应用扩展。

[------------本篇完-------------]

PS.扩展阅读

————————————————————————————————————————

对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询

ps1.六自由度机器人相关文章资源

(1) 对六自由度机械臂的运动控制及python实现(附源码)
在这里插入图片描述

(2) N轴机械臂的MDH正向建模,及python算法
在这里插入图片描述

ps2.四轴机器相关文章资源

(1) 文章:python机器人编程——用python实现一个写字机器人
在这里插入图片描述

在这里插入图片描述

(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播

(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
在这里插入图片描述
在这里插入图片描述

ps3.移动小车相关文章资源

(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
在这里插入图片描述
在这里插入图片描述

(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ps3.wifi小车控制相关文章资源

web端配套资源源代码已经上传(竖屏版),下载地址
仿真配套资源已经上传:下载地址
web端配套资源源代码已经上传(横屏版),下载地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0开始linux(19)——如何写一个linux环境下运行的shell程序

欢迎来到博主的专栏&#xff1a;从0开始Linux 博主ID&#xff1a;代码小豪 文章目录 bashmyshell源码 bash 什么&#xff1f;我写bash&#xff1f;bash作为一个大型的shell程序&#xff0c;甚至已经成为一种语言。博主当然没能力复刻。 博主这里写了一个仿bash的shell程序。主…

Linux:文件系统基础命令扫盲

目录 查看目录下的文件 创建目录文件 删除目录文件 打印当前工作目录 切换工作目录 删除文件 复制文件或目录 移动文件或目录 创建文件 &#x1f680;主页&#xff1a;R6bandito_ ✈往期&#xff1a;《Linux与Windows文件共享》 查看目录下的文件 命令&#xff1a;ls …

2024年【流动式起重机司机】考试技巧及流动式起重机司机模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 流动式起重机司机考试技巧是安全生产模拟考试一点通生成的&#xff0c;流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材汇编出流动式起重机司机仿真模拟考试。2024年【流动式起重机司机】考试技巧及…

正确的功能可将热晶体管风速计线性化

处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如&#xff0c;如果传感器响应是对数函数&#xff0c;则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点&#xff08;参见参考论文中的图 4&#xff09;。刚开始时&#xff0…

若依前后分离版集成积木报表进行token传递

若依分离板集成积木报表就不说了需要的请移步&#xff1a;若依前后分离版集成积木报表-CSDN博客 考虑到前端摸鱼不干活,所以一般都是前后端都干&#xff0c;我这里前后端都搞上&#xff0c;你们直接抄&#xff0c;抄完接着去摸鱼&#xff0c;代码不美观&#xff0c;轻喷 一、…

【景观生态学实验】实验一 ArcGIS地理数据处理及制图基础

实验目的 1.掌握ArcGIS软件基本操作&#xff1a;通过实验操作与学习&#xff0c;熟练掌握ArcGIS软件相关的基本操作&#xff0c;包括界面熟悉、工具栏使用、数据的加载和保存、基本数据处理操作等; 2.掌握如何使用ArcGIS进行影像拼接及裁剪&#xff1a;通过实验操作与学习&am…

ABAP SMARTFORMS(2)

1、表单接口 方法一&#xff1a;导入结构、内表&#xff0c;给全局定义传入结构体 方法二&#xff1a;只关联表&#xff0c;不关联结构,给全局定义传入结构体 GW_XYXX存的表头信息 GW_XYKQ存考勤信息,表中的每一行 初始化学员信息表的第一条数据作为表头 2、创建表头模板 该…

x-cmd mod | x sd - 搭配 fzf 实时预览文本替换效果,打造更直观高效的编辑体验

目录 介绍子命令使用案例 介绍 sd&#xff08;search & displace&#xff09;是一种查找和替换文本工具&#xff0c;使用常见的正则表达式语法&#xff0c;类似于 sed&#xff0c;但专注于替换操作&#xff0c;从而使用起来更直观、更易读。 该模块主要通过 fzf 以交互方式…

单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示

单片机STC8H8K64U开发板&#xff0c;型号RT8H8K001 预留Type C接口&#xff0c;可供电SWD下载&#xff1a; RA6809开发板&#xff0c;型号RT6809CNN01 预留Type C接口供电&#xff0c;预留MCU接口、电容触摸屏接口、液晶屏接口&#xff1a; 双臂合一&#xff0c;驱动和控…

Error in cpuinfo: prctl(PR_SVE_GET_VL) failed 错误记录

今天在一台新机器上面搭建安装环境的时候出现了上面的错误&#xff0c;直观感觉是跟py-cpuinfo这个模块有关系的。 Error in cpuinfo: prctl(PR_SVE_GET_VL) failed 错误通常与 ARM 架构上的 CPU 信息库&#xff08;如 cpuinfo&#xff09;相关&#xff0c;特别是在尝试获取可扩…

web pdf 图片拖动图片合成

web pdf 图片拖动图片合成 先看效果 前端 合成后 1.原理 以前写过相关的帖子&#xff0c;使用的是 canva 但是这次换了一个思路使用的是图片 1.先把pdf转成图片 2.把pdf图片和目标图片传到浏览器 3.原理就和图片合成一样了。见上一篇帖子 4.后端也一样只不过这次是将位置和pd…

IntelliJ IDEA 常用快捷键详解与自定义修改方法

目录 前言1. IntelliJ IDEA 常用快捷键1.1 代码编辑快捷键1.2 代码导航快捷键1.3 重构快捷键1.4 调试快捷键 2. 如何修改 IntelliJ IDEA 快捷键2.1 打开快捷键设置界面2.2 查找和修改快捷键2.3 导入和导出快捷键配置 结语 前言 IntelliJ IDEA 是一款广受开发者欢迎的集成开发环…

vue2之混入(mixin)

Vue 2 的混入&#xff08;Mixin&#xff09;是一种在 Vue 组件中分发可复用功能的方式。通过混入&#xff0c;你可以将一些通用的组件选项&#xff08;如数据、方法、计算属性、生命周期钩子等&#xff09;提取到一个混入对象中&#xff0c;并在多个组件中重用这些选项&#xf…

基于Python大数据的招聘数据分析及大屏可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

2024软考-《软件设计师》-易混淆知识点总结(1~6章)

一、计算机组成与体系结构 1.1、原码、反码、补码、移码的运算 原码&#xff1a;最高位表示符号位&#xff0c;其余低位表示数值的绝对值&#xff08;0表示正数&#xff0c;1表示负数&#xff09; 反码&#xff1a;正数的反码与原码相同&#xff0c;负数的反码是其绝对值按位…

基于ESP32的RGB便携式视频灯

基于ESP32的RGB便携式视频灯 拥有一套能够满足个人需求的灯光设备至关重要。市面上的RGB视频灯虽然功能强大&#xff0c;但往往价格不菲。我制作的这款灯是20W RGB便携式视频灯不仅满足了我的需求&#xff0c;而且成本仅为市售产品的三分之一。接下来&#xff0c;我将详细介绍这…

大模型开发实战1-QuickStart

0. 关于大模型和模型选择 由于OpenAI的ChatGPT流行&#xff0c;AI技术在大模型技术的赋能下高速发展&#xff0c;特别是2023年至今&#xff0c;国内的AI技术发展更是前所未有的景象&#xff0c;各大公司争相发布自己的大模型&#xff0c;包括百度文心一言&#xff0c;阿里同义…

正版CST电磁仿真软件:保障创新与合规的基石

在当今快速发展的科技时代&#xff0c;电磁仿真技术对于电子产品的设计、测试和优化至关重要。CST电磁仿真软件以其强大的功能和广泛的应用领域&#xff0c;成为众多企业和研究机构不可或缺的工具。然而&#xff0c;在选择使用CST软件时&#xff0c;确保使用正版软件不仅是对知…

【C++】红黑树的底层原理以及实现

#1024程序员节 | 征文# 个人主页&#xff1a;夜晚中的人海 文章目录 ⭐前言&#x1f686;一、红黑树的概念&#x1f3e0;二、红黑树的规则&#x1f384;三、红黑树的效率&#x1f3a1;四、红黑树的实现1. 基本框架2. 插入操作• 变色• 单旋 变色• 双旋 变色 3. 查找操作4. …

玄机平台-应急响应-webshell查杀

首先xshell连接 然后进入/var/www/html目录中&#xff0c;将文件变成压缩包 cd /var/www/html tar -czvf web.tar.gz ./* 开启一个http.server服务&#xff0c;将文件下载到本地 python3 -m http.server 放在D盾中检测 基本可以确认木马文件就是这四个 /var/www/html/shell.p…