当前位置: 首页 > news >正文

自主巡航,目标射击

中国机器人及人工智能大赛

参赛经验:

自主巡航赛道

【机器人和人工智能——自主巡航赛项】动手实践篇-CSDN博客

主要逻辑代码

#!/usr/bin/env python
#coding: utf-8import rospy
from geometry_msgs.msg import Point
import threading
import actionlib
import time
from actionlib_msgs.msg import GoalStatus
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from geometry_msgs.msg import PoseWithCovarianceStamped
from tf_conversions import transformations
from ar_track_alvar_msgs.msg import AlvarMarkers
from math import pi
from std_msgs.msg import String
import sys
reload(sys)
sys.setdefaultencoding('utf-8')class Navigation:def __init__(self):self.set_pose_pub = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=5)self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)self.move_base.wait_for_server(rospy.Duration(60))def set_pose(self, p):if self.move_base is None:return Falsex, y, th = ppose = PoseWithCovarianceStamped()pose.header.stamp = rospy.Time.now()pose.header.frame_id = 'map'pose.pose.pose.position.x = xpose.pose.pose.position.y = yq = transformations.quaternion_from_euler(0.0, 0.0, th/180.0*pi)pose.pose.pose.orientation.x = q[0]pose.pose.pose.orientation.y = q[1]pose.pose.pose.orientation.z = q[2]pose.pose.pose.orientation.w = q[3]self.set_pose_pub.publish(pose)return True def _feedback_cb(self, feedback):msg = feedback#rospy.loginfo("[Navi] navigation feedback\r\n%s"%feedback)def goto(self, p):rospy.loginfo("[Navigation] goto %s"%p)goal = MoveBaseGoal()goal.target_pose.header.frame_id = 'map'goal.target_pose.header.stamp = rospy.Time.now()goal.target_pose.pose.position.x = p[0]goal.target_pose.pose.position.y = p[1]q = transformations.quaternion_from_euler(0.0, 0.0, p[2]/180.0*pi)goal.target_pose.pose.orientation.x = q[0]goal.target_pose.pose.orientation.y = q[1]goal.target_pose.pose.orientation.z = q[2]goal.target_pose.pose.orientation.w = q[3]self.move_base.send_goal(goal, self._done_cb, self._active_cb, self._feedback_cb)result = self.move_base.wait_for_result(rospy.Duration(60))if not result:self.move_base.cancel_goal()rospy.loginfo("Timed out achieving goal")else:state = self.move_base.get_state()if state == GoalStatus.SUCCEEDED:rospy.loginfo("reach goal %s succeeded!"%p)return Truedef _done_cb(self, status, result):rospy.loginfo("navigation done! status:%d result:%s"%(status, result))def _active_cb(self):rospy.loginfo("[Navi] navigation has be actived")def cancel(self):self.move_base.cancel_all_goals()return Trueclass ARTracker:def __init__(self):self.ar_sub = rospy.Subscriber('/ar_pose_marker', AlvarMarkers, self.ar_cb)def ar_cb(self,data):global tag_idfor marker in data.markers:tag_id = marker.idclass Object_position:def __init__(self):self.ar_sub = rospy.Subscriber('/object_position', Point, self.find_cb)self.tts_pub = rospy.Publisher('/voiceWords', String, queue_size=10)def find_cb(self,data):global find_id      point_msg = dataif(point_msg.z>=1 and point_msg.z<=5):find_id = 1			         self.tts_pub.publish(str(find_id))elif(point_msg.z>=9 and point_msg.z<=15):find_id = 2self.tts_pub.publish(str(find_id))elif(point_msg.z>=16 and point_msg.z<=23):find_id = 3self.tts_pub.publish(str(find_id))elif(point_msg.z>=25 and point_msg.z<=26):find_id = 4self.tts_pub.publish(str(find_id))elif(point_msg.z>=36 and point_msg.z<=40):find_id = 5self.tts_pub.publish(str(find_id))elif(point_msg.z>=41 and point_msg.z<=43):find_id = 6self.tts_pub.publish(str(find_id))elif(point_msg.z>=70 and point_msg.z<=71):find_id = 7self.tts_pub.publish(str(find_id))elif(point_msg.z>=80 and point_msg.z<=81):find_id = 8self.tts_pub.publish(str(find_id))else:find_id = 0#print("id为0,没有识别到!")def process():rospy.spin()find_id = 0 
tag_id = 0
both_id =0if __name__ == '__main__':rospy.init_node('navigation_demo',anonymous=True)goalListX = rospy.get_param('~goalListX', '2.0, 2.0,2.0')goalListY = rospy.get_param('~goalListY', '2.0, 4.0,2.0')goalListYaw = rospy.get_param('~goalListYaw', '0, 90.0,2.0')goals = [[float(x), float(y), float(yaw)] for (x, y, yaw) in zip(goalListX.split(","),goalListY.split(","),goalListYaw.split(","))]##为了方便记忆,goals中[0]是终点,[1]到[8]分别对应场上的8个点,9是第一个框的识别点,10是第二个框的识别点,11是第三个框的识别点,12是第四个框的识别点object_position = Object_position()ar_acker = ARTracker()executor_thread = threading.Thread(target=process).start()navi = Navigation()find_point_flag=[0,0,0,0]have_nav_flag=[0,0,0,0]time.sleep(10)navi.goto(goals[9])find_point_flag[0]=1while True:if find_id==1 or tag_id==1:both_id=1elif find_id==2 or tag_id==2:both_id=2elif find_id==3 or tag_id==3:both_id=3elif find_id==4 or tag_id==4:both_id=4elif find_id==5 or tag_id==5:both_id=5elif find_id==6 or tag_id==6:both_id=6elif find_id==7 or tag_id==7:both_id=7elif find_id==8 or tag_id==8:both_id=8else:both_id=0	 if both_id==0:if have_nav_flag[0]==1 and find_point_flag[1]==0: navi.goto(goals[10]) find_point_flag[1]=1if have_nav_flag[1]==1 and find_point_flag[2]==0: navi.goto(goals[11]) find_point_flag[2]=1if have_nav_flag[2]==1 and find_point_flag[3]==0:navi.goto(goals[12])find_point_flag[3]=1if have_nav_flag[3]==1: navi.goto(goals[0]) breakelse:if both_id==1 and have_nav_flag[0]==0:	navi.goto(goals[1])have_nav_flag[0]=1if both_id==2 and have_nav_flag[0]==0:	navi.goto(goals[2])have_nav_flag[0]=1if both_id==3 and have_nav_flag[0]==0:	navi.goto(goals[3])have_nav_flag[1]=1if both_id==4 and have_nav_flag[0]==0:	navi.goto(goals[4])have_nav_flag[1]=1if both_id==5 and have_nav_flag[0]==0:	navi.goto(goals[5])have_nav_flag[3]=1if both_id==6 and have_nav_flag[0]==0:	navi.goto(goals[6])have_nav_flag[3]=1if both_id==7 and have_nav_flag[0]==0:	navi.goto(goals[7])have_nav_flag[4]=1if both_id==8 and have_nav_flag[0]==0:	navi.goto(goals[8])have_nav_flag[4]=1#time.sleep(1)#rclpy.shutdown()

