仿真机器人-深度学习CV和激光雷达感知(项目2)day04【简单例程】

文章目录

  • 前言
  • 简单例程
    • 运行小海龟仿真
      • 启动节点
      • 查看计算图
      • 发布 Topic
      • 调用 Serviece
    • 用 Python 发布和接收 Topic
      • 创建工作空间
      • 创建功能包,编译
      • 编写 Topic Publisher 节点
      • 编写 Topic Subscriber 节点
      • 运行节点
    • 自定义消息类型
    • 用 Python 注册和调用 Serviece
      • 新建功能包
      • 在 srv 文件夹下,创建 AddTwoNum.srv 文件
      • 同上节,修改 package.xml 和 CMakeLists.txt 文件后编译
      • 编写 Service 服务器代码
      • 编写 Service 客户端代码
      • 运行代码

前言

💫你好,我是辰chen,本文旨在准备考研复试或就业
💫本文内容是我为复试准备的第二个项目
💫欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
🌟 预置知识:基本Python语法,基本linux命令行使用

以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:

💥ACM-ICPC算法汇总【基础篇】
💥ACM-ICPC算法汇总【提高篇】
💥AIoT(人工智能+物联网)
💥考研
💥CSP认证考试历年题解

简单例程

运行小海龟仿真

打开虚拟机,进入Vscode,创建一个新窗口和新终端
在这里插入图片描述

在这里插入图片描述

启动节点

在终端依次运行如下指令

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

roscore :启动 Master 节点
在这里插入图片描述
启动后把Master这个界面放到一边,再开一个终端,运行 rosrun turtlesim turtlesim_node,结果如下,rosrun 后面跟了两个参数,其中 turtlesim 就是功能包的名字,turtlesim_node 就是可执行文件的名字,对应着 src 中的一个文件叫做 turtlesim_node,用 rosrun 就把这个文件跑起来了,跑起来的结果就是出现了一个小海龟,接着再跑下一个节点

在这里插入图片描述
把终端拆分:
在这里插入图片描述
在这里插入图片描述
运行第二个节点:rosrun turtlesim turtle_teleop_key,如此,两个节点就都启动好了,第一个节点是一个可视化的模拟器,第二个节点是可以用键盘去控制小海龟(用箭头键移动海龟,按q退出控制)
在这里插入图片描述
注意我们在控制小海龟进行移动的时候,最后一次点击需要停留在第二个节点所在的终端。
在这里插入图片描述

查看计算图

我们的两个节点是在两个终端运行的,但是却协同运行,我们可以查看一下计算图:

rosrun rqt_graph rqt_graph

继续拆分终端后运行 rosrun rqt_graph rqt_graph 结果如下:
在这里插入图片描述
如图,有两个椭圆,即有两个节点,有一个方框,即有一个 Topic,Topic 的名字叫做 /turtle1/cmd_vel,该 Topic 由节点 /teleop_turtle 发布,由 /turtlesim 订阅,每按下一次键盘都会有一个 Topic 发布,并被另一节点接收。

也就是说,海归模拟器只要收到了 /turtle1/cmd_vel 这个 Topic 之后,就会让海龟去做相应的移动,即只要有该 Topic 发出,海龟就可以移动,即不一定必须通过 /teleop_turtle 这个节点发出,下面试一下不通过 /teleop_turtle 节点直接发送该 Topic

发布 Topic

# -r 参数设置发送频率, 不带 -r 参数则只发送一次,我们让海龟动起来的话需要持续的发送,1为1Hz,即每秒发1次
rostopic pub -r 1 /turtle1/cmd_vel ...

