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

news2024/10/20 17:52:39

目录

  • 一、前言
  • 二、一个客户端的简单实现
    • 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端配套资源源代码已经上传(横屏版),下载地址

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

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

相关文章

vue elementui table编辑表单时,弹框增加编辑明细数据

需求: 前端进行新增表单时&#xff0c;同时增加表单的明细数据。明细数据部分&#xff0c;通过弹框方式增加或者编辑。 效果图&#xff1a; 代码&#xff1a; <!-- 新增主表弹窗 Begin --><el-dialog:title"titleInfo"top"5vh"centerwidth"…

从零开始学PHP之输出语句变量常量

一、 输出方式 在 PHP 中输出方式&#xff1a; echo&#xff0c;print&#xff0c;print_r&#xff0c;var_dump 1、echo和print为php的输出语句 2、var_dump&#xff0c;print_r为php的输出函数 &#xff08;这里不做介绍&#xff09;echo 和 print 区别 1、echo - 可以输出…

Python学习的自我理解和想法(15)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第15天&#xff0c;从今天开始&#xff0c;每天一到两个常用模块&#xff0c;更完恢复到原来的&#xff0c;开学了&#xff0c;时间不多&am…

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka&#xff0c;本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业&#xff08;Load job&#xff09; 导入作业会常驻运行&#xff0c;当导入作业的状态为 R…

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…

算法专题八: 链表

目录 链表1. 链表的常用技巧和操作总结2. 两数相加3. 两两交换链表中的节点4. 重排链表5. 合并K个升序链表6. K个一组翻转链表 链表 1. 链表的常用技巧和操作总结 常用技巧 画图!!! 更加直观形象, 便于我们理解引入虚拟头节点, 方便我们对链表的操作, 减少我们对边界情况的考…

《欢乐饭米粒儿》第九季热播中,今晚精彩继续!

由鲜博士独家冠名播出的独创小品剧《欢乐饭米粒儿》第九季正在辽宁卫视热播&#xff0c;本期节目将于今晚20:50在辽宁卫视继续为观众带来欢笑与感动。本周节目亮点纷呈&#xff0c;三个小品故事不仅延续了节目一贯的幽默风格&#xff0c;更在欢笑中传递了深刻的社会价值和情感共…

Java 8 Stream API:从基础到高级,掌握流处理的艺术

一、Stream&#xff08;流&#xff09;基本介绍 Java 8 API 添加了一个新的抽象称为Stream&#xff08;流&#xff09;&#xff0c;可以让你以一种声明的方式处理数据&#xff0c;这种风格将要处理的元素集合看做一种流&#xff0c;元素流在管道中传输&#xff0c;并在管道中间…

Kamailio-Sngrep 短小精悍的利器

一个sip的抓包小工具&#xff0c;在GitHub上竟然能够积累1K的star&#xff0c;看来还是有点东西&#xff0c;当然官方的友链也是发挥了重要作用 首先送上项目地址&#xff0c;有能力的宝子可以自行查看 经典的网络抓包工具有很多&#xff0c;比如&#xff1a; Wireshark&…

vue实现文件预览和文件上传、下载、预览——多图、模型、dwg图纸、文档(word、excel、ppt、pdf)

整体思路&#xff08;模型特殊不考虑&#xff0c;别人封装不具备参考性&#xff09; 图片上传采用单独的组件&#xff0c;其他三种类型采用一个上传组件&#xff08;仅仅文件格式不同&#xff09;文件上传采用前端直接上传阿里云的方式图片预览使用elementUI自带的image预览dw…

双目标定的原理

标定目的&#xff1a;建立相机成像几何模型并矫正透镜畸变。 建立相机成像几何模型&#xff1a;计算机视觉的首要任务就是要通过拍摄到的图像信息获取到物体在真实三维世界里相对应的信息&#xff0c;于是&#xff0c;建立物体从三维世界映射到相机成像平面这一过程中的几何模…

ssm剧本杀预约系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环境与技术 3 2.1 Java语言…

【p2p、分布式,区块链笔记 Blockchain】truffle002 unleashed_rentable_nft 项目

上一篇&#xff1a;【p2p、分布式&#xff0c;区块链笔记 Blockchain】truffle001 以太坊开发框架truffle初步实践 项目结构 项目实现了一个简单的可租赁的 NFT 系统&#xff0c;用户可以铸造和销毁 NFT。这是作者写的项目介绍&#xff08;后边看issue才发现的&#xff09;&a…

xtrabackup工具介绍、安装及模拟数据库故障使用xtrabackup工具恢复数据等操作详细说明

一、xtrabackup工具介绍 Percona XtraBackup Percona XtraBackup是一个适用于MySQL的开源热备份工具&#xff0c;它在备份期间不锁表。它可以备份InnoDB、XtraDB以及MyISAM存储引擎的表。 2.4版本支持MySQL5.1、5.5、5.6以及5.7。 它有两个实用命令&#xff0c;分别是xtraback…

LeetCode_2469. 温度转换_java

1、问题 2469. 温度转换. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/convert-the-temperature/description/ 给你一个四舍五入到两位小数的非负浮点数 celsiu…

day3:管道,解压缩,vim

一&#xff0c;管道&#xff08;|&#xff09; 引入 当我们要将本次命令结果作为下次命令参数时就可以用到&#xff0c;极大的简化了操作。 比如&#xff1a;head -5 文件| tail -1&#xff1a;表示显示第五行这就是管道的魅力 概述 管道符&#xff1a;| 作用&#xff1a…

计算机网络——可靠数据传输原理

变成什么状态取决于当时发生的事件 在停止等待协议中只用1位来表示序号0和1——新的和旧的 在这里插入图片描述

IT运维的365天--017 如何在两台Linux服务器之间快速传输文件夹(同时设置免密)

前情提要(两台Linux服务器之间传输批量文件夹): 两台都是外网服务器,都是Linux系统(CentOS),都安装了宝塔,用于搭建巨量的静态网站,由于A服务器准备不要了,所以要在A服务器转移几百个静态网站到B服务器。 Linux下scp单命令传输文件夹测试: 准备工作,先测试转移一…

【Kafka】Kafka Producer的缓冲池机制原理

如何初始化的bufferPool的 在初始化的时候 初始化BufferPool对象 // 设置缓冲区 this.accumulator new RecordAccumulator(xxxxx,其他参数,new BufferPool(this.totalMemorySize, config.getInt(ProducerConfig.BATCH_SIZE_CONFIG), metrics, time, PRODUCER_METRIC_GROUP_N…

免费送源码:Java+SpringBoot+MySQL SpringBoot珠宝店客户关系管理系统 计算机毕业设计原创定制

摘 要 随着计算机技术的发展&#xff0c;特别是计算机网络技术与数据库技术的发展&#xff0c;使用人们的生活与工作方式发生了很大的改观。本课题研究的珠宝店客户关系管理系统&#xff0c;主要功能模块包括系统用户&#xff0c;部门类别&#xff0c;职务类别&#xff0c;外出…