机器人制作开源方案 | 宠物智能机器人

news2024/10/7 18:22:39

一、作品简介

作者:陈瑛、卢文博、刘沈军、 浦津、葛望东
单位:南京林业大学
指导老师:金慧萍、田涛
 

1. 背景调研及研究意义

1.1背景调研

       随着我国社会经济水平的飞速发展和城市化的进程加速推进,居民生活水平有了较 大幅度的提升,随之而来的宠物业也得到了较大程度的发展,然而鉴于城市生活水平的 封闭性、个性化和人口老龄化等特点,人们生活中的休闲、消费和情感寄托方式也呈现 出多样化的发展,其中,家庭宠物的饲养已经成为了城市居民生活消遣的新方式。

0-机器人制作开源方案 | 宠物智能机器人

0-机器人制作开源方案 | 宠物智能机器人

       宠物的喂养和看护往往是宠物主人最关心的问题,现阶段主要还是依靠人工进行喂 食与看护。由于人们携带宠物出行不方便以及上班时间无法照顾宠物等原因,也带来了 诸如宠物拆家、宠物自虐、无人喂食及随地大小便等居家“留守宠物”的系列问题。为 解决“留守宠物”问题目前市面上仅有喂食机、逗狗机等少量且功能单一的产品,已然 无法满足主人喂养及看护宠物的需求。为了解决饲养宠物的这一系列问题,减少主人的 烦恼,研制宠物用多功能智能机器人势在必行。为此,本作品设计了一款多功能智能养 宠机器人,在现有扫地机器人和陪玩机器人功能的基础上,运用语音视觉联动、yolov2 智能识别技术,进行了集成创新设计,实现了较好的人机交互功能,极大程度上满足了 爱宠人士的需求。
 

1.2研究意义

宠物智能机器人可以应对家中无人时宠物行踪不定、宠物丢失、喂养困难等问题,使用探索者机器人创新组件,设计了一种具有自动追踪、远程监控及识物投食功能的智能宠物机 器人进一步丰富了家居智能化的配置,在提高人们生活品质的同时,也减少了人们的出 行的后顾之忧。
 

2. 应用前景和社会价值

2.1应用前景

据《2020 年中国宠物行业白皮书》(消费报告)数据显示,目前我国宠 物总量已经超过 1 亿只,从 2010 年至 2016 年,国内宠物行业年复合增长高达 49%。《2022 年中国宠物行业市场前景及投资研究预测报告》显示,目前宠物市场规模已经达千亿, 71.4%的 00 后网民有养宠物的经历或意愿,且很多人将宠物视为“重要家人”,愿意为 .8. 其消费。随着人们与宠物亲密度的持续走高,预计 2021 年宠物市场规模还将突破 2000 亿元,宠物经济发展将持续高速繁荣。在市场高速发展中,各种新业态也有望借着东风 趁势而起,其中就包括了智能养宠。所谓智能养宠,顾名思义,就是利用各种智能技术 和智能设备来养宠,例如,机器人。
 

2.2社会价值

利用机器人养宠,能使养宠变得轻松和简单,宠物生活变得更好,同时 还能解决“空巢宠物”问题。在用户因为上班等各种原因无暇照顾宠物的情况下,通过 远程操控机器人就能照管宠物,保持人宠之间的亲密感和联系性,不管对于宠物还是主 人来说,机器人养宠都极具显著价值。
 

3. 作品创新点及前景展望和应用

3.1作品创新点

       首先,本作品在树莓派上使用 yolov2 算法实现对猫,狗,猪等家庭动物的识别。 为宠物追踪,区分物种定量喂食奠定了技术支撑。其次,我们用树莓派识别到宠物后, 用 BestFit(最佳适应算法)实现了宠物自动追踪。接着通过使用 mjpg-streamer 将实时 监控到的视频推流到 PC 端,实现人机交互,从而用户可以实时观测到宠物的健康状况 以及所处位置等。最后针对不同的家庭动物,选择不同的食物,进行宠物投食;根据宠 物体型,定量投食,避免食物浪费。
 

