ros2 launch 用法以及一些基础功能函数的示例
文章目录
- launch
- 启动一个节点的launch示例
- launch文件中添加节点的namespace
- launch文件中的话题名称映射
- launch文件中向节点内传入命令行参数
- launch文件中向节点内传入rosparam
- 使用方法
- 多节点启动
- 命令行参数配置
- 资源重映射
- ROS参数设置
- 加载参数文件
- 在launch文件中使用条件变量
- action的分组
- action的启动延时控制
- Launch文件包含,在launch文件中调用另一个launch文件
- 在launch文件中运行脚本
- 在launch文件中设置环境变量或读取环境变量
- launch 用法以及一些基础功能函数的示例
- 参数文件编译配置
launch
##前言
ros2 launch文件中最主要的概念是action,ros2 launch把每一个要执行的节点,文件,脚本,功能等全部抽象成action,用统一的接口来控制其启动,最主要的结构是:
def generate_launch_description():return LaunchDescription([action_1,action_2,...action_n])
要启动的节点或其他launch文件全部都传入LaunchDescription()
函数中,该函数中接受一个或多launch.actions
或launch_ros.actions
类型的对象,以下列举一下常用的action:
launch_ros.actions.Node· 此函数功能是启动一个ros2节点;
launch_ros.actions.PushRosNamespace· 此函数功能是给一个节点或组设置命名空间;
launch.actions.IncludeLaunchDescription· 此函数功能是直接引用另一个launch文件;
launch.actions.SetLaunchConfiguration· 此函数功能是在launch文件内声明一个参数,并给定参数值;
launch.actions.SetEnvironmentVariable· 此函数功能是声明一个环境变量并给定环境变量的值;
launch.actions.AppendEnvironmentVariable· 此函数将对一个环境变量追加一个值,如果不存在则创建;
launch.actions.DeclareLaunchArgument· 此函数功能是声明一个启动描述参数,该参数具有名称、默认值和文档;
launch.actions.TimerAction· 此函数功能是在一段时间后执行一个或多个action;
launch.actions.GroupAction· 此函数功能是将action分组,同组内的action可以统一设定参数方便集中管理;
launch.actions.ExecuteProcess· 此函数功能是根据输入执行一个进程或脚本;
launch.actions.EmitEvent· 此函数功能是发出一个事件,触发以注册的事件函数被调用;
launch.actions.RegisterEventHandler· 此函数功能是注册一个事件;
launch.actions.UnregisterEventHandler· 此函数功能是删除一个注册过的事件;
启动一个节点的launch示例
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen')])
或者:
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():action_1 = Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen')return LaunchDescription([action_1])
launch文件名为test.launch.py,调用launch文件启动节点:
ros2 launch ros2_test test.launch.py
launch文件中添加节点的namespace
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen',namespace='my_ros2_test')])
设置了namespace后,此节点的话题前会加上namespace的前缀,例如原来的话题名称’/test’,设置后变为’/my_ros2_test/test’
注意,有以下情况namespace无效:
节点本来就已经有了namespace了,后续会介绍将节点分组,整组节点可以设置统一的namespace,此时如果有个节点已经设置过namespace,则在此设置不会生效;
定义发布节点的时候,topic名字的前面加上了符号/;
launch文件中的话题名称映射
话题映射的字段是remappings,语法示例如下:
remappings=[('src1', 'dest1'),('src2', 'dest2'),...
]
如果需要话题名称映射的话要将该字段加入到节点的函数内,假如节点内有个test1话题要映射到test2,示例如下:
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",remappings=[("test1", "test2")])])
launch文件中向节点内传入命令行参数
参数字段是arguments,语法示例如下:
arguments=['arg1', 'arg2', ...]
如果需要向ros2_test_publisher_node节点中传入命令行参数,示例如下:
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",arguments=['arg1', 'arg2'])])
传入的参数可以从节点启动时main函数中的argc参数获取到参数个数,argv参数获取到参数内容,详情参考c++的命令行参数获取;
launch文件中向节点内传入rosparam
字段是parameter,语法示例如下:
parameters=[{'port': '/dev/ttyUsb0'},...
]
如果需要在launch文件中发布某个节点空间下的parameter,示例如下:
from launch import LaunchDescription
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",parameter=[{'port': '/dev/ttyUSB0'}])])
如果需要参数的值可以从外部调用launch文件时灵活更改,则可以使用变量的形式作为参数的值,在文件中给定默认值,若外部给定则以外部给定的值为准,若外部不给则以默认值为准:
port_var = LaunchConfiguration('port', default='/dev/ttyS1')
同时还可以使用DeclareLaunchArgument函数增加对参数的描述,增加描述后可以通过ros2 launch的命令行工具展示出每个launch文件中有哪些rosparam以及他的默认值和具体含义:
DeclareLaunchArgument('port',default_value=port_var,description='This is the port address value'
)
如果文件中加入了参数介绍则可以通过以下指令看到launch文件中有哪些可以自定义的参数以及参数含义:
ros2 launch ros2_test test.launch.py --show-args
所以如果launch文件中存在可配置参数,应该在LaunchDescription中添加DeclareLaunchArgument,让其他使用者明白变量名,以及他的含义是什么;
完整的launch文件如下:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import LaunchConfigurationdef generate_launch_description():port_var = LaunchConfiguration('port', default='/dev/ttyS1')return LaunchDescription([DeclareLaunchArgument('port',default_value=port_var,description='This is the port address value'),Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",parameter=[{'port': port_var}])])
此时我们可以把参数通过调用launch的时候传入到节点中:
ros2 launch ros2_test test.launch.py port_var:=/dev/ttyUSB2
在ros2_test_publisher_node节点中如果要想获取该参数,需要先声明parameter,然后再进行get:
this->declare_parameter<std::string>("port");
string port_str;
this->get_parameter_or<std::string>("port", port_str, "null");
if (port_str != "null") RCLCPP_INFO(this->get_logger(), "get ros2param port value : %s", port_str.c_str());
使用方法
官方推荐用python编写launch,如果launch文件不在功能包中,随便建立以.launch.py结尾的文件后,在当前目录直接运行即可,如果在功能包中可采用下面方式运行。如下代码。
ros2 launch turtlesim_mimic_launch.py # 在文件中直接启动launch
ros2 launch <package_name> <launch_file_name> # 在功能包中启动launch
文件内容实例如下:
from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数return LaunchDescription([ # 返回launch文件的描述信息Node( # 配置一个节点的启动package='learning_topic', # 节点所在的功能包executable='topic_helloworld_pub', # 节点的可执行文件),Node( # 配置一个节点的启动package='learning_topic', # 节点所在的功能包executable='topic_helloworld_sub', # 节点的可执行文件名),])
多节点启动
from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数return LaunchDescription([ # 返回launch文件的描述信息Node( # 配置一个节点的启动package='learning_topic', # 节点所在的功能包executable='topic_helloworld_pub', # 节点的可执行文件),Node( # 配置一个节点的启动package='learning_topic', # 节点所在的功能包executable='topic_helloworld_sub', # 节点的可执行文件名),])
命令行参数配置
import osfrom ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数rviz_config = os.path.join( # 找到配置文件的完整路径get_package_share_directory('learning_launch'),'rviz','turtle_rviz.rviz')return LaunchDescription([ # 返回launch文件的描述信息Node( # 配置一个节点的启动package='rviz2', # 节点所在的功能包executable='rviz2', # 节点的可执行文件名name='rviz2', # 对节点重新命名arguments=['-d', rviz_config] # 加载命令行参数)])
资源重映射
from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数return LaunchDescription([ # 返回launch文件的描述信息Node( # 配置一个节点的启动package='turtlesim', # 节点所在的功能包namespace='turtlesim1', # 节点所在的命名空间executable='turtlesim_node', # 节点的可执行文件名name='sim' # 对节点重新命名),Node( # 配置一个节点的启动package='turtlesim', # 节点所在的功能包namespace='turtlesim2', # 节点所在的命名空间executable='turtlesim_node', # 节点的可执行文件名name='sim' # 对节点重新命名),Node( # 配置一个节点的启动package='turtlesim', # 节点所在的功能包executable='mimic', # 节点的可执行文件名name='mimic', # 对节点重新命名remappings=[ # 资源重映射列表('/input/pose', '/turtlesim1/turtle1/pose'), # 将/input/pose话题名修改为/turtlesim1/turtle1/pose('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'), # 将/output/cmd_vel话题名修改为/turtlesim2/turtle1/cmd_vel])])
ROS参数设置
from launch import LaunchDescription # launch文件的描述类
from launch.actions import DeclareLaunchArgument # 声明launch文件内使用的Argument类
from launch.substitutions import LaunchConfiguration, TextSubstitutionfrom launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数background_r_launch_arg = DeclareLaunchArgument('background_r', default_value=TextSubstitution(text='0') # 创建一个Launch文件内参数(arg)background_r)background_g_launch_arg = DeclareLaunchArgument('background_g', default_value=TextSubstitution(text='84') # 创建一个Launch文件内参数(arg)background_g)background_b_launch_arg = DeclareLaunchArgument('background_b', default_value=TextSubstitution(text='122') # 创建一个Launch文件内参数(arg)background_b)return LaunchDescription([ # 返回launch文件的描述信息background_r_launch_arg, # 调用以上创建的参数(arg)background_g_launch_arg,background_b_launch_arg,Node( # 配置一个节点的启动package='turtlesim',executable='turtlesim_node', # 节点所在的功能包name='sim', # 对节点重新命名parameters=[{ # ROS参数列表'background_r': LaunchConfiguration('background_r'), # 创建参数background_r'background_g': LaunchConfiguration('background_g'), # 创建参数background_g'background_b': LaunchConfiguration('background_b'), # 创建参数background_b}]),])
加载参数文件
import osfrom ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类def generate_launch_description(): # 自动生成launch文件的函数config = os.path.join( # 找到参数文件的完整路径get_package_share_directory('learning_launch'),'config','turtlesim.yaml')return LaunchDescription([ # 返回launch文件的描述信息Node( # 配置一个节点的启动package='turtlesim', # 节点所在的功能包executable='turtlesim_node', # 节点的可执行文件名namespace='turtlesim2', # 节点所在的命名空间name='sim', # 对节点重新命名parameters=[config] # 加载参数文件)])
在launch文件中使用条件变量
字段是condition,语法示例如下:
condition=IfCondition(variable)
IfCondition(variable)
函数内只接受true, false, 0, 1参数,如果节点启动的描述中加入该字段并且参数值为false或0则节点不启动
完整的launch文件如下:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.conditions import IfConditiondef generate_launch_description():variable = LaunchConfiguration('start_flag', default='true')return LaunchDescription([DeclareLaunchArgument('start_flag',default_value=variable,description='This is the ros2_test_publisher_node start flag'),Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",condition=IfCondition(variable))])
此时
运行:ros2 launch ros2_test test.launch.py
节点会正常启动
运行:ros2 launch ros2_test test.launch.py start_flag:=false
节点不会启动
进阶的IfCondition函数使用方式:
由于LaunchConfiguration()
函数的返回是一个对象,所以我们不可以拿来直接做运算,但是可以使用PythonExpression()
做参数的表达式运算,语法如下:
PythonExpression([variable, '== 1']) 或
PythonExpression([variable, '+ 1 == 2']) 或
PythonExpression([variable, "== 'test'"]) 等等
完整的launch文件如下:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.conditions import IfConditiondef generate_launch_description():port_var = LaunchConfiguration('port', default='/dev/ttyS1')return LaunchDescription([DeclareLaunchArgument('port',default_value=port_var,description='This is the port address value'),Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output="screen",condition=IfCondition(PythonExpression([port_var, "== '/dev/ttyUSB0'"])))])
此时
运行:ros2 launch ros2_test test.launch.py
节点不会启动
运行:ros2 launch ros2_test test.launch.py port_var:=/dev/ttyUSB0
节点正常启动
action的分组
GroupAction()
:函数可以将一个或多个action加入到一个组中,组内可以共用参数,控制整组节点全部启动或全部不启动等,方便action的管理,需要接受的部分参数有:
- actions:接受一个list, [action_1, action_2,…],列表中装要执行的action
- condition:条件变量参数
- launch_configuration:参数
PushRosNamespace()
函数的作用是向test_group中设置组内的namespace,但是action_1中已经设置过了namespace,所以此时不会生效,该namespace只会在action_2中生效;
实例一:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import GroupAction
from launch_ros.actions import PushRosNamespacedef generate_launch_description():action_1 = Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen',namespace='my_ros2_test')action_2 = Node(package='ros2_test',executable='ros2_test_subscriber_node',name='ros2_test_subscriber_node',output='screen')test_group = GroupAction(actions=[PushRosNamespace("my_group_test"),action_1, action_2])return LaunchDescription([test_group])
action的启动延时控制
TimerAction()
:函数可以在指定的时间后执行一个action,需要接受参数有
- period:接受一个float, 延迟的时间
- actions:接受一个list, [action_1, action_2,…],列表中装要执行的action
实例一:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import TimerActiondef generate_launch_description():action_1 = Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen')return LaunchDescription([TimerAction(period=5.0, actions=[action_1])])
Launch文件包含,在launch文件中调用另一个launch文件
PythonLaunchDescriptionSource()
:在launch文件中调用其他launch需要调用函数,参数是被调用launch的路径。
实例一:
import osfrom ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法from launch import LaunchDescription # launch文件的描述类
from launch.actions import IncludeLaunchDescription # 节点启动的描述类
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.actions import GroupAction # launch文件中的执行动作
from launch_ros.actions import PushRosNamespace # ROS命名空间配置def generate_launch_description(): # 自动生成launch文件的函数parameter_yaml = IncludeLaunchDescription( # 包含指定路径下的另外一个launch文件PythonLaunchDescriptionSource([os.path.join(get_package_share_directory('learning_launch'), 'launch'),'/parameters_nonamespace.launch.py']))parameter_yaml_with_namespace = GroupAction( # 对指定launch文件中启动的功能加上命名空间actions=[PushRosNamespace('turtlesim2'),parameter_yaml])return LaunchDescription([ # 返回launch文件的描述信息parameter_yaml_with_namespace])
实例二:
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='ros2_test',executable='ros2_test_publisher_node',name='ros2_test_publisher_node',output='screen'),PythonLaunchDescriptionSource(os.path.join(get_package_share_directory('ros2_test'),'launch/test_subscriber.launch.py'))])
实例三:
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import ThisLaunchFileDir
from launch.conditions import IfCondition
from launch.substitutions import LaunchConfiguration
from launch.actions import IncludeLaunchDescriptiondef generate_launch_description():inlucde_other_file = LaunchConfiguration('inlucde_other_file', default='true')test_var = LaunchConfiguration('test_var', default='test_var_2')return launch.LaunchDescription([IncludeLaunchDescription(PythonLaunchDescriptionSource([ThisLaunchFileDir(), '/test_subscriber.launch.py']),condition=IfCondition(inlucde_other_file),launch_arguments={'test_var': test_var}.items())])
在launch文件中运行脚本
ExecuteProcess()
:运行脚本同样可实现启动某个节点,同时该函数还支持condition、additional_env等参数的设置。
实例一:
from launch import LaunchDescription
from launch.actions import ExecuteProcessdef generate_launch_description():return LaunchDescription([ExecuteProcess(cmd=['ros2', 'run', 'ros2_test', 'ros2_test_publisher_node'],output="screen")])
在launch文件中设置环境变量或读取环境变量
SetEnvironmentVariable(var_name, var_value)
:函数用于设置环境变量,接受两个参数分别是要设置的环境变量名称和环境变量的值;
EnvironmentVariable(var_name)
:函数用于获取环境变量的值,返回值类型是一个对象,输入参数是要获取的环境变量名称;
完整launch文件实例:
from launch import LaunchDescription
from launch.actions import SetEnvironmentVariable, ExecuteProcess
from launch.substitutions import EnvironmentVariabledef generate_launch_description():return LaunchDescription([SetEnvironmentVariable('PRODUCT_MODEL', 'spray_robot'),ExecuteProcess(cmd=['echo', EnvironmentVariable('PRODUCT_MODEL')],output='screen')])
运行看到以下输出
[INFO] [echo-1]: process started with pid [195168]
[echo-1] spray_robot
[INFO] [echo-1]: process has finished cleanly [pid 195168]
launch 用法以及一些基础功能函数的示例
ros2 launch文件中最主要的概念是action,ros2 launch把每一个要执行的节点,文件,脚本,功能等全部抽象成action,用统一的接口来控制其启动,最主要的结构是:
def generate_launch_description():return LaunchDescription([action_1,action_2,...action_n])
要启动的节点或其他launch文件全部都传入LaunchDescription()
函数中,该函数中接受一个或多launch.actions
或launch_ros.actions
类型的对象,以下列举一下常用的action:
launch_ros.actions.Node· 此函数功能是启动一个ros2节点;
launch_ros.actions.PushRosNamespace· 此函数功能是给一个节点或组设置命名空间;
launch.actions.IncludeLaunchDescription· 此函数功能是直接引用另一个launch文件;
launch.actions.SetLaunchConfiguration· 此函数功能是在launch文件内声明一个参数,并给定参数值;
launch.actions.SetEnvironmentVariable· 此函数功能是声明一个环境变量并给定环境变量的值;
launch.actions.AppendEnvironmentVariable· 此函数将对一个环境变量追加一个值,如果不存在则创建;
launch.actions.DeclareLaunchArgument· 此函数功能是声明一个启动描述参数,该参数具有名称、默认值和文档;
launch.actions.TimerAction· 此函数功能是在一段时间后执行一个或多个action;
launch.actions.GroupAction· 此函数功能是将action分组,同组内的action可以统一设定参数方便集中管理;
launch.actions.ExecuteProcess· 此函数功能是根据输入执行一个进程或脚本;
launch.actions.EmitEvent· 此函数功能是发出一个事件,触发以注册的事件函数被调用;
launch.actions.RegisterEventHandler· 此函数功能是注册一个事件;
launch.actions.UnregisterEventHandler· 此函数功能是删除一个注册过的事件;
参数文件编译配置
功能包里面的参数文件,需要在setup.py里面做以下配置,编译的时候才能拷贝到include里面去
from setuptools import setup
import os
from glob import globpackage_name = 'learning_launch'setup(name=package_name,version='0.0.0',packages=[package_name],data_files=[('share/ament_index/resource_index/packages',['resource/' + package_name]),('share/' + package_name, ['package.xml']),(os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),(os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))),(os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),],install_requires=['setuptools'],zip_safe=True,maintainer='hcx',maintainer_email='huchunxu@guyuehome.com',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': [],},
)
相关文章:

ros2 launch 用法以及一些基础功能函数的示例
文章目录 launch启动一个节点的launch示例launch文件中添加节点的namespacelaunch文件中的话题名称映射launch文件中向节点内传入命令行参数launch文件中向节点内传入rosparam使用方法多节点启动命令行参数配置资源重映射ROS参数设置加载参数文件在launch文件中使用条件变量act…...

如何使用Python获取图片中的文字信息
如下有三中方法: 方法1. 使用Tesseract OCR(pytesseract) 安装依赖 首先,确保你已经安装了Tesseract OCR引擎(例如,通过你的操作系统的包管理器)。然后,你可以通过pip安装pytesse…...

C++知识点
1. 构造函数:当没有写任何构造函数(含拷贝构造),系统会生成默认的无参构造,并且访问属性是共有。 默认拷贝构造:当没有写任何的拷贝构造,系统会生成默认的拷贝构造->是一个浅拷贝 写了拷贝构造函数,这…...

反转字符串中的单词-力扣
此题将问题分为三步进行解决: 第一步,删除字符串中多余的空格,removeSpaces函数中删除所有的空格,并手动在每个单词后添加一个空格,最后重构字符串s第二步,将整个字符串反转第三步,对反转后的字…...

Kotlin 重写与重载
文章目录 重写(Override)重载(Overload) 重写(Override) 重写通常是指子类覆盖父类的属性或方法,通常会标记为override: open class Base {open val name "Base"open f…...

关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法
关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法 如下图 将model saving history 修改为None即可 关于AutoCAD 2022 丢失模板库的问题 从新从以下地址打开即可: D:\Program Files\Autodesk\AutoCAD 2022\UserDataCache\zh-cn\Template...

C语言之旅:探索单链表
目录 一、前言 二、实现链表的功能: 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码: 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…...

【安卓基础】-- 消息机制 Handler
目录 消息机制 Handler面试问题 消息机制 Handler 对handler机制的基本作用、用法、时序流程进行介绍,针对handler机制中的内存泄漏问题讲解:一篇读懂Android Handler机制 Android-Handler机制详解 全面解析 | Android之Handler机制 需要掌握的&#x…...

Optional 类
概述 到目前为止,臭名昭著的空指针异常是导致 Java 应用程序失败的最常见原因。以前,为了解决空指针异常,Google 公司著名的 Guava 项目引入了 Optional 类, Guava 通过使用检查空值的方式来防止代码污染,它鼓励程序员…...

自动微分技术在 AI for science 中的应用
本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力,人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如,大部分图神经网络均基于消息传递的架构。在推理…...

ASM OMF single-file creation form 重命名
OMF下不能自动命名,需要重新命名的话:1 1. spfile 可以 create pfile from spfile 后再create spfile from pfile 2 redo? 3 datafile? Here are some details of the copy problem: a) You are not allowed to set the numbe…...

VGGNet
VGGNet CNN卷积网络的发展史 1. LetNet5(1998) 2. AlexNet(2012) 3. ZFNet(2013) 4. VGGNet(2014) 5. GoogLeNet(2014) 6. ResNet(2015) 7. DenseNet(2017) 8. EfficientNet(2019) 9. Vision Transformers(2020) 10. 自适应卷积网络(2021) 上面列出了发展到现在CNN的一些经典…...

SpringMVC:转发和重定向
1. 请求转发和重定向简介 参考该链接第9点 2. forward 返回下一个资源路径,请求转发固定格式:return "forward:资源路径"如 return "forward:/b" 此时为一次请求返回逻辑视图名称 返回逻辑视图不指定方式时都会默认使用请求转发in…...

961操作系统知识总结
部分图片可能无法显示,参考这里:https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型:批处理操作系统(批量处理作业,单道批处理/多道批处理系统,用…...

电脑死机问题排查
情况描述:2024年6月2日下午16:04分电脑突然花屏死机,此情况之前遇到过三次,认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息:应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…...

百度地图1
地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时,zoom必须赋值,范围3-19级, // 百度地图API功能var map new BMap.Map("map"); //…...

Ubuntu 24.04 LTS 安装Docker
1 更新软件包索引: sudo apt-get update 2 安装必要的软件包,以允许apt通过HTTPS使用仓库: sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥: curl -fs…...

【架构设计】Java如何利用AOP实现幂等操作,防止客户端重复操作
1实现方案详解 在Java中,使用AOP(面向切面编程)来实现幂等操作是一个常见的做法,特别是当你想在不修改业务代码的情况下添加一些横切关注点(如日志、事务管理、安全性等)时。幂等操作指的是无论执行多少次,结果都是相同的操作。 为了利用AOP实现幂等操作以防止客户端重…...

笔记:美团的测试
0.先启动appium 1.编写代码 如下: from appium import webdriver from appium.webdriver.extensions.android.nativekey import AndroidKeydesired_caps {platformName: Android,platformVersion: 10,deviceName: :VOG_AL10,appPackage: com.sankuai.meituan,ap…...

【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
亲爱的读者们👋 欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀 Prometheus是云原生和DevOps的…...

STM32F103借助ESP8266连接网络
ESP8266配置 STM32F103本身是不具备联网功能的,所以我们必须借助其他单片机来进行联网,然后让STM32与联网单片机通信,就可以实现STM32联网了。 本文借助的是ESP8266模块,其通过UART协议与STM32通信(http://t.csdnimg.c…...

Feature Manipulation for DDPM based Change Detection
基于去噪扩散模型的特征操作变化检测 文章提出了一种基于去噪扩散概率模型(DDPM)的特征操作变化检测方法。变化检测是计算机视觉中的经典任务,涉及分析不同时间捕获的图像对,以识别场景中的重要变化。现有基于扩散模型的方法主要…...

第十三届蓝桥杯国赛大学B组填空题(c++)
A.2022 动态规划 AC; #include<iostream> #define int long long using namespace std; int dp[2050][15]; //dp[i][j]:把数字i分解为j个不同的数的方法数 signed main(){dp[0][0]1;for(int i1;i<2022;i){for(int j1;j<10;j){//一种是已经分成j个数,这时只需每一个…...

conda源不能用了的问题
conda旧没用了,不知道什么原因,安装源出问题,报如下错: Loading channels: failedUnavailableInvalidChannel: HTTP 404 NOT FOUND for channel anaconda/pkgs/main <https://mirrors.aliyun.com/anaconda/pkgs/main>The c…...

【C#】自定义List排序规则的两种方式
目录 1.系统排序原理 2.方式一:调用接口并重写 3.方式二:传排序规则函数做参数 1.系统排序原理 当我们对一个List<int>类型的数组如list1排序时,一个轻松的list1.sort();帮我们解决了问题 但是在实际应用过程中,往往我们…...

ANAH数据集- 大模型幻觉细粒度评估工具
大型语言模型(LLMs)在各种自然语言处理任务中取得了显著的性能提升。然而,它们在回答用户问题时仍面临一个令人担忧的问题,即幻觉,它们会产生听起来合理但不符合事实或无意义的信息,尤其是当问题需要大量知…...

AI前沿技术探索:智能化浪潮下的创新与应用
一、引言 随着科技的不断进步,人工智能(AI)已成为推动社会发展的重要力量。从自动驾驶汽车到智能医疗诊断,从智能家居到虚拟助手,AI技术正逐渐渗透到我们生活的方方面面。本文旨在探讨AI的前沿技术、创新应用以及未来…...

JVM类加载过程
在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段&…...

如何安装ansible
ansible安装 1、 准备环境----关闭防护墙和selinux 一般用ansible不会少于10台以上 环境: 主机:4台 一个控制节点 3个被控制节点 解析:本地互相解析(所有机器) # vim /etc/hosts 192.168.1.10 ansible-web1 192.168.1.11 ansible-web2 192.168.1.12…...

html+CSS+js部分基础运用11
一、改变新闻网页中的字号 1、设计如图1-1所示的界面,要求当网络访问者选择字号中的【大、中、小】时能实现页面字号大小变化,选择“中”时,页面效果如图1所示。 图1 单击前初始状态页面 图2 单击“中”链接后页面 2、div中内容如下&#x…...