mycobot 280 M5初级运动-语音指令

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(上) 项目的开发过程中,我们深入探讨了ROS的强大功能,包括但不限于使用move_base实现的自主导航,以及gmappping_ros进行的实时SLAM(同时定位与地图构建).还涉及到机械臂的控制和计算机视觉技术的应用,用于物体识别和环境感知,从而提高机器人的操作智能和适应性。下面是一个在MoveIt当中的演示。虽然在ROS环境中使用OpenCV进行图像处理引入了数据格式转换和节点通信的额外步骤,但这种方式也带来了更高的模块化和系统集成的灵活性,使得图像处理能够更加方便地与机器人的其他系统和功能集成。 阅读详情

在这里插入图片描述

使用简单的语音指令来控制机械臂的运动

一、用tkinter绘制界面并录音

1.使用tkinter来绘制界面

def __init__(self, master):
        self.master = master
        self.master.title("Voice Recorder")
        
        self.canvas = tk.Canvas(master, width=400, height=300, bg='white')
        self.canvas.pack()

        self.start_button = tk.Button(master, text="开始录音", command=self.start_recording)
        self.start_button.pack(side=tk.LEFT)

        self.stop_button = tk.Button(master, text="结束录音", command=self.stop_recording)
        self.stop_button.pack(side=tk.RIGHT)

        self.recording = False
        self.frames = []

2.定义其中的按键函数 start_recording和stop_recording

def start_recording(self):
        self.recording = True
        self.frames = []
        self.audio = pyaudio.PyAudio()
        self.stream = self.audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
        self.record()
def stop_recording(self):
        self.recording = False
        self.stream.stop_stream()
        self.stream.close()
        self.audio.terminate()
        self.save_recording()

3.定义记录流的动作和保存动作分别为record和save_recording

def record(self):
        if self.recording:
            data = self.stream.read(1024)
            self.frames.append(data)
            self.master.after(10, self.record)
def save_recording(self):
        if not os.path.exists('voice'):
            os.makedirs('voice')
        filename = datetime.now().strftime("%Y%m%d_%H%M%S") + ".wav"
        filepath = os.path.join('voice', filename)
        with wave.open(filepath, 'wb') as wf:
            wf.setnchannels(1)
            wf.setsampwidth(self.audio.get_sample_size(pyaudio.paInt16))
            wf.setframerate(44100)
            wf.writeframes(b''.join(self.frames))


4.创一个class并用main函数:


class VoiceRecorder:
........
if __name__ == "__main__":
    root = tk.Tk()
    recorder = VoiceRecorder(root)
    root.mainloop()

二、对录制的音频进行语音识别:

1.使用vosk离线模型来进行语音识别,主要识别几个指令

  • 向左
  • 向右
  • 向上
  • 向下

2.添加一个在save_recording以后的动作:

def recognize(self):
        wf = wave.open(self.filepath, "rb")
        if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000:
            raise ValueError("音频格式不支持")

        # 识别语音
        while True:
            data = wf.readframes(4000)
            if len(data) == 0:
                break
            if recognizer.AcceptWaveform(data):
                pass
                # print(recognizer.Result())
            else:
                pass
                # print(recognizer.PartialResult())
        print(recognizer.FinalResult())


三、开始控制机械臂

1.初始化机械臂并设置四个点位坐标

mc = MyCobot280('COM3')
# 初始化机械臂
motor1=90
motor2=0
motor3=0
motor4=0
motor5=90
motor6=55
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)


downAngles=[90,53,-121,67,90,54.4]
upAngles=[motor1, motor2, motor3, motor4, motor5, motor6]
rightAngles=[motor1, 90, -90, motor4, motor5, motor6]
leftAngles=[motor1, -90, 90, motor4, motor5, motor6]

# 从上下左右四个点各走一遍
for angles in [downAngles, upAngles, rightAngles, leftAngles]:
    mc.send_angles(angles, 100)
    time.sleep(1)  # 等待1秒以便观察动作

2.对指令进行区别辨认,并控制机械臂运动

# 解析 JSON 字符串
        result_dict = json.loads(result)  # 将字符串解析为字典
        recognized_text = result_dict.get("text", "").replace(" ", "")  # 提取识别的文本内容
        print(recognized_text)  # 打印提取的文本内容

        # 根据识别结果控制机械臂
        if "向上" in recognized_text:
            print("向上")
            mc.send_angles(upAngles, 100)
        elif "向下" in recognized_text:
            print("向下")
            mc.send_angles(downAngles, 100)
        elif "向左" in recognized_text:
            print("向左")
            mc.send_angles(leftAngles, 100)
        elif "向右" in recognized_text or "相有" in recognized_text:
            print("向右")
            mc.send_angles(rightAngles, 100)
        else:
            print("停止")
            mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)



