目录
- 一、前言
- 二、一个客户端的简单实现
-
- [2.1 首先定义一个类及属性](#2.1 首先定义一个类及属性)
- [2.2 其次定义连接方法](#2.2 其次定义连接方法)
- [2.3 定义一些回调函数](#2.3 定义一些回调函数)
- [2.4 定义发送小车指令方法](#2.4 定义发送小车指令方法)
- [2.5 定义一个正常关闭方法](#2.5 定义一个正常关闭方法)
- 三、python编程控制小车的demo实现
- 四、小结
- PS.扩展阅读
一、前言
前一篇博文python机器人编程------用手机web远程视频监控并控制小车驾驶(中篇真机实现)我们实现了手机远程操控小车:
同样的,由于我们的小车通讯用的时通用的websocket,我们可以用python也能操控小车。下面是客户端的实现及demo示例。
二、一个客户端的简单实现
我们小车实现了简单的控制接收指令,格式是json的。指令如下:
python
{
'stop': 0,
'allcontrl': 0,
'vleft': 0,
'vright': 0,
'track': 0
}
针对这个指令,我们实现一个websocket客户端,并实现连接、发送心跳、断了自动重新连接等功能。
我们依赖一个库websocket-client实现:
powershell
pip install websocket-client
2.1 首先定义一个类及属性
python
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 其次定义连接方法
这里我们通过开启一个新线程实现连接:
python
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秒。
python
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()
定义异常断开后重连机制:
python
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方法,用于发送左右轮速度及停止指令:
python
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 定义一个正常关闭方法
python
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实现
有了以上的客户端类,我们就可以导入这个类,然后对小车进行控制了,示例程序如下:
python
# -*- 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实现(附源码)
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端配套资源源代码已经上传(横屏版),下载地址