3.2 作品前景展望及应用

应用前景:据《2020 年中国宠物行业白皮书》(消费报告)数据显示,目前我国宠 物总量已经超过 1 亿只,从 2010 年至 2016 年,国内宠物行业年复合增长高达 49%。《2022 年中国宠物行业市场前景及投资研究预测报告》显示,目前宠物市场规模已经达千亿, 71.4%的 00 后网民有养宠物的经历或意愿,且很多人将宠物视为“重要家人”,愿意为 .8. 其消费。随着人们与宠物亲密度的持续走高,预计 2021 年宠物市场规模还将突破 2000 亿元,宠物经济发展将持续高速繁荣。在市场高速发展中,各种新业态也有望借着东风 趁势而起,其中就包括了智能养宠。所谓智能养宠,顾名思义,就是利用各种智能技术 和智能设备来养宠,例如,机器人。 我们的项目在时代的大势下定能乘风破浪! 社会价值:利用机器人养宠,能使养宠变得轻松和简单,宠物生活变得更好,同时 还能解决“空巢宠物”问题。在用户因为上班等各种原因无暇照顾宠物的情况下,通过 远程操控机器人就能照管宠物,保持人宠之间的亲密感和联系性,不管对于宠物还是主 人来说,机器人养宠都极具显著价值。
 

4. 作品存在问题及改进方法

4.1作品存在的问题

       技术功能的实用性:现阶段项目受到市场检验的机会不多,产品的使用效果、稳定 性、智能性、续航性、环境适应性等都还有待市场反馈。 鉴于此,我们一方面要加强机器人技术研发和升级,另一方面也要增加技术实际试 用,让我们的宠物机器人能更加满足需求,受到用户认可。
 

4.2作品改进方向

通过不断的研究和调试,当前机器人已经可以基本完成所有预想任务。上位机能够 正常播放来自机器人的视频数据。控制数据能够正常传输,机器人对控制终端的控制数 据有较好响应,控制延时可忽略不计,不影响控制体验。在调试实验中,机器人能清楚 的检测到宠物模型的位置及状态并即时反馈在视频端。机器人在接近宠物的运动过程也 较为顺畅,自动喂食和毛发处理功能的完成也充分达到预期效果,此机器人方便操作, 更能适应多种复杂的情况,既保证了使用者可以对宠物进行检测又为宠物独自在家提供 了保障。因此研究已经得到可行的论证。

0-机器人制作开源方案 | 宠物智能机器人
宠物智能机器人实物图

二、总体功能设计

       针对宠物无人看管的问题,设计了一个可以在家中无人看管时照看宠物的智能宠物 机器人。具有自主导航、宠物识别、自主避障、清理宠物毛发、自动喂食等功能。
       (1) 智能交互功能:通过指令触发实现机器人指定控制功能,与用户实现智能交互;
       (2)自主喂食功能:利用视觉识别检测到宠物的位置和状态,并在设定时间或者由直 接操作进行喂食功能。
       (3)清理毛发功能:通过强力吸风机,将途径的灰尘和宠物毛发吸到储物盒之中,且 储物盒贴有粘性贴,可将灰尘和毛发粘到盒中,从而实现打扫屋内及清理宠物毛发的功 能。
       (4)自主定位与导航:机器人在室内移动过程中根据视觉扫描和对自身位置的估计, 实现机器人的自主定位和导航;
       (5)避障功能:通过与主控板相连接的红外传感器发送数据,指引驱动器进行避障。

0-机器人制作开源方案 | 宠物智能机器人
宠物智能机器人实物图

1. 机器人机械设计

       宠物机器人的外观三维设计图如下图所示。

0-机器人制作开源方案 | 宠物智能机器人
宠物机器人的 3D 设计图
       机器人的本体结构由喂食装置、探索者、宠物识别装置、压力传感器步进电机、清 理毛发装置组成。其具体结构如下图所示。