这里有一个bug,可能是我普通话不标准,向右的“”指令“”一直识别成“”相有“”

四、全部代码如下

import tkinter as tk
import wave
import pyaudio
import os
from datetime import datetime
from vosk import Model, KaldiRecognizer
import json  # 确保导入 json 模块

from pymycobot import MyCobot280
import time


mc = MyCobot280('COM3')
# 初始化机械臂
motor1=90
motor2=0
motor3=0
motor4=0
motor5=90
motor6=55
mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)


downAngles=[90,53,-121,67,90,54.4]
upAngles=[motor1, motor2, motor3, motor4, motor5, motor6]
rightAngles=[motor1, 90, -90, motor4, motor5, motor6]
leftAngles=[motor1, -90, 90, motor4, motor5, motor6]

# 从上下左右四个点各走一遍
for angles in [downAngles, upAngles, rightAngles, leftAngles]:
    mc.send_angles(angles, 100)
    time.sleep(1)  # 等待1秒以便观察动作


# 加载模型
modulePath = "vosk-model-cn-0.22"
model = Model(modulePath)  # 下载的模型路径
recognizer = KaldiRecognizer(model, 16000)


class VoiceRecorder:
    def __init__(self, master):
        self.filename = ""
        self.filepath = ""
        self.master = master
        self.master.title("Voice Recorder")
        
        self.canvas = tk.Canvas(master, width=400, height=300, bg='white')
        self.canvas.pack()

        self.start_button = tk.Button(master, text="开始录音", command=self.start_recording)
        self.start_button.pack(side=tk.LEFT)

        self.stop_button = tk.Button(master, text="结束录音", command=self.stop_recording)
        self.stop_button.pack(side=tk.RIGHT)

        self.recording = False
        self.frames = []

    def start_recording(self):
        self.recording = True
        self.frames = []
        self.audio = pyaudio.PyAudio()
        self.stream = self.audio.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=1024)
        self.record()

    def record(self):
        if self.recording:
            data = self.stream.read(1024)
            self.frames.append(data)
            self.master.after(10, self.record)

    def stop_recording(self):
        self.recording = False
        self.stream.stop_stream()
        self.stream.close()
        self.audio.terminate()
        self.save_recording()

    def save_recording(self):
        if not os.path.exists('voice'):
            os.makedirs('voice')
        filename = datetime.now().strftime("%Y%m%d_%H%M%S") + ".wav"
        self.filename = filename
        filepath = os.path.join('voice', filename)
        self.filepath = filepath
        with wave.open(filepath, 'wb') as wf:
            wf.setnchannels(1)
            wf.setsampwidth(self.audio.get_sample_size(pyaudio.paInt16))
            wf.setframerate(16000)
            wf.writeframes(b''.join(self.frames))
        self.recognize()

    def recognize(self):
        wf = wave.open(self.filepath, "rb")
        if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getframerate() != 16000:
            raise ValueError("音频格式不支持")

        # 识别语音
        while True:
            data = wf.readframes(4000)
            if len(data) == 0:
                break
            if recognizer.AcceptWaveform(data):
                pass
                # print(recognizer.Result())
            else:
                pass
                # print(recognizer.PartialResult())
        result = recognizer.FinalResult()
        print(result)  # 打印完整结果

        # 解析 JSON 字符串
        result_dict = json.loads(result)  # 将字符串解析为字典
        recognized_text = result_dict.get("text", "").replace(" ", "")  # 提取识别的文本内容
        print(recognized_text)  # 打印提取的文本内容

        # 根据识别结果控制机械臂
        if "向上" in recognized_text:
            print("向上")
            mc.send_angles(upAngles, 100)
        elif "向下" in recognized_text:
            print("向下")
            mc.send_angles(downAngles, 100)
        elif "向左" in recognized_text:
            print("向左")
            mc.send_angles(leftAngles, 100)
        elif "向右" in recognized_text or "相有" in recognized_text:
            print("向右")
            mc.send_angles(rightAngles, 100)
        else:
            print("停止")
            mc.send_angles([motor1, motor2, motor3, motor4, motor5, motor6], 100)

if __name__ == "__main__":
    root = tk.Tk()
    recorder = VoiceRecorder(root)
    root.mainloop()





Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析 把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。 阅读详情

相关推荐

数值计算之 插值法(4)切比雪夫零点插值