极限4天排队调车,时间太赶了,代码写得很差,一旦识别不了后面的就走不了,后面想重写也没时间。由于官方用的模板匹配识别的太慢,打算用yolov5 -lite模型识别,openvino部署,后面也来不及用上。现在,把yolov5 -lite 大写数字一到八的检测模型 .onnx文件送上,准确率95%

best.zip - 蓝奏云

目标射击赛道

目标射击赛项实践直播回放2024-04-23_哔哩哔哩_bilibili


#!/usr/bin/env python
#coding: utf-8import rospy
from geometry_msgs.msg import Point, Twist
import threading
import actionlib
import serial
import time
from actionlib_msgs.msg import GoalStatus
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from geometry_msgs.msg import PoseWithCovarianceStamped
from tf_conversions import transformations
from ar_track_alvar_msgs.msg import AlvarMarkers
from math import pi
import subprocessclass Navigation:def __init__(self):self.set_pose_pub = rospy.Publisher('/initialpose', PoseWithCovarianceStamped, queue_size=5)self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)self.move_base.wait_for_server(rospy.Duration(60))def set_pose(self, p):if self.move_base is None:return Falsex, y, th = ppose = PoseWithCovarianceStamped()pose.header.stamp = rospy.Time.now()pose.header.frame_id = 'map'pose.pose.pose.position.x = xpose.pose.pose.position.y = yq = transformations.quaternion_from_euler(0.0, 0.0, th/180.0*pi)pose.pose.pose.orientation.x = q[0]pose.pose.pose.orientation.y = q[1]pose.pose.pose.orientation.z = q[2]pose.pose.pose.orientation.w = q[3]self.set_pose_pub.publish(pose)return True def _feedback_cb(self, feedback):msg = feedback#rospy.loginfo("[Navi] navigation feedback\r\n%s"%feedback)def goto(self, p):rospy.loginfo("[Navigation] goto %s"%p)goal = MoveBaseGoal()goal.target_pose.header.frame_id = 'map'goal.target_pose.header.stamp = rospy.Time.now()goal.target_pose.pose.position.x = p[0]goal.target_pose.pose.position.y = p[1]q = transformations.quaternion_from_euler(0.0, 0.0, p[2]/180.0*pi)goal.target_pose.pose.orientation.x = q[0]goal.target_pose.pose.orientation.y = q[1]goal.target_pose.pose.orientation.z = q[2]goal.target_pose.pose.orientation.w = q[3]self.move_base.send_goal(goal, self._done_cb, self._active_cb, self._feedback_cb)result = self.move_base.wait_for_result(rospy.Duration(60))if not result:self.move_base.cancel_goal()rospy.loginfo("Timed out achieving goal")else:state = self.move_base.get_state()if state == GoalStatus.SUCCEEDED:rospy.loginfo("reach goal %s succeeded!"%p)return Truedef _done_cb(self, status, result):rospy.loginfo("navigation done! status:%d result:%s"%(status, result))def _active_cb(self):rospy.loginfo("[Navi] navigation has be actived")def cancel(self):self.move_base.cancel_all_goals()return Trueclass ARTracker:def __init__(self):self.ar_sub = rospy.Subscriber('/ar_pose_marker', AlvarMarkers, self.ar_cb)def ar_cb(self,data):global target_idglobal ar_xglobal ar_yglobal ar_zglobal ar_idfor marker in data.markers:if  marker.id == target_id :ar_x = marker.pose.pose.position.xar_y = marker.pose.pose.position.yar_z = marker.pose.pose.position.zar_id = marker.id#print('AR Marker Position (x,y,z):', ar_x, ar_y,ar_z)breakclass Object_position:def __init__(self):self.ar_sub = rospy.Subscriber('/object_position', Point, self.find_cb)def find_cb(self,data):global find_id global find_xglobal find_y     point_msg = dataif(point_msg.z>=1 and point_msg.z<=5):find_id = 1	find_x=point_msg.xfind_y=point_msg.y		         			else:find_id = 0def process():rospy.spin()find_id = 0 
find_x=0.0
find_y=0.0
target_id = 0 
ar_id = 0 
ar_x =0.0
ar_y =0.0
ar_z =0.0if __name__ == '__main__':rospy.init_node('navigation_demo',anonymous=True)ser = serial.Serial(port="/dev/shoot", baudrate=9600, parity="N", bytesize=8, stopbits=1)pub = rospy.Publisher("/cmd_vel", Twist, queue_size=1000)goals = [  [1.1 , -0.37,0.0],[1.1 , -1.45,.0],[1.0 , -2.72,.0],[0.07 , -2.72,.0]  ]object_position = Object_position()ar_acker = ARTracker()executor_thread = threading.Thread(target=process).start()navi = Navigation()time.sleep(15)# ------first--------------------------------------------------------navi.goto(goals[0])start=time.time()is_shoot=0while True:if find_id == 1:flog0 = find_x - 320flog1 = abs(flog0)print(flog0)if abs(flog1) >10:msg = Twist()      msg.angular.z = -0.01 * flog0 pub.publish(msg)print(msg.angular.z)elif abs(flog1) <= 10: print('1 is shoot')       ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.2)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68') time.sleep(2)is_shoot=1breakend=time.time()if end-start>12:breakif is_shoot==0:ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.2)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68') time.sleep(2)#subprocess.run( ['rosnode','kill','find_object_2d'] )# ------sencond-----------------------------------------------------navi.goto(goals[1])target_id=1     Yaw_th = 0.003start=time.time()is_shoot=0while True:if ar_id == target_id:ar_x_abs = abs(ar_x)print('x:',ar_x)print('z:',ar_z)       if ar_x_abs >= Yaw_th: msg = Twist()  msg.angular.z = -1.5 * ar_x pub.publish(msg)elif ar_x_abs < Yaw_th and (ar_z >= 1.57 and ar_z <=1.64):print('2 is shoot') ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.1)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68')is_shoot=1breakend=time.time()if end-start>20:breakif is_shoot==0:ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.2)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68') time.sleep(2)# # --------------------third----------------------------------navi.goto(goals[2])target_id=2     # ------------------------------------------------------Yaw_th = 0.002start=time.time()is_shoot=0while True:if ar_id == target_id:ar_x_abs = abs(ar_x)print(ar_x)       if ar_x_abs >= Yaw_th: msg = Twist()  msg.angular.z = -1.5 * ar_x  pub.publish(msg)elif ar_x_abs < Yaw_th:print('3 is shoot') ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.1)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68')is_shoot=1 breakend=time.time()if end-start>12:breakif is_shoot==0:ser.write(b'\x55\x01\x12\x00\x00\x00\x01\x69') time.sleep(0.2)       ser.write(b'\x55\x01\x11\x00\x00\x00\x01\x68') time.sleep(2)# # -------------------------------------------------------------------------navi.goto(goals[3]) #slowly#rclpy.shutdown()