0-机器人制作开源方案 | 宠物智能机器人

2. 软件功能实现

2.1宠物识别

       本作品在开发板上使用 yolov2 算法实现对猫、狗、猪等家庭动物的识别。为宠物 追踪、区分物种定量投食奠定了技术支撑。 本次研究在识别方面采用了 yolov2 的技术处理。yolov2 基于 DarkNet19 结构,它 有 19 个卷积层,有 3×3 的滤波器和 5 个最大集合层,与之前的层相比,通道的数量增 加了一倍。这提高了结果的准确性。通过在每个 3×3 卷积层之后增加一个 1×1 卷积层, 降低了网络计算的复杂性。这种复杂性的降低增加了图像处理的推理时间,优化了算法 的性能。yolov2 的功能是提高输入图像的分辨率,增加检测像素和检测信息量,有利于 提高检测精度。数据增强通过扩大输入数据集为模型添加特征。这通过随机裁剪和旋转 输入图像来进行,为模型增加维度。正如该算法的作者所说,"YOLO9000 预测了 9000 多个不同的物体类别的检测,而且都是实时的。yolov2 在每个卷积层之后都使用了批量 归一化(BN)。它将数据的分布统一为标准的正态分布,从而提高检测的准确性。 然而必须指出的是使用批量归一化和数据增量提高了准确性和 mAP,与之前的 yolo 版本相比,它也有定位误差。与 yolov2 相比,RCNN 和更快的 RCNN 的检测速度都很低, 因为 yolov2 的每秒帧数(FPS)更高。yolov2 单独使用 TITAN X GPU 的检测速度为 45 FPS, 而快速 YOLO 使用相同类型的 GPU 可以达到 155 FPS 的速度,因此训练 yolov2 网络的时 间减少了 50%。
       宠物猫狗识别如下图:

0-机器人制作开源方案 | 宠物智能机器人

0-机器人制作开源方案 | 宠物智能机器人

2.2宠物追踪

       本作品识别到宠物后,用 BestFit(最佳适应算法)实现宠物自动追踪,并使用 mjpg-streamer 将实时监控到的视频推流到 PC 端,实现人机交互,从而用户可以实时观 测到宠物的健康状况以及所处位置等。

0-机器人制作开源方案 | 宠物智能机器人
宠物追踪图
0-机器人制作开源方案 | 宠物智能机器人
PC端宠物追踪图

2.3识物投食

       本作品通过 3D 打印设计出喂食装置,在识别宠物后,通过电机推动旋钮,将狗粮 或猫粮投放到饭盘里,实现识别物种后定量喂食。识物投食如下图:

0-机器人制作开源方案 | 宠物智能机器人

0-机器人制作开源方案 | 宠物智能机器人

2.4清理毛发

       本作品通过强力吸风机,吸到储发盒上部,储发盒上部贴有粘性贴,可将毛发粘到 上部,从而实现清理宠物毛发的功能。

0-机器人制作开源方案 | 宠物智能机器人
清理毛发图

3. 技术路线

       编程模块采用了较易上手的 Arduino 来最大程度实现各项功能的完成。它构建于开 放原始码 simple I/O 介面版,并且具有使用类似 Java、C 语言的 Processing/Wiring 开发环境。主要包含两个部分:硬件部分是可以用来做电路连接的 Arduino 电路板;另 外一个则是 Arduino IDE,计算机中的程序开发环境。只需要在 IDE 中编写程序代码, 将程序上传到 Arduino 电路板后,程序便会将指令传向 Arduino 电路板,进而完成最终 的操作响应。Arduino 能通过各种各样的传感器来感知环境,通过控制灯光、马达和其 他的装置来反馈、影响环境。板子上的微控制器可以通过 Arduino 的编程语言来编写程 序,编译成二进制文件,烧录进微控制器。对 Arduino 的编程是通过 Arduino 编程语言 (基于 Wiring)和 Arduino 开发环境(基于 Processing)来实现的。
 

