云逗猫——直播弹幕控制机械臂逗猫棒

news2024/11/14 20:26:29

这个东西思路是很简单的。简单来说在直播画面用文字跟观看者约定一些弹幕指令,然后用爬虫爬取直播弹幕,当爬到弹幕是约定的指令时,通过串口给舵机控制板发送信号,控制板控制舵机转动,机械臂就会做相应的动作。

两只纯白英短,一只公的一只母,公的叫熊熊,已经绝育了,母的叫红红,异瞳。
在这里插入图片描述

直播

我这里选择了B站直播,也没有什么特别的原因,因为我现在主要只瞄一下B站直播,其他的平台不咋看。

爬取弹幕

我熟悉.NET技术栈,很幸运,找到了极简式 Unity 获取 bilibili 直播弹幕、SC、上舰、礼物等 插件这篇文章,虽然博主用于Unity,但既然都是C#,里面有99%是我能用的,所以我基本上复制了他的所有代码。然后连接直播间,侦测弹幕等信息都变得非常简单。

if (string.IsNullOrWhiteSpace(this.tb_roomId.Text))
{
	OutputText("请输入房间号", "error");
	return;
}
int roomId = 0;
try
{
	roomId = Convert.ToInt32(this.tb_roomId.Text);
}
catch (Exception)
{
	OutputText("房间号需要是数字", "error");
	return;
}
_biliBiliLiveRequest = new BiliBiliLiveRequest();
bool connected = await _biliBiliLiveRequest.Connect(roomId);
if (connected)
{
	OutputText("连接直播间成功");
	_biliBiliLiveRequest.OnDanmuCallBack += biliBiliLiveRequest_OnDanmuCallBack;
	_biliBiliLiveRequest.OnGiftCallBack += biliBiliLiveRequest_OnGiftCallBack;
	_biliBiliLiveRequest.OnGuardCallBack += biliBiliLiveRequest_OnGuardCallBack;
	_biliBiliLiveRequest.OnMessage += biliBiliLiveRequest_OnMessage;
	this.btn_liveConnect.Content = "断开";
	_IsLiveConnected = true;
	Task.Run(async () => {
		await SetCaptionTaskAsync();
	});
}
else
{
	OutputText("连接直播间失败,请检查房间号是否正确", "error");
	_biliBiliLiveRequest = null;
	_IsLiveConnected = false;
}

通过串口发送信号到控制板

我在淘宝上买的一块舵机控制板,这块板子有个好处,可以通过USB接口直接连接电脑通过他们的上位机软件进行调试,还可以通过上位机软件在板子里录制一些动作组。当然这块板子也有一个很大的缺点,他的USB口只能他的上位机软件去用,开发者不能通过他的USB口传输数据。因此还需要买一根USB转TTL线,买之后线的GND接板子的GND,线的VCC供电口接板子的3.3,线的RXD接板子的TX,线的TXD接板子的RX。
在这里插入图片描述
USB转TTL线插上电脑之后如果没有串口,就表示电脑需要安装FT232R USBUART驱动,下载地址选择windows下面的setup executable安装比较方便。
在这里插入图片描述
我也没有用过其他的舵机,我猜不同的舵机驱动板应该是有不同的通信协议的,比如我这个板子的说明书上说运行动作组的指令是这样的
在这里插入图片描述
代码对应的就是

byte[] buffer = new byte[7];
buffer[0] = FRAME_HEADER;
buffer[1] = FRAME_HEADER;
buffer[2] = 0x05;
buffer[3] = CMD_ACTION_GROUP_RUN;
buffer[4] = Convert.ToByte(index);
buffer[5] = 0x01;
buffer[6] = 0x00;
try
{
	_serialPort.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
	OutputText($"发送命令失败{ex.Message}", "error");
}

动作组运行完之后板子返回指令
在这里插入图片描述
因此我也需要做相应的处理

private async void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	byte[] buffer = new byte[_serialPort.BytesToRead];
	_serialPort.Read(buffer, 0, _serialPort.BytesToRead);
	string result = "";
	foreach (var b in buffer)
	{
		result += b.ToString("X2");
	}
	OutputText($"串口返回数据:{result}");
	if (buffer.Length > 3 && buffer[3] == 0x08)
	{
		await WorkStopAsync();
	}
}

推流软件

推流软件我使用的OBS,其实我也没用过其他推流软件,这次使用的时候发现OBS有个很好的优点,他显示从文件读取的文本时会实时读取文件,文件更新后直播流的文字会实时更新,这样就能实时展示一些东西,比如当前是谁在操作机械臂。

最终程序

最终程序如下图,界面用了AvaloniaUI,之所以用AvaloniaUI是因为我最初是想在树莓派Linux上运行的,得跨平台,树莓派的GPIO口自带串口,直接跟驱动板交互,美滋滋。但是直播还是不好弄,用ffmpeg推流还是没有OBS方便,最终还是选择了用Windows电脑。
在这里插入图片描述

注意

如果不是想着在树莓派上搞,其实坑不多。最主要就是安装机械臂的时候得先调一下舵机,确保每个舵机在1500处安装。

成果

成果示例,至于猫配不配合,营不营业,就不是人力能及的了。

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

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

相关文章

Lesson2无头单向非循环链表(中)

