ros2相关代码记录

1.ros2概述

ROS2(Robot Operating System 2)是一个用于机器人应用程序的开源软件框架。它是ROS(Robot Operating System)的下一代版本,旨在改进和扩展原始ROS的特性,以适应更广泛的机器人应用场景和需求。ROS2的发展重点包括提高系统的实时性能、可靠性、可伸缩性和跨平台可移植性。

核心特点:

  1. 实时性能:ROS2设计考虑了实时系统要求,这对于自动驾驶汽车和工业自动化等应用至关重要。
  2. 跨平台:ROS2支持多种操作系统,如Linux、macOS、Windows,甚至包括RTOS(实时操作系统)。
  3. 可伸缩性:ROS2允许在不同规模的项目中使用,从单节点应用到大型分布式系统。
  4. 组件化:ROS2鼓励更模块化的软件设计,便于重用和替换系统中的各个部分。
  5. 安全性:ROS2提供了对安全通信的支持,这对于在安全关键型应用中部署至关重要。

主要组件:

  1. 核心组件
  • 通信:ROS2提供了一套先进的通信库,支持不同的通信模式,如发布/订阅、服务调用和动作通信。
  • 构建工具:ament是ROS2的构建系统,类似于ROS1中的catkin。colcon是用于构建ROS2项目的工具,它也可以构建其他基于CMake的项目。
  • 中间件:ROS2支持多种中间件,如DDS(Data Distribution Service),以提高系统的灵活性和性能。
  1. 机器人基础应用组件:这些组件包括感知、规划、控制等机器人功能模块。

  2. 扩展组件:提供调试、可视化和其他辅助功能,以支持开发和测试。

发展背景:

ROS1自2007年发布以来,在机器人研究社区中得到了广泛的应用。然而,随着机器人技术的进步和新的应用场景(如自动驾驶汽车)的出现,ROS1在实时性、可靠性和可伸缩性方面的局限性变得越来越明显。为了满足这些新的需求,ROS2应运而生。

转向ROS2的原因:

  • 性能需求:新的应用场景需要更高的性能和可靠性。
  • 标准化:ROS2遵循更现代的软件工程实践,支持更广泛的开发环境和工具。
  • 社区发展:为了维持和扩大ROS社区,需要一个能够适应未来发展的新平台。

ROS2的发展代表了机器人操作系统技术的进步,它为机器人开发者提供了一个更加健壮和灵活的平台,以支持从研究到商业应用的转换。

2.创建ros2 包

在dev_ws/src/下创建功能包learn

在dev_ws/下编译colcon build(编译工作空间下的所有)

Source install/local_setuo.bash

3.节点 (编写发布者&订阅者的代码)

节点在机器人系统中的职责就是执行某些具体的任务,从计算机操作系统的角度来看,也叫做进程;

每个节点都是一个可以独立运行的可执行文件,比如执行某一个python程序,或者执行C++编译生成的结果,都算是运行了一个节点;

4.话题

https://book.guyuehome.com/ROS2/2.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/2.4_%E8%AF%9D%E9%A2%98/

不需要写pub了,usb_cam会发布,我们只需要订阅相机的图片,然后处理检测可视化就行。

learning_topic/topic_webcam_pub.py