三、程序代码

1. 示例程序

①使用MaixPy板上的摄像头执行对象检测并将结果显示在LCD上。

# generated by maixhub, tested on maixpy3 v0.4.8

# copy files to TF card and plug into board and power on

import sensor, image, lcd, time

import KPU as kpu

import gc, sys

input_size = (224, 224)

labels = ['dog']

anchors = [4.22, 4.12, 3.69, 3.38, 3.62, 4.03, 5.16, 4.72, 1.94, 3.69]

def lcd_show_except(e):

import uio

err_str = uio.StringIO()

sys.print_exception(e, err_str)

err_str = err_str.getvalue()

img = image.Image(size=input_size)

img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))

lcd.display(img)

def main(anchors, labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size,

lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):

sensor.reset()

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QVGA)

sensor.set_windowing(sensor_window)

sensor.set_hmirror(sensor_hmirror)

sensor.set_vflip(sensor_vflip)

sensor.run(1)

lcd.init(type=1)

lcd.rotation(lcd_rotation)

lcd.clear(lcd.WHITE)

if not labels:

with open('labels.txt','r') as f:

exec(f.read())

if not labels:

print("no labels.txt")

img = image.Image(size=(320, 240))

img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)

lcd.display(img)

return 1

try:

img = image.Image("startup.jpg")

lcd.display(img)

except Exception:

img = image.Image(size=(320, 240))

img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)

lcd.display(img)

try:

task = None

task = kpu.load(model_addr)

kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]

while(True):

img = sensor.snapshot()

t = time.ticks_ms()

objects = kpu.run_yolo2(task, img)

t = time.ticks_ms() - t

if objects:

for obj in objects:

pos = obj.rect()

img.draw_rectangle(pos)

img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()],

obj.value()), scale=2, color=(255, 0, 0))

img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))

lcd.display(img)

except Exception as e:

raise e

finally:

if not task is None:

kpu.deinit(task)

if __name__ == "__main__":

try:

# main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)

main(anchors = anchors, labels=labels, model_addr="/sd/model-20830.kmodel")

except Exception as e:

sys.print_exception(e)

lcd_show_except(e)

finally:

gc.collect()

②用于控制猫粮喂食器,通过MQTT接收指令来拍摄照片或控制步进电机的运动。

#!/usr/bin/python

import sys

import RPi.GPIO as gpio

import time

import signal

import os

import mosquitto

enablePin = 18

dirPin = 23

stepPin = 24

WaitTime = 0.0025

cameraTakeCmd = '/usr/bin/raspistill -t 1 -w 640 -h 480 -vf -hf -o /mnt/feeder/latest.jpg &'

# set up io pins..

gpio.setmode(gpio.BCM)

gpio.setup(dirPin, gpio.OUT)

gpio.setup(stepPin, gpio.OUT)

gpio.setup(enablePin, gpio.OUT)

gpio.output(enablePin, False)

def exitHandler(signum, frame):

print 'We are out of here...'

gpio.output(enablePin, False)

gpio.cleanup()

exit()

#define what happens after connection

def on_connect(rc):

print "Connected"

#On recipt of a message create a pynotification and show it

def on_message(msg):

print "Topic: " + msg.topic

print "Payload: " + msg.payload

topic = msg.topic.split('/',1)

direction = topic[1]

print "Instruction: " + direction + ", Value: " + msg.payload

if direction == 'photo':

if msg.payload == 'take':

print "Photo time!"

os.system(cameraTakeCmd);

motorAction = 0

if direction == 'retract':

gpio.output(dirPin, True)

motorAction = 1

elif direction == 'feed':

gpio.output(dirPin, False)

motorAction = 1

if motorAction:

gpio.output(enablePin, True)

steps = int(msg.payload)

StepCounter = 0

while StepCounter < steps:

gpio.output(stepPin, True)

gpio.output(stepPin, False)

StepCounter += 1

time.sleep(WaitTime)

gpio.output(enablePin, False)