调的时候旋转靶是可以打的,但是比赛过程就旋转靶没打中,没办法了,就这样。

经验


ssh -Y  abot@192.168.135.6
sudo  nautilus                                
scp -r  abot@192.168.135.6:/home/abot/robot_ws D: 

主目录运行:
 建图:  ./1-gmapping.sh      保存: roslaunch robot_slam save_map.launch
射击: roslaunch abot_bringup shoot.launch   发射驱动程序
rostopic pub /shoot  std_msgs/String "data: '' "   发布射击的空话题,等待发射
识别:
roslaunch usb_cam usb_cam_test.launch   打开相机
rosrun rqt_image_view  rqt_image_view   可视化相机
语音:
连接蓝牙耳机WI-C200
roscore
rosrun  robot_voice   tts_subscribe
rostopic  pub /voiceWords std_msgs/String "data: '1234' "


启动导航与识别:
3-mission.sh 在这里
roslaunch track_tag usb_cam_with_calibration.launch  打开相机节点
 roslaunch track_tag ar_track_camera.launch   启动二维码识别节点
 rosrun robot_voice tts_subscribe; exec bash  语音播报节点
robot_slam/launch/multi_goal.launch  修改导航的目标点的坐标值
robot_slam/scripts/ navigation_multi_goals.py  修改对应id分别走到哪个点