数值计算之 插值法(4)切比雪夫零点插值前言插值点选取第一类切比雪夫多项式拉格朗日插值多项式的余项切比雪夫零点插值后记 前言 上篇插值法讨论了多项式插值的解,以及龙格现象。本篇将介绍一种在抽取节点时有效降低龙格现象的方法——切比雪夫零点插值。 插值点选取 插值多项式阶数较高时,在取值空间均匀取点,容易出现龙格现象。 即区间边缘的插值结果与原函数差异很大,而区间中央的插值结果相对较好。这表明,高阶多项式插值对区间中央的节点拟合好,而对两端节点拟合效果差。 自然而然会想到,在两端多采样一些节点,在中间少采样一

qq_41035283的博客 1万+

大象机器人myCobot 280 2023版全新功能展示

总的来说,myCobot 280 2023是一款具有多种新功能和改进的机械臂,大大增强了其性能和应用范围。除了提升通信速度、支持 ROS2、避免自干扰碰撞外,我们还推出了AIKit 2023,将机器视觉与机械臂相结合,实现类似工业的自动化场景,让机械臂的应用更加广泛和多样化。此外,myCobot 280 2023 还有许多其他功能等着你去探索,比如绘图、AI分拣抓取等,这将进一步拓展机械臂的应用范围和创新。如果您有更好的项目和想法,请随时与我们分享。我们非常乐意听取您的建议,为您提供更好的服务。

m0_71627844的博客 2445

【上海大学计算机组成原理实验报告】六、内存系统实验

学习内存访问机制//理解代码和数据的分区存放原理和技术//手动方式把立即数`33H`写入内存`D1H`单元//手动方式把`D1H`单元的内容读出,再送入`ST`单元//在`CP226`汇编语言程序集成开发环境下编写程序//既然有`ORG`微指令,为什么集成开发环境下载到实验箱的目标程序的第一条执行语句最好存放在0号地址?//上海大学计算机组成原理实验//内存系统实验

HackerKevon的博客 3128

使用RealSense D455的空间识别操作大象机器人myCobot协作机械臂

在myStudio 3.1.3中,将出现如图3和图4所示的屏幕,然后下载最新版本的Minirobot for Basic和AtomMain for ATOM,选择Flash,然后写入固件。应该以相同的方式处理,但 RGB 也以相同的方式表示。默认情况下,点云大小设置为 0.01 m,这是一个很大的值,因此点云相互重叠显示,但如果将其设置为 0.001 m 左右,您可以看到点云的获取非常精细。当然,相机和myCobot之间的位置关系是暂时的,因此相机看到的myCobot位置与Rviz中显示的模型位置不重叠。

m0_71627844的博客 2187

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 680

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程->IP Integrator->综合、实现、生成Bitstream->SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3694

mycobot 280 M5初级运动-左右跟随晃动

功能: 发送指定的单个关节运动至指定的电位值参数说明:joint_id: 代表机械臂的关节,用数字1-6来表示。encoder:表示机械臂的电位值,取值范围是 0 ~ 4096sp: 表示机械臂运动的速度,范围1~100返回值: 1。

harebert的博客 381

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南

本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。

weixin_29046035的博客 503

大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)