#create a broker

mqttc = mosquitto.Mosquitto("catfeeder")

#define the callbacks

mqttc.on_message = on_message

mqttc.on_connect = on_connect

mqttc.reconnect = on_connect

#connect

mqttc.connect("10.0.0.1", 1883, 60, True)

#subscribe to topic test

mqttc.subscribe("catfeeder/#", 0)

#tidy up nice like...

signal.signal(signal.SIGINT, exitHandler)

#keep connected to broker

while mqttc.loop() == 0:

pass

③用于远程控制小车

#define BLINKER_PRINT Serial

#define BLINKER_BLE

#include <Blinker.h>

#define PWMA 12 //控制电机1的方向A,zuo1

#define PWMB 13 //控制电机1的方向B,zuo2

#define PWMC 14 //控制电机2的方向A,you1

#define PWMD 27 //控制电机2的方向B,you2

int pwm_val = 255;//PWM输出值,改变数值用于调速,最大255,最小0

// 新建组件对象,组件名称见引号

BlinkerButton Button1("go");

BlinkerButton Button2("down");

BlinkerButton Button3("left");

BlinkerButton Button4("right");

BlinkerButton Button5("stop");

//函数声明

/*-------回调函数:软件中按下按键执行对应按键的函数,组件名称 软件中自定 见上 要放到setup之前--

-----------------------------按键1:功能向前,执行向前函数-----------------------------

-----------------------------按键2:功能向后,执行向后函数-----------------------------

-----------------------------按键3:功能向左,执行向左函数-----------------------------

-----------------------------按键4:功能向右,执行向右函数-----------------------------

-----------------------------按键5:功能停止,执行停止函数-----------------------------*/

void button1_callback(const String & state)

{·

    BLINKER_LOG("get button state: ", state);

    forward();

}

void button2_callback(const String & state)

{

    BLINKER_LOG("get button state: ", state);

    backward();

}

void button3_callback(const String & state)

{

    BLINKER_LOG("get button state: ", state);

    turnleft();

}

void button4_callback(const String & state)

{

    BLINKER_LOG("get button state: ", state);

    turnright();

}

void button5_callback(const String & state)

{

    BLINKER_LOG("get button state: ", state);

    stopk();

}

void setup()

{

    Serial.begin(115200);

   

    pinMode(PWMA, OUTPUT);         

    pinMode(PWMB, OUTPUT);         

    pinMode(PWMC, OUTPUT);         

    pinMode(PWMD, OUTPUT);       

   

    ledcsetup(1,12000,8,PWMA);

    ledcsetup(2,12000,8,PWMB);

    ledcsetup(3,12000,8,PWMC);

    ledcsetup(4,12000,8,PWMD);

   

    #if defined(BLINKER_PRINT)

        BLINKER_DEBUG.stream(BLINKER_PRINT);

    #endif

    Blinker.begin();

    Button1.attach(button1_callback);

    Button2.attach(button2_callback);

    Button3.attach(button3_callback);

    Button4.attach(button4_callback);

    Button5.attach(button5_callback);

}

void loop()

{

    Blinker.run();

}

/*-----------PWM生成初始化(LEDC通道初始化)-----------------*/

void ledcsetup(int channel,int freq,int resolution,int pin)

{

  ledcSetup(channel, freq, resolution); // 设置通道

  ledcAttachPin(pin, channel);   // 将通道与对应的引脚连接

}

/*----------------------转向函数--------------------------*/

void forward()

{

   Serial.println("FORWARD"); //输出状态

   ledcWrite(1, pwm_val);

   ledcWrite(2, 0);

   ledcWrite(3,pwm_val);

   ledcWrite(4, 0);

}

void backward()

{

   Serial.println("BACKWARD"); //输出状态

   ledcWrite(1, 0);

   ledcWrite(2, pwm_val);

   ledcWrite(3, 0);

   ledcWrite(4, pwm_val);

}

void turnleft()