按q退出,新建终端:
在这里插入图片描述
使用 -h 可以查看命令的使用方式:
在这里插入图片描述
写命令行多用 Tab 补全,可以查看目前有哪些 Topic:
在这里插入图片描述
可以看到目前不止一个 Topic,当然我们需要的 /turtle1/cmd_vel 也在其中,但是我们刚刚的图中却仅显示了一个 Topic,这是因为我们只选择了 active(活跃:有发布者有订阅者)的 Topic,选择 all 即可查看其余的 Topic:
在这里插入图片描述
在这里插入图片描述
可以看到,/turtle1/color_senor 和 /turtle1/pose 这两个 Topic 只有发布者,没有订阅者,剩余的 Topic 是用来做系统调试的,关掉 Debug:
在这里插入图片描述
接下来回到正题:用 Topic 直接控制小海龟:
在这里插入图片描述
再按下 Tab 会自动补全 Topic 的数据类型(知道了 Topic 的名字就知道了它的数据类型):
在这里插入图片描述
再按下 Tab 会自动补全要发送的内容(数据类型如何定义 ROS 也是知道的):
在这里插入图片描述
类型由两个字段组成:linear : 线性线速度,angular : 角速度(均是三维),现在让它往前走:前是x轴,让它转圈,转圈就是z轴:
在这里插入图片描述
可以看到小海龟不停的在转圈:
在这里插入图片描述
刷新计算图:
在这里插入图片描述
在这里插入图片描述
就会发现之前的节点 /teleop_turtle 没有了(之前按q退出了),多了一个命令行工作自动创建的一个节点 /rostopic_7836_1705655818540,但本质上,当前计算图和之前的计算图的拓扑结构没有什么区别。

Topic演示到此结束,按 Ctrl C 停止,接下来演示 Service
在这里插入图片描述

调用 Serviece

rosservice list
rosservice call /spawn ...

同样,我们可以用 -h 进行查看:
在这里插入图片描述
其中的 list 就是列举当前活跃的 Service,继续查看:
在这里插入图片描述
如下就是 turtle1 创建的 Service
在这里插入图片描述
/spawn 用来新建一个机器人,就是新建一个海龟的意思

在这里插入图片描述
再按下 Tab,自动补全调用服务需要的参数:
在这里插入图片描述
可以看到有 x,y,z 这样的参数,x,y,z就是新的小海龟出生的位置坐标,theta就是朝向,可以修改部分值然后进行创建:
在这里插入图片描述
坐标的定义:x,y轴就是在最左下角的位置,这样,我们就通过调用 Service 创建了一个海龟,再来看一下计算图的变化:
在这里插入图片描述
可以看到就有了两个海龟。

关掉所有终端,Ctrl C
在这里插入图片描述

用 Python 发布和接收 Topic

上面我们讲述了用命令行区发送 Topic,当然我们也可以用代码去发送(以后大多也是用代码进行发送)

创建工作空间

新开一个终端,依次执行如下命令

# 在用户目录下创建工作空间
cd ~
mkdir -p learn_ws/src# 在工作空间的根目录编译
cd learn_ws/
catkin_make

-p 递归创建

在这里插入图片描述
找到我们创建好的文件夹:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建功能包,编译

新开一个终端,依次执行如下命令

# 进入工作空间的src文件夹
cd ~/learn_ws/src# 创建功能包,指定名称、依赖
catkin_create_pkg learn_topic std_msgs rospy# 回到工作空间根目录编译,每加入一个功能包都要重新编译
cd ..
catkin_make# 编译后,setup文件会更新,需要重新source
source devel/setup.bash

执行完catkin_create_pkg learn_topic std_msgs rospy 可以看到左侧多了 learn_topic 以及其内的 src 以及相关文件
在这里插入图片描述
在这里插入图片描述

编写 Topic Publisher 节点

src下新建一个Python文件talker.py
在这里插入图片描述

#! /usr/bin/env python
import rospy
from std_msgs.msg import Stringdef talker():# 向 ROS Master 注册名为 talker 的节点rospy.init_node('talker')# 创建 Topic 发布者, Topic 名称为 test_msg, 数据类型为 String, 消息队列长度为10pub = rospy.Publisher('test_msg', String, queue_size=10)# 定义 2Hz 的 rate 变量, 即每次 sleep 时长为 0.5srate = rospy.Rate(2)# 在节点没有关闭时,执行循环while not rospy.is_shutdown():msg = f'Hello ROS! From talker, at {rospy.get_time()}'# 在终端打印日志rospy.loginfo(msg)# 发布 Topic pub.publish(msg)# 等待 0.5srate.sleep()rospy.loginfo('Talker exist.')if __name__ == '__main__':talker()    