--------------------------------------------------------------------------------------

把官方给的代码放到 src\robot_slam\scripts  里面

--------------------1. 自主巡航------------------------------

修改导航的目标点的位姿:   robot_slam/launch/multi_goal.launch  
X Y Yaw 一列为一组值 ,一一对应(分别表示goal[0] ...goal[1]), Yaw是角度制,90.0表示逆时针旋转90度(正值向左)

识别:(视频的第35分钟)
roslaunch usb_cam usb_cam_test.launch   打开相机
roslaunch  find_object_2d  find_object_2d6.launch  启动识别程序

Edit -- Add object -- Take picture截图 --框选物体 --End --File --Save object 路径选择 abot_find/object/   
然后对图片进行特殊命名(数字范围)
-------没有ar_cb函数py


--------------------2. 目标射击------------------------------

user_demo/param/mission.yaml    修改射击目标点的相关参数

roslaunch usb_cam usb_cam_test.launch   打开相机
roslaunch  find_object_2d  find_object_2d6.launch  启动识别程序
rosrun  robot_slam   III.py   识别结果判断
rostopic echo /object_position

跟踪标签:在6-mission.sh里有 ,
roslaunch  track_tag usb_cam_with_calibration.launch
roslaunch  track_tag ar_track_camera.launch

rostopic echo /ar_pose_marker

然后运行官方给的代码  rosrun robot_slam  .py   ,需要把代码整合起来,能够识别三种目标并射击
 

启动代码前一定要插上炮台的USB串口线,不然运行就会报错没有串口 /dev/shoot

记得打开炮台开关

---------------------------------------------------------------------------
查看坐标点
运行navigation.sh脚本前注释掉最后一行 ,在打开的地图里点击目标点前 运 rostopic echo /move_base_simple/goal
在导航地图中使用RViz中的navigation goal标定目标后,到终端的输出查看pose 字段,里面有x,y目标点
直接拿迟来量坐标比较快,单位是米,搞懂ros坐标系