{

   Serial.println("TURNLEFT"); //输出状态

   ledcWrite(1, 0);

   ledcWrite(2, 0);

   ledcWrite(3, 0);

   ledcWrite(4,pwm_val);

}

void turnright()

{

   Serial.println("TURNRIGHT"); //输出状态

   ledcWrite(1, 0);

   ledcWrite(2, pwm_val);

   ledcWrite(3, 0);

   ledcWrite(4, 0);

}

void stopk()//stop是Arduino.h函数,因此不能使用其名称新建函数

{

   Serial.println("STOP"); //输出状态

   ledcWrite(1, 0);

   ledcWrite(2, 0);

   ledcWrite(3, 0);

   ledcWrite(4, 0);

}

更多详情请参考 宠物智能机器人​​​​​​​

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

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

相关文章

如何解决网站被攻击问题:高防服务器与高防CDN的选择

在当今数字时代&#xff0c;网站攻击已经成为严重的威胁&#xff0c;对网站的可用性和数据安全构成潜在风险。为了解决这个问题&#xff0c;企业需要考虑采用高防服务器或高防CDN等防护方案。本文将详细说明这两种方案的优劣势&#xff0c;并分析大、中、小型企业各自适合的防护…

5大自动化测试的Python框架 【实用干货】

自从2018年被评选为编程语言以来&#xff0c;Python在各大排行榜上一直都是名列前茅。 目前&#xff0c;它在Tiobe指数中排名第三个&#xff0c;仅次于Java和C。随着该编程语言的广泛使用&#xff0c;基于Python的自动化测试框架也应运而生&#xff0c;且不断发展与丰富。 因…

VB.NET—Form问题记录

目录 前言: 过程: 总结: 升华: 前言: 分享一个VB.NET遇到的一个问题&#xff0c;开始一直没有解决&#xff0c;这个问题阻碍着我前进成为我路上的拦路虎&#xff0c;千方百计的想要绕过去&#xff0c;但事与愿违怎么也绕不过去&#xff0c;因为运行不了窗体&#xff0c;程序…

【特殊矩阵的压缩存储】

文章目录 特殊矩阵的压缩存储特殊的矩阵 特殊矩阵的压缩存储 矩阵&#xff1a;一个由m x n个元素排成的m行n列的表。 矩阵的常规存储&#xff1a; 将矩阵描述为一个二维数组。 矩阵的常规存储的特点&#xff1a; 可以将元素进行随机存取&#xff1b; 矩阵运算非常简单&#xf…

【Unity实战】最全面的库存系统(二)

文章目录 先来看看最终效果前言箱子库存箱子存储物品玩家背包快捷栏满了,物品自动加入背包修复开着背包拾取物品不会刷新显示的问题将箱子库存和背包分开,可以同时打开完结先来看看最终效果 前言 本期紧跟着上期,继续来完善我们的库存系统,实现箱子库存和人物背包 箱子库…

Docker:本地目录挂载

Docker&#xff1a;本地目录挂载 1. 案例&#xff1a;MySQL容器的数据挂载2. 将MySQL挂载到我们指定的目录 1. 案例&#xff1a;MySQL容器的数据挂载 查看MySQL容器&#xff0c;判断是否有数据卷挂载基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载 [root172 _…

前端BOM、DOM

文章目录 BOM操作window对象navigator对象&#xff08;了解即可&#xff09;history对象location对象弹出框警告框确认框提示框 计时相关1.过一段时间之后触发&#xff08;一次&#xff09;2.每隔三秒时间触发一次 DOM操作HTML DOM树 查找标签直接查找间接查找 节点操作操作 获…

【ArcGIS模型构建器】06:ArcGIS中DOM批量分幅教程

ArcGIS中利用模型构建器实现DOM批量分幅裁剪。 文章目录 1. 加载数据2. 批量分幅1. 加载数据 批量分幅通常是基于数字正射影像来实现。 数字正射影像(DOM.tif)CASS标准图幅(shp) 2. 批量分幅 单个图幅可以通过裁剪或者按掩膜提取工具来进行,批量分幅采用模型构建器进行。…