记得写完后保存代码

解释如下:

#! /usr/bin/env python

该代码不可缺少,为指定用Python区运行代码,否则ROS可能不知道

rospy.init_node('talker')

向 Master 注册一个节点,运行到这一行时,计算图里就会多一个叫做 talker 的节点

pub = rospy.Publisher('test_msg', String, queue_size=10)

每一个 Topic 都要用名字以及类型去定义,此外这里还指定了一个消息队列长度,这是因为 Topic 是异步通信,发送者是只管发,至于接收者是否及时接收到,接收的速度够不够对于发送者而言都是不知道的,这里 queue_size=10 就意味着在接收者有一个队列,长度为10,每次发的消息都会送入队列中,每次接收者取消息都会出队,如果设为 0,即队列无限长,此时如果发布的速度比接收的速度快,就会导致队列越来越长,最后爆内存,如果设为 1 那么实时性就会比较高,即会取到最新的 Topic 信息

rate = rospy.Rate(2)  # 作用就是为了后续的 sleep()
rate.sleep()
while not rospy.is_shutdown():

没有关闭就会进入循环,关闭条件如在终端中按下Ctrl C

msg = f'Hello ROS! From talker, at {rospy.get_time()}'
rospy.loginfo(msg)
pub.publish(msg)
rate.sleep()

获取一个时间戳并打印、发布,然后睡眠0.5s后继续发

编写 Topic Subscriber 节点

src下新建一个Python文件listener.py

在这里插入图片描述

#! /usr/bin/env python
import rospy
from std_msgs.msg import Stringdef get_test_msg(data):# data.data 中是 Topic 数据rospy.loginfo(f'Listener get msg: {data.data}')def listener():rospy.init_node('listener')# 创建 Topic 订阅者, 订阅名为 test_msg 的 Topic, 数据类型为 String, 收到 Topic 后的回调函数是 get_test_msgrospy.Subscriber('test_msg', String, get_test_msg)# 防止程序提前退出,等到节点关闭时再退出rospy.spin()if __name__ == '__main__':listener()

记得写完后保存代码

解释如下:

rospy.init_node('listener')

注册节点

rospy.Subscriber('test_msg', String, get_test_msg)

告诉 Master 想要订阅 test_msg 这个 Topic,类型是 String,回调函数为 get_test_msg

回调函数是一种在编程中常见的模式,特别是在处理异步事件或消息传递时。它基本上是一个被传递到另一个函数或方法中的函数,然后在适当的时刻被调用。回调函数的概念是核心的一部分,特别是在消息订阅和事件处理方面。

简单理解回调函数:设函数A是回调函数,还有另一个函数是函数B,所谓回调函数,就是因为A是函数B的一个参数,当有特定的事件发生时,函数B会执行函数A

在这里,get_test_msg 是一个回调函数。当 test_msg 话题上接收到一个新消息时,ROS 会自动调用 get_test_msg 函数,并将接收到的消息作为参数传递给这个函数。这样,你就可以在 get_test_msg 函数内定义当接收到消息时你希望执行的操作。

rospy.spin()

我们可以对这句代码 Ctrl 左键 查看其源码:
在这里插入图片描述
其实可以看到就是让它睡 0.5s,和我们 talker 中写的一样,其实目的就是为了防止程序退出,因为退出了的话,你创建的 Subscriber 也就被销毁了,这个进程就没了,不能再处理;所以如果本身有一个循环,如编写 Topic Publisher 中的那样,就不需要再 spin(),没有循环的话,如编写 Topic Subscriber 这样,就要调用一下 spin()

def get_test_msg(data):

这个函数的参数 data 就是我们拿到的 Topic