大模型 + 机械臂:通过语音控制实现物体抓取(Gazebo 仿真验证)-----非常简单,后续推出复杂行为规划。(说明:包含语音交互、视觉处理、大模型、坐标转换、机械臂控制五大模块,通过 ROS 话题通信):捕获 Gazebo 相机图像,通过阿里云大模型(Qwen-VL)定位物体中心点像素坐标。:将图像像素坐标转换为机械臂末端执行器的三维坐标(Gazebo 世界坐标系)。:订阅坐标话题,控制机械臂运动和夹爪动作,包含安全机制(忙状态标志。:通过 Qwen-VL 快速定位物体,避免传统视觉算法复杂建模;

2301_78619377的博客 5475

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

Coding... 2851

YooAsset 学习

YooAssets使用教程

weixin_44884538的博客 1659

GPT-4V的图像处理和SoM物体检测算法相结合,通过自然语言和机器交互实现机械臂运动!

能够对图像理解,图像生成,图像描述的功能,这样大模型结合GPT-4的强大自然语言处理能力和现金的图像分析技术,可以提供更高效和更准确的视觉和语言综合能力。本项目创建了一个使用GPT-4V和myCobot的一个演示,演示机械臂简单得到拾取操作,这个演示使用了一个名叫SoM(物体检测对象)的方法,通过自然语言生成机器人动作。在图像处理和GPT-4V模型处理完后会根据解析的指令生成目标的点位信息,这些点位信息被传递给机械臂控制系统,机械臂控制系统根据点位信息移动到响应的位置进行抓去动作。

m0_71627844的博客 2045

52、Power BI Desktop 数据筛选全攻略

本文全面介绍了Power BI Desktop中各类数据筛选功能的使用方法,涵盖布尔型数据筛选、高级文本筛选、Top N筛选、可视化级别、页面级别和报告级别筛选等核心操作。通过详细步骤、流程图和实际案例,帮助用户深入理解筛选器的层级关系与综合应用技巧,并提供常见问题解决方案,助力高效精准的数据分析与可视化展示。

linux6sysadmin的博客 110

高校实训|基于VLA的多模态具身智能实验实训——成都某本科高校

1月5日-9日,TsingtaoAI派驻专家团队,成功为成都某高校计算机专业的本科生交付基于VLA的多模态具身智能实验实训项目。 该实训项目紧扣全球Embodied AI的技术浪潮,将前沿大模型技术与物理实体深度融合实操。项目围绕“感知-理解-决策-执行”的闭环,深度集成了DeepSeek-R1大语言模型与Qwen-VL视觉大模型,构建了典型的VLA技术架构。实训中,学生在Jetson Nano平台上实现多模态数据的跨层调用。

weixin_48649532的博客 813

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MyCobot 280 M5 ROS moveit 抓取物体

官方给的moveit例程是基于rviz手动拖动模型来生成目标点的,这里提供了一种通过脚本参数来生成目标点的方式,代码如下: import rospy, sys import moveit_commander from geometry_msgs.msg import PoseStamped, Pose from copy import deepcopy from pymycobot import MyCobot class MoveItIkDemo: def __init__(self):

weixin_42023563的博客 2337

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 400

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 232

Python+Agent入门笔记(二):列表推导式、模块和异常,这些写 Agent 前得会

接上一篇《Python+Agent入门笔记(一)》。基础语法跑通之后,这篇聊几块日常写脚本绕不开的东西。还是按 JS/Go 开发者的视角写,尽量记录我实际卡过的地方。

qq_41241612的博客 430

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 422

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 205

Python3 协程:异步编程的核心机制与实战

协程是解决I/O密集型任务等待瓶颈的高效机制,相比线程更轻量、无锁开销。从yield到async/await的演进,使异步编程语义清晰、易于理解。通过async/await可实现并发执行多个任务(如gather、create_task),显著提升网络请求、爬虫等场景性能。关键在于使用异步库(如aiohttp)替代同步库,避免阻塞事件循环。合理控制超时与并发数,才能发挥协程最大优势。

Lxn2zh的博客 159

python如何控制浏览器

Python 可以通过 Selenium、Playwright 等工具实现浏览器自动化,从打开网页到执行复杂交互操作均可脚本化完成。Selenium生态成熟

2601_96797912的博客 76

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 267

torch.compile 差异仅 1e-6,边界样本预测为何翻转

torch.compile 加速后输出与 eager 不一致,部分预测翻转。逐层对比与 graph break 分析定位到动态分支翻转根因。容差回归仅适用于无分支翻转场景,零容忍场景应禁用编译。

昨日种种,皆成今我。今日种种,皆成新我。 159

Python 100讲课程导航:第08篇《Python input 与类型转换:构建可靠的交互程序》

本文详解Python中input()的返回类型为字符串,强调必须通过int()、float()等函数进行类型转换。重点讲解了输入验证的重要性,结合try-except处理ValueError等异常,实现可靠的交互程序。通过购物预算计算器实战,演示如何防范非法输入、处理边界值,并推荐使用Decimal避免浮点精度问题,提升程序健壮性。

铭渊老黄 134

【Python】国家中小学智慧教育平台电子教材批量下载与 PDF 合成实战

成果:两本语文电子课本(一年级上册 118 页 / 23MB、三年级上册 130 页 / 30.3MB),合计 248 页、约 54MB,单本下载加合成 40~60 秒,PDF 页数校验全部通过。经验教训SPA 站点的数据接口优先从 bundle 里挖,比抓页面稳得多;资源链接要按 private/public 分组看待,只取平台公开部分;页数、目录名这类“可推断”的信息,永远用实际响应验证一次;受限环境里“能不能跑浏览器”要在方案定稿前确认。后续计划:这版 PDF 是图片版,没有文字层;

木头大左的博客 128
上一篇: mycobot 280 M5初级运动-上下左右跟随晃动
下一篇: 本地化部署DeepSeek-R1-Distill-Qwen-1.5B
harebert
博客等级 码龄19年 208粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值