单通道Mat元素的访问之data和step属性【C++的OpenCV 第十四课-OpenCV基础强化(三)】

&#x1f389;&#x1f389;&#x1f389; 欢迎来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎来到小白piao的学习空间&#xff01;} 欢迎来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496; C\Python所有的入门技术皆在 我…

ArcGIS for Android 禁止地图旋转

ArcGIS for Android 禁止地图旋转 话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; public class LoadMap extends AppCompatActivity {// 地图private MapView mapView;private ArcGISMap map;Overrideprotected void onCreate(Bundle savedInstanceSta…

ConnectionError: HTTPSConnectionPool

ConnectionError: HTTPSConnectionPool(host‘zbbfxstatic.figtingdream.com’, port443): Max retries exceeded with url: /api/cache (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000249795AD9A0>: Failed to establish a ne…

点焊机的数据校验

下班了&#xff0c;今天又来看看小编学习了什么内容先吧&#xff01;&#xff01;&#xff01;今天原本以为是摸鱼的一天&#xff0c;突然间传来了机器出现问题的消息&#xff01;机器比较老旧&#xff0c;怀疑填数据出现问题&#xff0c;就下达了机器原来数据进行校验的活&…

基于单片机的智能灭火小车设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案1.1 整体设计任务1.2 整体设计要求1.3 系统整体方案设计1.3.1 整体模块设计1.3.2 整体设计方案选择…

55个Java毕设项目推荐【源码好优多】

55个Java毕设项目推荐&#xff0c;实践出真知&#xff0c;现在要想知道自己的到底技术达不达标&#xff0c;项目就是检验的唯一标准。 下面是我整理准备的55个Java毕设项目合集&#xff1a; 1、网上订购管理系统 2、健康管理系统 3、项目辅导视频 4、医院在线挂号 5、在线花店…

什么是云安全?

关于云技术有一些模棱两可的术语&#xff0c;因此值得花一些时间来定义一些常见术语。当我们谈论“云”、“云服务”或“云计算”时&#xff0c;我们的意思是&#xff1a; “一种按需、大规模可扩展的服务&#xff0c;托管在共享基础设施上&#xff0c;可通过互联网访问。典型的…

【C语言】备战校赛Day2

日期:11.2 星期三 L1-004 计算摄氏温度 题目描述 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入描述 输入在一行中给出一个华氏温度。 输出描述 在一行中按照格…

C++构造函数和析构函数详解

一、构造函数 1、概念 构造函数是特殊的成员函数&#xff0c;需要注意的是&#xff0c;构造函数虽然名叫做构造&#xff0c;但是构造函数的主要任务并不是开空间创建对象&#xff0c;而是初始化对象。 2、特征 函数名与类名相同。无返回值对象实例化时编译器自动调用对应的…

探索Allure Report:提升自动化测试效率的秘密武器

一.使用 Allure2 运行方式-Python # --alluredir 参数生成测试报告。 # 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径)# 生成在线的测试报告 allure serve ./result二.使用 Allure2 运行方式-Ja…

ChineseChess.2023.11.01.03

1 红【马三进四】吃黑车&#xff0c;红方没有将军&#xff0c;黑方进攻 黑方 【 卒4平5】&#xff0c; 将 红帅 红【炮五退七】吃黑【卒5】&#xff0c;解将&#xff0c;不用看&#xff0c;你没棋走 黑【炮4进7】&#xff0c;将红帅&#xff0c;绝杀&#xff0c;位置都被自己卡…

Android四大组件总结

从事安卓开发也有两年多的时间了&#xff0c;从头开始整理下所学的东西&#xff0c;坚持&#xff01;&#xff01;&#xff01; 一、Activity 活动 Activity 用于显示用户界面&#xff0c;用户通过 Activity 交互完成相关操作&#xff1b; 一个 App 允许有多个Activity Activi…