1.链表 1.1链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 1.2链表的分类 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 1.…

【SAP Hana】X档案:SAP HANA 数据库基础知识

SAP HANA 数据库基础知识1、基本规则(1)注释(2)标识符(3)引号(4)保留字2、数据类型(1)日期时间类型(2)数字类型(3&#xf…

SNMP简单网络管理协议

随着网络的规模越来越庞大,网络中的设备种类繁多,如何对越来越复杂的网络进行有效的管理,从而提供高质量的网络服务,已成为网络管理所面临的巨大挑战。网络的管理和运维手段多样,下面将对几种常见的网管与运维手段展开…

[leetcode.29]两数相除,位运算虽好,不要满眼是她

题目如下 不允许用乘除法,但是我们可以用加减法和位运算。。。不过这里不要用位运算,比如说你要是想用补码交替除法,你根本无法获得移动几位(移动31位?太鬼畜了吧) 所以说单纯的除法部分,我们可…

测试开发 | 实战演练基于加密接口测试测试用例设计

image1080594 76.4 KB 如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法,是远远不够的,还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。所以在这个部分,会主要介绍接口测试用例分析以及通用的流程…

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现

从零开始 verilog 以太网交换机(二)MAC接收控制器的设计与实现 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🧨 从零开始 verilog 以太网交换机系列专栏:点击这里 🔑未经作者允…

plt绘制点线图 点(marker)过密的解决办法

设置 markevery10 plt.plot(x, y, markero, markevery10) import matplotlib.pyplot as plt import numpy as npxnp.arange(0,2*np.pi,0.01) ynp.sin(x)fig, ax plt.subplots(constrained_layoutTrue)plt.title(markevery10)ax.plot(x, y, markero, markevery50, mfcr,mecr)…

(小甲鱼python)函数笔记合集四 函数(IV)总结 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解 二、函数中参数的作用域 作用域:一个变量可以被访问的范围,一个变量的作用域总是由它在代…

jQuery学习-01jQuery下载安装

1 jQuery的介绍 jQuery就是js函数库,里面有大量的js函数库,使用这些函数操作dom对象,做事件,动画,ajax处理; 地址:https://jquery.com/ 2下载 地址:https://jquery.com/download/…

Apache Solr 9.1-(一)初体验单机模式运行

Apache Solr 9.1-(一)初体验单机模式运行 Solr是一个基于Apache Lucene的搜索服务器,Apache Lucene是开源的、基于Java的信息检索库,Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果,它被设计为一个强…

day12-继承

1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现格式:class 子…

【算法题】1318. 或运算的最小翻转次数

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你三个正整数 a、b 和 c。 你可…

Webpack:HTML Webpack Plugin插件

HTML Webpack Plugin插件,在Webpack构建的前端项目中,用于简化index.html文件的创建,以免除项目打包之后手动创建/拷贝index.html到打包目录下的繁琐步骤。以下,从一个已构建好的Vue项目中的一个现象谈起,逐步深入了解…

vs code中的platformIO插件,完成Arduino的程序编写,导入,安装开发板管理库

准备工作 vs code已经安装好,扩展插件plateformIO也安装好。(下图是platformIO安装方式) platformIO界面功能介绍和简单使用 新建Arduino项目 选择正确的开发板型号,和自己习惯的编译框架。打开后有一个.ini的配置文件&#x…

MySQL表的增删改查(初级)

MySQL数据库最核心的内容就是增删改查(即CURD),看了这篇初级增删改查的博客之后可以解决以后工作中百分之80-90的内容,这部分的知识并不是很难,但是需要一定的熟练程度;C:create--新增U:update-…

设计模式_行为型模式 -《策略模式》

设计模式_行为型模式 -《策略模式》 笔记整理自 黑马程序员Java设计模式详解, 23种Java设计模式(图解框架源码分析实战) 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、…

Nginx应用场景

Nginx应用场景 Nginx配置文件说明 Nginx 的配置文件位置 1、文件位置 安装目录\conf\nginx.conf 安装目录\nginx.conf 2、两个文件是一样的 3、使用 /usr/local/nginx/sbin/nginx 启动 Nginx ,默认用的是 安装目录 \nginx.conf 配置文件 4、作用:完…

三、命令行工具cmder的安装

1、cmder安装 1.1、cmder简介 cmder是一个增强型命令工具,不仅可以使用Windows下的所有命令,并且还可以使用Linux和shell命令。 1.2、cmder下载 (1)cmder的官方网站提供的下载地址实在是太慢了基本是下载不下来,建议到清华大学的镜像站去…

SELECT必知必会_引擎,PROCEDURE,事务处理

书接上文,之前说了Mysql的SELECT部分,本片文章会重点介绍关于MySql的其他一些知识,也会是MySql必知必会的最后一篇。 首先,是Mysql中的增删改操作,对于测试岗来说,这部分知识相对来说不是那么重要&#xf…

案例分享 | AI助力肯尼亚“Sheng”语研究

你听说过一种叫做“Sheng”的语言吗?这是一种斯瓦希里语-英语俚语,主要使用者为肯尼亚内罗毕等城市地区的青年。近年来,随着“Sheng”的使用量不断增加,一家非盈利组织正在帮助更新该地区的社区信息资源,随时根据词汇中…