rospy.loginfo(f'Listener get msg: {data.data}')

打印拿到的数据

运行节点

新建一个终端

# 新建的 Python 文件,需要添加运行权限
chmod +x src/learn_topic/src/*# 运行
roscore
rosrun learn_topic talker.py
rosrun learn_topic listener.py# 工具
rosrun rqt_graph rqt_graph   # 下面只演示了这个工具
rosrun rqt_topic rqt_topic

在这里插入图片描述
拆分终端,输入 source devel/setup.bash(启动 Master,因为刚刚的 Master关了),继续按上述代码运行:

在这里插入图片描述
新建终端,输入 source devel/setup.bash
在这里插入图片描述

可以看到可以正常的发出 Topic 和接收 Topic

新建一个终端:
在这里插入图片描述
rqt_topic 可以用可视化的方式把现在有的 Topic 都显示出来,✔代表接收这个 Topic:
在这里插入图片描述
就会显示它的带宽,以及他的频率为 2Hz(就是我们当初设置的那样),展开后可以查看 Type 和 Value
在这里插入图片描述

自定义消息类型

上述中,我们用的是 String,只是发布了一个很简单的字符串,我们再很多条件下是需要自定义消息类型的,去应对更复杂的需求:

  1. .msg文件:描述 ROS 消息的文本文件,是一种编程语言无关的接口,用于为不同编程语言的消息生成源代码
  2. .srv文件:与msg文件类似,但用来描述一个 Service,包括请求参数和返回值两部分
  3. 可用的数据类型
    • int8, int16, int32, int64(加uint*)
    • float32, float64
    • string
    • time, duration
    • 变长数组 <type>[],定长数组 <type>[N]
    • 其他自定义类型,即支持类型嵌套

使用自定义消息类型的 Topic:

1.在上面创建的工作空间,新建功能包

cd src
catkin_create_pkg custom_msg std_msgs rospy

创建名为:custom_msg 的功能包,有两个依赖:std_msgs、rospy

2.在功能包的 msg 文件夹下,创建 robot_state.msg 文件
在这里插入图片描述
在这里插入图片描述
注:文件名必须叫这个名,在该文件下输入下述代码

string name
uint8 id
float64 speed
float64[2] position

在这里插入图片描述

记得写完后保存代码

这里就是编程无关的语言了,接下来,就是要让 ROS 去编译这个文件,然后自动生成,这些数据类型它在 Python 下面对应的这些代码和类型是什么,这些都是自动完成的

3.修改 package.xml,添加依赖项,用于生成自定义类型的源代码(C++,Python等)

注意找对 package,每个功能包里都有一个 package
在这里插入图片描述
把如下代码添入 package 中:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述
记得写完后保存代码

4.修改 CMakeLists.txt,在编译时自动生成源代码(不要直接复制,逐项修改)

注意找对 CmakeLists,每个功能包里都有一个 CmakeLists

# 在 find_package 中添加 message_generation, 修改后如下:
find_package(catkin REQUIRED COMPONENTSrospystd_msgsmessage_generation
)# 在 catkin_package 中添加 CATKIN_DEPENDS message_runtime,修改后如下:
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES custom_msgCATKIN_DEPENDS rospy std_msgs message_runtime
#  DEPENDS system_lib
)# 解除 add_message_files 的注释, 添加 .msg文件,修改后如下:
add_message_files(FILESrobot_state.msg
)# 解除 generate_messages 的注释, 修改后如下:
generate_messages(DEPENDENCIESstd_msgs
)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得写完后保存代码

5.编译

cd ..     # 就是来到 learn_ws 下
catkin_make

在这里插入图片描述

6.编写发布节点

此代码相当于是 Topic 中的 Talker

在这里插入图片描述

#! /usr/bin/env python
import rospy
from custom_msg.msg import robot_statedef pub_state():rospy.init_node('robot_state_publisher')pub = rospy.Publisher('robot_state', robot_state, queue_size=10)rate = rospy.Rate(1)pos = [0, 0]speed = 0.5while not rospy.is_shutdown():msg = robot_state()msg.id = 0msg.name = 'qrobo'msg.position = posmsg.speed = speedpub.publish(msg)pos[0] += 0.5rate.sleep()if __name__ == '__main__':pub_state()

在这里插入图片描述

记得写完后保存代码

注意这个代码运行的话不会有输出的:因为代码中没有让打印日志之类的信息,运行代码前要记得要给新建的 Python 文件添加运行权限。
在这里插入图片描述

7.(可选)将编译的源代码加入 VSCode 的 Python 依赖路径,这一步只是为了写代码时 VSCode 能进行补全、分析和跳转,不影响代码运行。此操作每个工作空间做一次就可以

在下图标准位置填入下述代码:

,"${workspaceFolder}/devel/lib/python3/dist-packages"

在这里插入图片描述
在这里插入图片描述
记得写完后保存代码

用 Python 注册和调用 Serviece

新建功能包

新开一个终端:

cd src
catkin_create_pkg learn_service std_msgs rospy

在这里插入图片描述

在 srv 文件夹下,创建 AddTwoNum.srv 文件

--- 上面是请求参数,下面是返回参数

int64 A
int64 B
---
int64 Sum

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得写完后保存代码

同上节,修改 package.xml 和 CMakeLists.txt 文件后编译

注意找对 package,每个功能包里都有一个 package
在这里插入图片描述

把如下代码添入 package 中:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述

注意找对 CmakeLists,每个功能包里都有一个 CmakeLists

# 在 find_package 中添加 message_generation, 修改后如下:
find_package(catkin REQUIRED COMPONENTSrospystd_msgsmessage_generation
)# 在 catkin_package 中添加 CATKIN_DEPENDS message_runtime,修改后如下:
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES custom_msgCATKIN_DEPENDS rospy std_msgs message_runtime
#  DEPENDS system_lib
)# 解除 add_service_files 的注释, 添加 .srv文件,修改后如下:
add_service_files(FILESAddTwoNum.srv
)# 解除 generate_messages 的注释, 修改后如下:
generate_messages(DEPENDENCIESstd_msgs
)

在这里插入图片描述
在这里插入图片描述
记得写完后保存代码

编写 Service 服务器代码

在这里插入图片描述
记得写完后保存代码

#! /usr/bin/env python
import rospy
from learn_service.srv import AddTwoNum, AddTwoNumRequest, AddTwoNumResponse# AddTwoNum 的处理函数,参数为 AddTwoNumRequest, 返回 AddTwoNumResponse
def handle_add_two_num(req: AddTwoNumRequest):sum = req.A + req.Brospy.loginfo(f'{req.A} + {req.B} = {sum}')return AddTwoNumResponse(sum)if __name__ == '__main__':rospy.init_node('add_two_num_server')# 创建 Service 服务器, 类型为 AddTwoNum, 处理函数为 handle_add_two_numrospy.Service('add_two_num', AddTwoNum, handle_add_two_num)rospy.loginfo('add_two_num server ready.')rospy.spin()

编写 Service 客户端代码

在这里插入图片描述

#! /usr/bin/env python
import rospy
from learn_service.srv import *def add_two_num_client(a, b):# 等待该 Service 在 Master 中注册rospy.loginfo('waitting for service: add_two_num ...')rospy.wait_for_service('add_two_num')# 捕获可能发生的错误try:# 请求服务service = rospy.ServiceProxy('add_two_num', AddTwoNum)res: AddTwoNumResponse = service(a, b)return res.Sumexcept rospy.ServiceException as e:rospy.logerr(f'Service call failed: {e}')if __name__ == '__main__':rospy.init_node('add_two_num_client')a = 2b = 3rospy.loginfo(f'request service: {a} + {b}')res = add_two_num_client(a, b)rospy.loginfo(f'get response: {res}')

在这里插入图片描述

记得写完后保存代码

部分代码解释:

rospy.wait_for_service('add_two_num')

欲调用 add_to_num 这个 Service,如果此刻没有的话,程序就会在这一步停住,等待其注册

service = rospy.ServiceProxy('add_two_num', AddTwoNum)

这行代码创建了一个服务代理,名为 servicerospy.ServiceProxy 是创建服务代理的方法。这个代理允许你通过一个简单的本地函数调用来调用远程服务。
add_two_num 是你想要连接的服务的名称。
AddTwoNum 是服务的类型,它是一个自动生成的 Python 类,用于表示服务的请求和响应结构。
一旦这个代理被创建,你就可以像调用本地函数一样调用服务。

res: AddTwoNumResponse = service(a, b)

这行代码实际上是在调用服务。当你使用 service 代理并传入参数 a 和 b 时,客户端会向服务器发送一个 AddTwoNumRequest 消息,并等待服务器响应一个 AddTwoNumResponse 消息。
service(a, b) 调用服务并传入参数 a 和 b。这相当于发送一个包含这些参数的服务请求。
res: AddTwoNumResponse 这部分是类型注解,它指明变量 res 应该是一个 AddTwoNumResponse 类型的实例。这不是调用服务必需的,但它有助于代码的可读性和类型检查。
服务的调用是阻塞的,这意味着程序将在这一行暂停执行,直到服务响应被接收或发生错误。

运行代码

记得要给代码添加权限,以及编译代码:

catkin_make   # 编译代码
chmod +x src/learn_service/src/*   # 给代码加运行权限
roscore
source devel/setup.bash   # 新建的终端要运行该命令
rosrun learn_service server.py
source devel/setup.bash   # 新建的终端要运行该命令
rosrun learn_service client.py

在这里插入图片描述

在这里插入图片描述


上述所有内容出处如下,博主在此基础上仅为添加个人理解:
本项目为北大团队出品【项目三:深度学习&仿真机器人 - 丘丘老师】原创(部分代码为开源代码)。课程团队:B站ID【M学长的考研top帮】UID【3546580235848566】复试项目班QQ大群:885884619,负责人QQ:674799975

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

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

相关文章

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…

鸿蒙开发案例002

1、目标需求 界面有增大字体按钮&#xff0c;每次点击增大字体按钮&#xff0c;“Hello ArkTS”都会变大 2、源代码 Entry Component struct Page {textValue: string Hello ArkTSState textSize: number 50myClick():void{this.textSize 4}build() {Row() {Column() {//…

stm32 FOC 电机介绍

今年开始学习foc控制无刷电机&#xff0c;这几天把所学整理一下&#xff0c;记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛&#xff0c;如无人机、机械臂、云台、仿生机器人等等。 需要什么基础&…

基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的大学生心理健康管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体…

MySQL安装及可视化工具SQLyog下载

编程如画&#xff0c;我是panda&#xff01; 最近学习Web开发的时候要用到数据库&#xff0c;一开始下载的ZIP版本的&#xff0c;还得修改配置文件&#xff0c;挺麻烦的&#xff0c;后来发现可以直接使用msi版的安装包疯狂next&#xff0c;所以就出一期教程。 前言 MySQL 是一…

Database__进阶

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724?spm1000.2115.3001.5343 &#x1f389; 主题&#xff1a; 数据库mysql&#xff08;高级部分&#xff09; ⏱️ 创作时间&#xff1a;2024年01月24…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及&#xff0c;越来越多的开发者和团队开始使用SVN&#xff08;Subversion&#xff09;来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程&#xff0c;帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

thymeleaf常用语法大全

有时候需要借鉴别人的代码&#xff0c;发现一个相似的功能点&#xff0c;但是自己的是html页面别人的是jsp页面&#xff0c;那如果不了解thymeleaf的话还是要费点功夫的。 什么是thymeleaf&#xff0c;通俗点&#xff0c;jsp中的${},以及jstl中的if标签什么的都不能用&#xf…

使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理 LlamaIndex的文档链接&#xff1a;Using LLMs - LlamaIndex &#x1f999; 0.9.33 LlamaIndex 的一般使用模式如下&#xff1a; 加载文档&#xff08;手动或通过数据加载器)将文档解析为节点构建索引&#xff08;来自节点或文档)&#xff08;可选&#xff0c;高级&…

2024年 IT 行业就业情况能否回春?很多人说道…

我只能说可以&#xff0c;以前我是看不到的。但是鸿蒙全栈自研让我重新看到希望&#xff01; 2024年1月18日&#xff0c;华为鸿蒙千帆启航发布会。讲到HarmonyOS NEXT作为原生鸿蒙&#xff0c;其系统底座全栈自研&#xff0c;去掉了传统的AOSP 代码&#xff08;“Android 开放…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中&#xff0c;快速插入参考文献 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的bib文件第二步&#xff1a;编辑overleaf模版方法二&#xff1a;EduBirdie生成参考文献&#xff08;补充&#xff09;使用LaTeX在Overleaf的IEEE会议…

杰卡德距离(Jaccard Distance)

杰卡德距离&#xff08;Jaccard Distance&#xff09;&#xff0c;是用于衡量两个集合差异性的一种指标&#xff0c;它是杰卡德相似系数的补集&#xff0c;可以用来区分集合&#xff08;如知识图谱&#xff09;。 杰卡德相似系数 杰卡德相似系数&#xff08;Jaccard similari…

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b1…

【MATLAB源码-第124期】基于matlab的GFDM系统(64QAM/QPSK调制)在AWGN和PA信道误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 广义频分复用&#xff08;GFDM&#xff09;是一种先进的信号调制技术&#xff0c;近年来在无线通信领域获得了广泛的关注。GFDM作为一种多载波调制方案&#xff0c;是对经典的正交频分复用&#xff08;OFDM&#xff09;技术的…

Java内存模型

主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则&#xff0c;即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量包括实例变量、静态字段和构成数组对象的元素&#xff0c;但不包括局部变量与方法参数&#xff0c;因为局部变…

什么是DMA?DMA究竟有多快!

原文来自公众号&#xff1a;工程师看海 直接内存访问&#xff08;Direct Memory Access&#xff0c;DMA&#xff09;&#xff1a;在计算机体系结构中&#xff0c;DMA 是一种数据传输方式&#xff0c;允许外部设备直接访问计算机的内存&#xff0c;而无需通过中央处理单元&#…

网络防御保护---防火墙USG6000V接口配置实验

一、实验拓扑 二、实验要求 1.防火墙向下使用子接口分别对应生产区和办公区 2.所有分区设备可以ping通网关 三、实验思路 1、配置各设备的IP地址 2、划分VLAN及VLAN的相关配置 3、配置路由及安全策略 四、实验配置 4.1、配置各设备IP地址 PC1配置 Client1配置 PC2配置…

maven搭建编程环境

Maven – Download Apache Mavenmaven下载官网地址下载后解压&#xff0c;配置系统环境变量&#xff0c; 新建系统变量&#xff0c;在系统path中配置%MAVEN396_HOME%\bincmd中输入mvn -version查询是否成功配置本地仓库地址 创建一个本地文件夹当做本地仓库&#xff0c;名字可以…

应用机器学习的建议 (Advice for Applying Machine Learning)

1.决定下一步做什么 问题&#xff1a; 假如&#xff0c;在你得到你的学习参数以后&#xff0c;如果你要将你的假设函数放到一组 新的房屋样本上进行测试&#xff0c;假如说你发现在预测房价时产生了巨大的误差&#xff0c;现在你的问题是要想改进这个算法&#xff0c;接下来应…

CMS如何调优

业务JVM频繁Full GC如何排查 原则是先止损&#xff0c;再排查。 FGC的原因是对象晋升失败或者并发模式失败&#xff0c;原因都是老年代放不下晋升的对象了。 1.可能是大对象导致的内存泄漏。快速排查方法&#xff1a;观察数据库网络IO是否和FGC时间点吻合&#xff0c;找到对应…