编译及运行--------------------------------------------------------------------
catkin_make    
catkin_make -DCATKIN_WHITELIST_PACKAGES="robot_slam"

source devel/setup.bash
source /opt/ros/melodic/setup.bash
 

参加比赛要注重交流,从比赛中获得友情,知识和实践,面对困难永不放弃的决心,不要把奖项看的那么重要。

在小车的主机里插入鼠标,连接WIFI,使用屏幕键盘输入密码,剩下的交给远程控制。

同一局域网下ssh传输文件:

无论是windows还是ubuntu,都可以互传文件

同一局域网多人连接:

一个主要的人负责用向日葵远程控制小车,进行调试

一个次要的人负责使用ssh连接,在里面写代码,查看文档

等调完半小时,换另一个远程控制调车。

(Vscode的ssh远程连接修改代码)(或者,在虚拟机里ssh连接小车主机<加Y参数 ssh -Y IP>,在终端里执行 sudo  nautilus  打开并编辑文件管理器)

功能包重名,就修改launch文件名区别开,如过.sh脚本运行报错,单独分开命令运行试试,记得source自己的工作空间

复制别人的工作空间,需要重新编译,不然setup.bash还是用的原来的,串到原来的代码

编译:

catkin_make    # 若失败,删除build目录和devel目录试试

catkin_make -DCATKIN_WHITELIST_PACKAGES="robot_slam"

catkin build 包名

 Ctrl+h 修改环境变量.bashrc

...... 

相关文章:

自主巡航,目标射击

中国机器人及人工智能大赛 参赛经验&#xff1a; 自主巡航赛道 【机器人和人工智能——自主巡航赛项】动手实践篇-CSDN博客 主要逻辑代码 #!/usr/bin/env python #coding: utf-8import rospy from geometry_msgs.msg import Point import threading import actionlib impor…...

MySQL中EXPLAIN关键字详解

昨天领导突然问到&#xff0c;MySQL中explain获取到的type字段中index和ref的区别是什么。 这两种状态都是在使用索引后产生的&#xff0c;但具体区别却了解不多&#xff0c;只知道ref相比于index效率更高。 因此&#xff0c;本文较为详细地记录了MySQL性能中返回字段的含义、状…...

如何理解ref toRef和toRefs

是什么 ref 生成值类型的响应式数据可用于模板和reactive通过.value修改值 ref也可以像vue2中的ref那样使用 toRef 针对一个响应式对象&#xff08;reactive&#xff09;的prop创建一个ref两者保持引用关系 toRefs 将响应式对象&#xff08;reactive封装&#xff09;转换…...

【linux】kernel-trace

文章目录 linux kernel trace配置trace内核配置trace接口使用通用配置Events配置Function配置Function graph配置Stack trace设置 跟踪器tracer功能描述 使用示例1.irqsoff2.preemptoff3.preemptirqsoff linux kernel trace 配置 源码路径&#xff1a; kernel/trace trace内…...

【Golang 面试基础题】每日 5 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

ETCD介绍以及Go语言中使用ETCD详解

ETCD介绍以及Go语言中使用ETCD详解 什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现 。 etcd的特点 完全复制:集群中的每个节点都可以使用完整的存档高…...

03-用户画像+Elasticsearch

优点 es支持海量数据的写入和更新es可以和hadoop&#xff0c;hive及spark进行集成es支持hivesql的操作&#xff0c;可以通过hivesql将数据导入eses的在进行数据检索查询是速度比较快es是分布式存储 应用 全文检索 全文检索流程: 1-对文档数据(文本数据)进行分词 2-将分词…...

初学Mybatis之搭建项目环境

在连接 mysql 数据库时&#xff0c;遇到了个 bug&#xff0c;之前都能连上&#xff0c;但报错说换了个 OS 操作系统什么的 然后搜索怎么连接&#xff0c;找到了解决方法 MySQL MYSQL – 无法连接到本地MYSQL服务器 (10061)|极客教程 (geek-docs.com) 命令行输入 services.msc…...

JMeter使用小功能-(持续更新)

1、jmeter在同一个线程组内&#xff0c;uuid的复用 方式一&#xff1a; 方式二&#xff1a; 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…...