import rclpy                        # ROS2 Python接口库
from rclpy.node import Node         # ROS2 节点类
from sensor_msgs.msg import Image   # 图像消息类型
from cv_bridge import CvBridge      # ROS与OpenCV图像转换类
import cv2                          # Opencv图像处理库"""
创建一个发布者节点
"""
class ImagePublisher(Node):def __init__(self, name):super().__init__(name)                                           # ROS2节点父类初始化self.publisher_ = self.create_publisher(Image, 'image_raw', 10)  # 创建发布者对象(消息类型、话题名、队列长度)self.timer = self.create_timer(0.1, self.timer_callback)         # 创建一个定时器(单位为秒的周期,定时执行的回调函数)self.cap = cv2.VideoCapture(0)                                   # 创建一个视频采集对象,驱动相机采集图像(相机设备号)self.cv_bridge = CvBridge()                                      # 创建一个图像转换对象,用于稍后将OpenCV的图像转换成ROS的图像消息def timer_callback(self):ret, frame = self.cap.read()                         # 一帧一帧读取图像if ret == True:                                      # 如果图像读取成功self.publisher_.publish(self.cv_bridge.cv2_to_imgmsg(frame, 'bgr8')) # 发布图像消息self.get_logger().info('Publishing video frame')     # 输出日志信息,提示已经完成图像话题发布def main(args=None):                                 # ROS2节点主入口main函数rclpy.init(args=args)                            # ROS2 Python接口初始化node = ImagePublisher("topic_webcam_pub")        # 创建ROS2节点对象并进行初始化rclpy.spin(node)                                 # 循环等待ROS2退出node.destroy_node()                              # 销毁节点对象rclpy.shutdown()                                 # 关闭ROS2 Python接口

learning_topic/topic_webcam_sub.py

import rclpy                            # ROS2 Python接口库
from rclpy.node import Node             # ROS2 节点类
from sensor_msgs.msg import Image       # 图像消息类型
from cv_bridge import CvBridge          # ROS与OpenCV图像转换类
import cv2                              # Opencv图像处理库
import numpy as np                      # Python数值计算库lower_red = np.array([0, 90, 128])      # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])   # 红色的HSV阈值上限from paxini_object_detection import object_detect  # 我们写的在另外一个地方就行
"""
创建一个订阅者节点
"""
class ImageSubscriber(Node):def __init__(self, name):super().__init__(name)                                # ROS2节点父类初始化self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback, 10)   # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)self.cv_bridge = CvBridge()                           # 创建一个图像转换对象,用于OpenCV图像与ROS的图像消息的互相转换def object_detect(self, image):hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)      # 图像从BGR颜色模型转换为HSV模型mask_red = cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy = cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)   # 图像中轮廓检测for cnt in contours:                                  # 去除一些轮廓面积太小的噪声if cnt.shape[0] < 150:continue(x, y, w, h) = cv2.boundingRect(cnt)              # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)# 将苹果的轮廓勾勒出来cv2.circle(image, (int(x+w/2), int(y+h/2)), 5,(0, 255, 0), -1)                       # 将苹果的图像中心点画出来cv2.imshow("object", image)                           # 使用OpenCV显示处理后的图像效果cv2.waitKey(10)def listener_callback(self, data):self.get_logger().info('Receiving video frame')     # 输出日志信息,提示已进入回调函数image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')  # 将ROS的图像消息转化成OpenCV图像self.object_detect(image)                           # 苹果检测def main(args=None):                            # ROS2节点主入口main函数rclpy.init(args=args)                       # ROS2 Python接口初始化node = ImageSubscriber("topic_webcam_sub")  # 创建ROS2节点对象并进行初始化rclpy.spin(node)                            # 循环等待ROS2退出node.destroy_node()                         # 销毁节点对象rclpy.shutdown()                            # 关闭ROS2 Python接口
    entry_points={'console_scripts': ['topic_helloworld_pub  = learning_topic.topic_helloworld_pub:main','topic_helloworld_sub  = learning_topic.topic_helloworld_sub:main','topic_webcam_pub      = learning_topic.topic_webcam_pub:main','topic_webcam_sub      = learning_topic.topic_webcam_sub:main',],},

5.setup.py

from setuptools import setup
from setuptools import find_packagesPACKAGE_NAME = 'my_package'
DESCRIPTION = 'A short description of my package'
AUTHOR = 'My Name'
AUTHOR_EMAIL = 'my.name@example.com'
LICENSE = 'Apache License, Version 2.0'
URL = 'https://github.com/my_username/my_package'
VERSION = '1.0.0'setup(name=PACKAGE_NAME,                           # 设置软件包名称。version=VERSION,description=DESCRIPTION,author=AUTHOR,author_email=AUTHOR_EMAIL,license=LICENSE,url=URL,packages=find_packages(exclude=['test']),     # 设置将要安装的 Python 包。install_requires=[                         # 设置软件包安装时必需的 Python 包列表。'setuptools',                # 必需的包,即 setuptools。'numpy',                    # 必需的包,即 numpy。'cython'],entry_points={                            # 设置命令行脚本入口点的字典。'console_scripts': [                    # 设置命令行脚本的类别。'my_script = my_package.my_script:main' #  命令行脚本名称和对应的 Python 模块和方法名称。],},zip_safe=True #  确定软件包在安装后是否以压缩文件形式分发,如果是,则设为 True,
)

6.rclpy.spin(node)

  • 接收到新的消息或服务请求时,会调用回调函数。

  • 定期计时器触发时,会调用回调函数。

  • 检查是否有调用回调函数等待的期间内新的客户端连接,如果有,会调用回调函数。

7.编译

Colcon build

. install/setup.bash

Ros run pkgname nodename

8.publish rgb 然后yolo目标检测

import rclpy                            # ROS2 Python接口库
from rclpy.node import Node             # ROS2 节点类
from sensor_msgs.msg import Image       # 图像消息类型
from cv_bridge import CvBridge          # ROS与OpenCV图像转换类
import cv2                              # Opencv图像处理库
import numpy as np                      # Python数值计算库          lower_red = np.array([0, 90, 128])      # 红色的HSV阈值下限
upper_red = np.array([180, 255, 255])   # 红色的HSV阈值上限
import open3d 
from paxini_object_detection import paxini_3d_object_detect  # 我们写的在另外一个地方就行
"""
创建一个订阅者节点
"""
class ImageSubscriber(Node):def __init__(self, name):super().__init__(name)                                # ROS2节点父类初始化self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback, 10)   # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)self.cv_bridge = CvBridge()                           # 创建一个图像转换对象,用于OpenCV图像与ROS的图像消息的互相转换self.3d_detect = paxini_3d_object_detect()def object_detect(self, image):rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV)      # 图像从BGR颜色模型转换为HSV模型dep = cv2.cvtColor(dep, cv2.COLOR_BGR2HSV)      # 图像从BGR颜色模型转换为HSV模型# 转点云# detectresult = self.3d_detect(points,model_weights)cv2.imshow("object", image)                           # 使用OpenCV显示处理后的图像效果cv2.waitKey(10)def listener_callback(self, data):self.get_logger().info('Receiving video frame')     # 输出日志信息,提示已进入回调函数rgb = self.cv_bridge.imgmsg_to_cv2(data[0], 'bgr8')  # 将ROS的图像消息转化成OpenCV rgbdep = self.cv_bridge.imgmsg_to_cv2(data[1], 'bgr8')  # 将ROS的图像消息转化成OpenCV depthself.object_detect(rgb ,dep )                           # 检测def main(args=None):                            # ROS2节点主入口main函数rclpy.init(args=args)                       # ROS2 Python接口初始化node = ImageSubscriber("topic_webcam_sub")  # 创建ROS2节点对象并进行初始化rclpy.spin(node)                            # 循环等待ROS2退出node.destroy_node()                         # 销毁节点对象rclpy.shutdown()                            # 关闭ROS2 Python接口

ros订阅深度图

import rclpy
from rclpy.node import Nodefrom std_msgs.msg import String
import std_msgs.msg
from sensor_msgs.msg import Imageimport numpy as np
import cv2class Image_saver(Node):def __init__(self):# 订阅了5个主题,4个方向的相机和一个键盘按键super().__init__('subscriber')self.count = 0self.save_path = '/home/robot/test_hyx/calibration_images/'self.dir_list = ['front/', 'right/', 'left/']self.subscription1 = self.create_subscription(Image,'front_camera_topic',self.listener_callback1,10)self.subscription2 = self.create_subscription(Image,'right_camera_topic',self.listener_callback2,10)self.subscription3 = self.create_subscription(Image,'left_camera_topic',self.listener_callback3,10)##        self.subscription4 = self.create_subscription(
##            Image,
##            'back_camera_topic',
##            self.listener_callback4,
##            10)#self.subscription # prevent unused variable warningself.keyboard = self.create_subscription(std_msgs.msg.UInt32,'key_pressed',self.keyboard_callback,10)#self.keyboardself.cache = []for _ in range(3):self.cache.append(None)def listener_callback1(self, msg):self.cache[0] = (msg.height, msg.width, msg.data) # 把数据放入cache里面def listener_callback2(self, msg):self.cache[1] = (msg.height, msg.width, msg.data)def listener_callback3(self, msg):self.cache[2] = (msg.height, msg.width, msg.data)##    def listener_callback4(self, msg):
##        self.cache[3] = (msg.height, msg.width, msg.data)def keyboard_callback(self, msg): # 按下键盘开始保存if msg.data == 32:for i in range(3):save_path = self.save_path + self.dir_list[i]+'%04d.jpg'%self.countimg = np.array(self.cache[i][2],dtype=np.uint8)img = img.reshape(self.cache[i][0], self.cache[i][1], 3)img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)if i == 0:img = cv2.flip(img, 0)img = cv2.flip(img, 1)#print(save_path)#print(img)cv2.imwrite(save_path, img)print('images saved!')self.count += 1def main(args=None):rclpy.init(args=args)img_saver = Image_saver()rclpy.spin(img_saver)# Destroy the node explicitly# (optional - otherwise it will be done automatically# when the garbage collector destroys the node object)minimal_subscriber.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

键盘按键的发布者:

import sys# pynput throws an error if we import it before $DISPLAY is set on LINUX
from pynput.keyboard import KeyCodeif sys.platform not in ('darwin', 'win32'):import osos.environ.setdefault('DISPLAY', ':0')from pynput import keyboardimport rclpy
from rclpy.parameter import Parameter
import std_msgs.msgclass KeystrokeListen:def __init__(self, name=None):self.node = rclpy.create_node(name or type(self).__name__)self.node.declare_parameter('exit_on_esc',True)self.pub_glyph = self.node.create_publisher(std_msgs.msg.String, 'glyphkey_pressed', 10)# todo: when ROS2 supports Enums, use them: https://github.com/ros2/rosidl/issues/260# 上面订阅的是下面的空格键self.pub_code = self.node.create_publisher(std_msgs.msg.UInt32, 'key_pressed_calib', 10)if self.exit_on_esc:self.logger.info('To end this node, press the escape key')def spin(self):# keyboard.Listener创建一个键盘监听器,将self.on_press和self.on_release方法分别作为按下和释放键的回调函数with keyboard.Listener(on_press=self.on_press, on_release=self.on_release) as listener:# rclpy.spin_once方法以处理ROS2的回调函数,同时检查监听器是否仍在运行。若监听器运行并且ROS2节点正常运行,则继续循环。while rclpy.ok() and listener.running:rclpy.spin_once(self.node, timeout_sec=0.1)@propertydef logger(self):return self.node.get_logger()@propertydef exit_on_esc(self):param = self.node.get_parameter('exit_on_esc')if param.type_ != Parameter.Type.BOOL:new_param = Parameter('exit_on_esc', Parameter.Type.BOOL, True)self.logger.warn('Parameter {}={} is a {} but expected a boolean. Assuming {}.'.format(param.name,param.value,param.type_,new_param.value),once=True)self.node.set_parameters([new_param])param = new_paramvalue = param.valueassert isinstance(value, bool)return valuedef on_release(self, key):# todo: implement thispassdef on_press(self, key):try:char = getattr(key, 'char', None)if isinstance(char, str):#self.logger.info('pressed ' + char)self.pub_glyph.publish(self.pub_glyph.msg_type(data=char)) # 发布key字符串else:try:# known keys like spacebar, ctrlname = key.namevk = key.value.vkexcept AttributeError:# unknown keys like headphones skip song buttonname = 'UNKNOWN'vk = key.vk#self.logger.info('pressed {} ({})'.format(name, vk))# todo: These values are not cross-platform. When ROS2 supports Enums, use them insteadself.pub_code.publish(self.pub_code.msg_type(data=vk)) # 发布空格key?except Exception as e:self.logger.error(str(e))raiseif key == keyboard.Key.esc and self.exit_on_esc:self.logger.info('stopping listener')raise keyboard.Listener.StopExceptiondef main(args=None):rclpy.init(args=args)KeystrokeListen().spin()if __name__ == '__main__':main()

订阅深度图和RGB

import rclpy
from rclpy.node import Nodefrom std_msgs.msg import String
import std_msgs.msg
from sensor_msgs.msg import Imageimport numpy as np
import cv2class Image_saver(Node):def __init__(self,name):# 订阅了5个主题,4个方向的相机和一个键盘按键super().__init__('subscriber')self.count = 0self.save_path = '/home/robot/test_hyx/calibration_images/'self.subscription1 = self.create_subscription(Image,'ps_pub_depth_image_01',self.listener_callback1,10)self.subscription2 = self.create_subscription(Image,'ps_pub_color_image_01',self.listener_callback2,10)self.keyboard = self.create_subscription(std_msgs.msg.UInt32,'key_pressed',self.keyboard_callback,10)#self.keyboardself.cache = []for _ in range(2):self.cache.append(None)def listener_callback1(self, msg): # depself.cache[0] = (msg.height, msg.width, msg.data) # 把数据放入cache里面def listener_callback2(self, msg): # rgbself.cache[1] = (msg.height, msg.width, msg.data)def keyboard_callback(self, msg): # 按下键盘开始保存if msg.data == 32:save_dep_path = self.save_path + 'dep/'+'%04d.jpg'%self.countsave_rgb_path = self.save_path + 'rgb/'+'%04d.jpg'%self.countdep_img = np.array(self.cache[0][2],dtype=np.uint16)rgb_img = np.array(self.cache[1][2],dtype=np.uint8)rgb_img = rgb_img .reshape(self.cache[1][0], self.cache[1][1], 3)dep_img = rgb_img .reshape(self.cache[0][0], self.cache[0][1], 1)rgb_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR)cv2.imwrite(save_rgb_path , rgb_img )cv2.imwrite(save_dep_path , dep_img )print('-------images saved!------')self.count += 1def main(args=None):rclpy.init(args=args)# depth_img_saver = Image_saver('depth_img_saver = Image_saver()')depth_img_saver = Image_saver()rclpy.spin(depth_img_saver )minimal_subscriber.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()
  entry_points={'console_scripts': ['topic_depth_rgb_sub      = paxini_robot_topic.topic_depth_rgb_sub:main',],},

订阅rgb同时2D监测+6d位姿估计并且发布结果

import rclpy  # ROS2 Python接口库
from rclpy.node import Node  # ROS2 节点类
from sensor_msgs.msg import Image  # 图像消息类型
from cv_bridge import CvBridge  # ROS与OpenCV图像转换类
import cv2  # Opencv图像处理库
import numpy as np  # Python数值计算库
from std_msgs.msg import Float64MultiArray
import zebra_pose_es  # 我们写的在另外一个地方就行class ImageSubscriber(Node):def __init__(self, name):super().__init__(name)  # ROS2节点父类初始化self.sub = self.create_subscription(Image, 'image_raw', self.listener_callback,10)  # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)self.cv_bridge = CvBridge()  # 创建一个图像转换对象,用于OpenCV图像与ROS的图像消息的互相转换self.detect = zebra_pose_es()self.publisher_ = self.create_publisher(Float64MultiArray, 'pose_res', 10)  # 创建发布者对象(消息类型,话题名,队列长度)def publish_result(self, result):msg = Float64MultiArray()msg.data = result.flatten()   # 将结果展平为一维数组self.publisher_.publish(msg)  # 发布结果消息def object_detect(self, rgb):rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV)  # 图像从BGR颜色模型转换为HSV模型result = self.detect(rgb)# cv2.imshow("object", rgb)  # 使用OpenCV显示处理后的图像效果# cv2.waitKey(10)self.publish_result(result)  # 如何处理多个结果def listener_callback(self, data):self.get_logger().info('Receiving video frame')  # 输出日志信息,提示已进入回调函数rgb = self.cv_bridge.imgmsg_to_cv2(data[0], 'bgr8')  # 将ROS的图像消息转化成OpenCV rgbself.object_detect(rgb)  # 检测def main(args=None):  # ROS2节点主入口main函数rclpy.init(args=args)  # ROS2 Python接口初始化node = ImageSubscriber("topic_webcam_sub")  # 创建ROS2节点对象并进行初始化rclpy.spin(node)  # 循环等待ROS2退出node.destroy_node()  # 销毁节点对象rclpy.shutdown()  # 关闭ROS2 Python接口

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

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

相关文章

Unity 实现鼠标左键进行射击

发射脚本实现思路 分析 确定用户交互方式&#xff1a;通过鼠标左键点击发射子弹。确定子弹发射逻辑&#xff1a;每次点击后有一定时间间隔才能再次发射。确定子弹发射源和方向&#xff1a;子弹从枪口&#xff08;Transform&#xff09;位置发射&#xff0c;沿枪口方向前进。 变…

Qt扫盲-QAssisant 集成其他qch帮助文档

QAssisant 集成其他qch帮助文档 一、概述二、Cmake qch例子1. 下载 Cmake.qch2. 添加qch1. 直接放置于Qt 帮助的目录下2. 在 QAssisant中添加 一、概述 QAssisant是一个很好的帮助文档&#xff0c;他提供了供我们在外部添加新的 qch帮助文档的功能接口&#xff0c;一般有两中添…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

李宏毅【生成式AI导论 2024】第6讲 大型语言模型修炼_第一阶段_ 自我学习累积实力

背景知识:机器怎么学会做文字接龙 详见:https://blog.csdn.net/qq_26557761/article/details/136986922?spm=1001.2014.3001.5501 在语言模型的修炼中,我们需要训练资料来找出数十亿个未知参数,这个过程叫做训练或学习。找到参数后,我们可以使用函数来进行文字接龙,拿…

【数据分析面试】3.编写数据选取函数(Python)

题目 给定了一个名为 students_df 的学生数据表格 nameagefavorite_colorgradeTim Voss19red91Nicole Johnson20yellow95Elsa Williams21green82John James20blue75Catherine Jones23green93 编写一个名为 grades_colors 的函数&#xff0c;以选择仅当学生喜欢的颜色是绿色或…

2024最新Guitar Pro 8.1中文版永久许可证激活

Guitar Pro是一款非常受欢迎的音乐制作软件&#xff0c;它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件&#xff0c;在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#x…

ESCTF-密码赛题WP

*小学生的爱情* Base64解码获得flag *中学生的爱情* 社会主义核心价值观在线解码得到flag http://www.atoolbox.net/Tool.php?Id850 *高中生的爱情* U2FsdG开头为rabbit密码,又提示你密钥为love。本地toolfx密码工具箱解密。不知道为什么在线解密不行。 *大学生的爱情* …

jira安装与配置

1. 环境准备 环境要求 1) JDK1.8以上环境配置 2) Mysql数据库5.7.13 3) Jira版本7及破解包 1.1 JDK1.8安装配置 1) 首先下载 JDK1.8&#xff0c; - 网址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html - windows64 版&am…

机器学习优化算法(深度学习)

目录 预备知识 梯度 Hessian 矩阵&#xff08;海森矩阵&#xff0c;或者黑塞矩阵&#xff09; 拉格朗日中值定理 柯西中值定理 泰勒公式 黑塞矩阵&#xff08;Hessian矩阵&#xff09; Jacobi 矩阵 优化方法 梯度下降法&#xff08;Gradient Descent&#xff09; 随机…

Pytorch的hook函数

hook函数是勾子函数&#xff0c;用于在不改变原始模型结构的情况下&#xff0c;注入一些新的代码用于调试和检验模型&#xff0c;常见的用法有保留非叶子结点的梯度数据&#xff08;Pytorch的非叶子节点的梯度数据在计算完毕之后就会被删除&#xff0c;访问的时候会显示为None&…

STM32CubeMX学习笔记28---FreeRTOS软件定时器

一、软件定时器简介 1 、基本概念 定时器&#xff0c;是指从指定的时刻开始&#xff0c;经过一个指定时间&#xff0c;然后触发一个超时事件&#xff0c;用户 可以自定义定时器的周期与频率。类似生活中的闹钟&#xff0c;我们可以设置闹钟每天什么时候响&#xff0c; 还能设置…

Unity | 工具类-UV滚动

一、内置渲染管线Shader Shader"Custom/ImageRoll" {Properties {_MainTex ("Main Tex", 2D) "white" {}_Width ("Width", float) 0.5_Distance ("Distance", float) 0}SubShader {Tags {"Queue""Trans…

2024.3.28学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p286-p294 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些…

Day24|回溯算法part01:理论基础、77. 组合

理论基础 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数的集合里有多少符合条件的子集排列问题&#xff1a;N个数…

如何通过vscode连接到wsl

下载wsl扩展 远程连接模式

go的通信Channel

go的通道channel是用于协程之间数据通信的一种方式 一、channel的结构 go源码&#xff1a;GitHub - golang/go: The Go programming language src/runtime/chan.go type hchan struct {qcount uint // total data in the queue 队列中当前元素计数&#xff0c;…

专题二_滑动窗口(2)

目录 1658. 将 x 减到 0 的最小操作数 解析 题解 904. 水果成篮 解析 题解 1658. 将 x 减到 0 的最小操作数 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int minOperations(vector<int>& num…

MPDataDoc类介绍

MPDataDoc类介绍 使用mp数据库新接口mp_api.client.MPRester获取数据&#xff0c;例子如下&#xff1a; from mp_api.client import MPResterwith MPRester(API_KEY) as mpr:docs mpr.summary.search(material_ids["mp-1176451", "mp-561113"])以上代码返…

Java抽象类详解:定义、特性与实例化限制(day12)

抽象类 总结一下今天老师上课的内容&#xff0c;前面几节课听得是有点懵&#xff0c;在讲到内存问题&#xff0c;也就是代码在栈、堆、以及方法区是怎么执行的&#xff0c;听得不是很懂&#xff0c;今天讲到抽象类以及重写的机制&#xff0c;似乎开始慢慢懂得了java的底层原理…