科研绘图系列:R语言火山图(volcano plot)

介绍 火山图(Volcano Plot),也称为火山图分析,是一种在生物信息学和基因组学中常用的图形表示方法,主要用于展示基因表达数据的差异。它通常用于基因表达微阵列或RNA测序数据的可视化,帮助研究人员识别在不同条件下表达差异显著的基因。 火山图的基本构成 X轴:通常表示…...

docker firewalld 防火墙设置

1、环境 centos 7 firewalld docker-ce docker 默认会更改防护墙配置 导致添加的防火墙策略不生效&#xff0c;可以启用firewalld 重新设置策略 2、启用防火墙 systemctl start firewalld systemctl enable firewalld3、配置文件禁用docker 的iptables /etc/docker/daemon.js…...

《问题004:报错-JS问题-unknown: Invalid shorthand property initializer.》

问题描述&#xff1a; unknown: Invalid shorthand property initializer. (25:13) unknown:无效的简写属性初始化项 解决方法&#xff1a; “”应该写为“&#xff1a;”&#xff08;globalData 改成 globalData: &#xff09;...

什么是 MLPerf?

什么是 MLPerf&#xff1f; MLPerf 是一个用于衡量机器学习硬件、软件和服务性能的标准化基准测试平台。它由 MLCommons 组织开发&#xff0c;该组织是由多家领先的科技公司和学术机构组成的。MLPerf 的目标是通过一系列标准化的基准测试任务和数据集&#xff0c;提供一个统一…...

【SpringBoot】第3章 SpringBoot的系统配置

3.1 系统配置文件 3.1.1 application.properties SpringBoot支持两种不同格式的配置文件&#xff0c;一种是Properties&#xff0c;一种是YML。 SpringBoot默认使用application.properties作为系统配置文件&#xff0c;项目创建成功后会默认在resources目录下生成applicatio…...

ELK日志分析系统部署文档

一、ELK说明 ELK是Elasticsearch&#xff08;ES&#xff09; Logstash Kibana 这三个开源工具组成&#xff0c;官方网站: The Elastic Search AI Platform — Drive real-time insights | Elastic 简单的ELK架构 ES: 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它…...

ue5笔记

1 点光源 聚光源 矩形光源 参数比较好理解 &#xff08;窗口里面&#xff09;环境光混合器&#xff1a;快速创造关于环境光的组件 大气光源&#xff1a;太阳光&#xff0c;定向光源 天空大气&#xff1a;蓝色的天空和大气 高度雾&#xff1a;大气下面的高度感的雾气 体积…...

TCP重传机制详解

1.什么是TCP重传机制 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回⼀个确认应答消息&#xff0c;表示已收到消息。 但是如果传输的过程中&#xff0c;数据包丢失了&#xff0c;就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…...

如何使用javascript将商品添加到购物车?

使用JavaScript将商品添加到购物车可以通过以下步骤实现&#xff1a; 创建一个购物车对象&#xff0c;可以是一个数组或者对象&#xff0c;用于存储添加的商品信息。在网页中的商品列表或详情页面&#xff0c;为每个商品添加一个“添加到购物车”的按钮&#xff0c;并为按钮绑…...

【MySQL】:想学好数据库,不知道这些还想咋学

客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C&#xff08;client&#xff09;—S&#xff08;server&#xff09; 客户端和服务器是两个独立的程序&#xff0c;这两个程序之间通过“网络”进行通信&#xff08;相当于是两种角色&#xff09; 客户端 主动发起网…...

1.关于linux的命令

1.关于文件安装的问题 镜像站点服务器&#xff1a;cat /etc/apt/sources.list 索引文件&#xff1a;cd /var/lib/apt/lists 下载文件包存在的路径&#xff1a;cd /etc/cache/apt/archives/2.关于dpkg文件安装管理器的应用: 安装文件:sudo dpkg -i 文件名; 查找文件目录:sudo …...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

Jmeter(四) - 如何在jmeter中创建网络测试计划

1.简介 如何创建基本的 测试计划来测试网站。您将创建五个用户&#xff0c;这些用户将请求发送到JMeter网站上的两个页面。另外&#xff0c;您将告诉用户两次运行测试。 因此&#xff0c;请求总数为&#xff08;5个用户&#xff09;x&#xff08;2个请求&#xff09;x&#xff…...