ROS Turtlebot3多机器人编队导航仿真
文章目录
- 前言
- 一、Gzazebo中加载多台Turtlebot3机器人
- 二、RVIZ中加载多个Turtlebot3机器人
- 三.多机器人编队导航
- 总结
前言
前面已经实现了在gazebo仿真环境中机器人一字型编队、三角形编队、N字型编队等仿真,接下来考虑多机器人编队在编队行进过程中的避障问题,通过在RVIZ中加载多个机器人使他们能分别进行全局和局部路径规划,来进行避障。
一、Gzazebo中加载多台Turtlebot3机器人
在前面的文章中也提到过在gazebo仿真环境中加载多个机器人主要是修改启动gazebo仿真环境的launch文件。
原Turtlebot3 launch文件
<launch><env name="GAZEBO_RESOURCE_PATH" value="$(find turtlebot3_gazebo)/models/turtlebot3_autorace/ground_picture" /><arg name="x_pos" default="0.245"/><arg name="y_pos" default="-1.787"/><arg name="z_pos" default="0"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_autorace.world" /><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="headless" value="false"/><arg name="debug" value="false"/></include> <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_burger_for_autorace.urdf.xacro" /><node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_burger -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" /></launch>
添加多台机器人的launch文件
<?xml version="1.0"?>
<launch><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="first_tb3" default="tb3_0"/><arg name="second_tb3" default="tb3_1"/><arg name="third_tb3" default="tb3_2"/><arg name="first_tb3_x_pos" default=" 0.0"/><arg name="first_tb3_y_pos" default=" 0.0"/><arg name="first_tb3_z_pos" default=" 0.0"/><arg name="first_tb3_yaw" default=" 0.0"/><arg name="second_tb3_x_pos" default=" -1.0"/><arg name="second_tb3_y_pos" default=" 0.0"/><arg name="second_tb3_z_pos" default=" 0.0"/><arg name="second_tb3_yaw" default=" 0.0"/><arg name="third_tb3_x_pos" default=" -2.0"/><arg name="third_tb3_y_pos" default=" 0.0"/><arg name="third_tb3_z_pos" default=" 0.0"/><arg name="third_tb3_yaw" default=" 0.0"/><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/cloister.world"/><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="headless" value="false"/><arg name="debug" value="false"/></include> <group ns = "$(arg first_tb3)"><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg first_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg first_tb3) -x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z $(arg first_tb3_z_pos) -Y $(arg first_tb3_yaw) -param robot_description" /></group><group ns = "$(arg second_tb3)"><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg second_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg second_tb3) -x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z $(arg second_tb3_z_pos) -Y $(arg second_tb3_yaw) -param robot_description" /></group><group ns = "$(arg third_tb3)"><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg third_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg third_tb3) -x $(arg third_tb3_x_pos) -y $(arg third_tb3_y_pos) -z $(arg third_tb3_z_pos) -Y $(arg third_tb3_yaw) -param robot_description" /></group></launch>
对比发现,修改后的launch文件增加了三个tb3的ns属性,并为其设置了初始位姿,设置了ns属性后才使得每个仿真小车发布带有对应属性的节点名称,例如/tb3_0/odom、/tb3_0/base_link、/tb3_1/odom、/tb3_1/base_link。这样能防止TF树错乱而导致的运行出错。
二、RVIZ中加载多个Turtlebot3机器人
与Gazebo中加载多个Turtlebot3机器人相比,RVIZ需要修改的内容多了些。首先修改turtlebot3_navigation.launch
原文件:
<launch><!-- Arguments --><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/><arg name="open_rviz" default="true"/><arg name="move_forward_only" default="false"/><!-- Turtlebot3 --><include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch"><arg name="model" value="$(arg model)" /></include><!-- Map server --><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/><!-- AMCL --><include file="$(find turtlebot3_navigation)/launch/amcl.launch"/><!-- move_base --><include file="$(find turtlebot3_navigation)/launch/move_base.launch"><arg name="model" value="$(arg model)" /><arg name="move_forward_only" value="$(arg move_forward_only)"/></include><!-- rviz --><group if="$(arg open_rviz)"> <node pkg="rviz" type="rviz" name="rviz" required="true"args="-d $(find turtlebot3_navigation)/rviz/turtlebot3_navigation.rviz"/></group>
</launch>
修改后:
<launch><!-- Arguments --><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="open_rviz" default="true"/><arg name="move_forward_only" default="false"/><arg name="first_tb3" default="tb3_0"/><arg name="second_tb3" default="tb3_1"/><arg name="third_tb3" default="tb3_2"/><!-- Map server --><arg name="map_file" default="$(find turtlebot3_navigation)/maps/cloister_gmapping.yaml"/><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/><group ns = "$(arg first_tb3)"><!-- Map server --><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/><!-- Turtlebot3 --><include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch"><arg name="model" value="$(arg model)" /><arg name="multi_robot_name" value="$(arg first_tb3)" /></include><arg name="first_tb3_x_pos" default="0.0"/><arg name="first_tb3_y_pos" default="0.0"/><arg name="first_tb3_z_pos" default="0.0"/><!-- AMCL --><include file="$(find turtlebot3_navigation)/launch/multi_amcl.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg first_tb3)/odom"/><arg name="base_frame_id" value="$(arg first_tb3)/base_footprint"/> <arg name="initial_pose_x" value="$(arg first_tb3_x_pos)"/><arg name="initial_pose_y" value="$(arg first_tb3_y_pos)"/><arg name="initial_pose_a" value="$(arg first_tb3_z_pos)"/></include><!-- move_base --><include file="$(find turtlebot3_navigation)/launch/multi_move_base.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg first_tb3)/odom"/><arg name="base_frame_id" value="$(arg first_tb3)/base_footprint"/><arg name="odom_topic" value="/$(arg first_tb3)/odom" /><arg name="laser_topic" value="/$(arg first_tb3)/scan" /><arg name="cmd_vel_topic" value="/$(arg first_tb3)/cmd_vel" /><arg name="model" value="$(arg model)" /><arg name="move_forward_only" value="$(arg move_forward_only)"/></include>
</group><group ns = "$(arg second_tb3)"><!-- Map server --><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/><!-- Turtlebot3 --><include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch"><arg name="model" value="$(arg model)" /><arg name="multi_robot_name" value="$(arg second_tb3)" /></include><arg name="second_tb3_x_pos" default="-1.0"/><arg name="second_tb3_y_pos" default="0.0"/><arg name="second_tb3_z_pos" default="0.0"/><!-- AMCL --><include file="$(find turtlebot3_navigation)/launch/multi_amcl.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg second_tb3)/odom"/><arg name="base_frame_id" value="$(arg second_tb3)/base_footprint"/> <arg name="initial_pose_x" value="$(arg second_tb3_x_pos)"/><arg name="initial_pose_y" value="$(arg second_tb3_y_pos)"/><arg name="initial_pose_a" value="$(arg second_tb3_z_pos)"/></include><!-- move_base --><include file="$(find turtlebot3_navigation)/launch/multi_move_base.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg second_tb3)/odom"/><arg name="base_frame_id" value="$(arg second_tb3)/base_footprint"/><arg name="odom_topic" value="/$(arg second_tb3)/odom" /><arg name="laser_topic" value="/$(arg second_tb3)/scan" /><arg name="cmd_vel_topic" value="/$(arg second_tb3)/cmd_vel" /><arg name="model" value="$(arg model)" /><arg name="move_forward_only" value="$(arg move_forward_only)"/></include>
</group><group ns = "$(arg third_tb3)"><!-- Map server --><node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/><!-- Turtlebot3 --><include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch"><arg name="model" value="$(arg model)" /><arg name="multi_robot_name" value="$(arg third_tb3)" /></include><arg name="third_tb3_x_pos" default="-2.0"/><arg name="third_tb3_y_pos" default="0.0"/><arg name="third_tb3_z_pos" default="0.0"/><!-- AMCL --><include file="$(find turtlebot3_navigation)/launch/multi_amcl.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg third_tb3)/odom"/><arg name="base_frame_id" value="$(arg third_tb3)/base_footprint"/> <arg name="initial_pose_x" value="$(arg third_tb3_x_pos)"/><arg name="initial_pose_y" value="$(arg third_tb3_y_pos)"/><arg name="initial_pose_a" value="$(arg third_tb3_z_pos)"/></include><!-- move_base --><include file="$(find turtlebot3_navigation)/launch/multi_move_base.launch"><arg name="global_frame_id" value="map"/><arg name="odom_frame_id" value="$(arg third_tb3)/odom"/><arg name="base_frame_id" value="$(arg third_tb3)/base_footprint"/><arg name="odom_topic" value="/$(arg third_tb3)/odom" /><arg name="laser_topic" value="/$(arg third_tb3)/scan" /><arg name="cmd_vel_topic" value="/$(arg third_tb3)/cmd_vel" /><arg name="model" value="$(arg model)" /><arg name="move_forward_only" value="$(arg move_forward_only)"/></include>
</group><!-- rviz --><group if="$(arg open_rviz)"> <node pkg="rviz" type="rviz" name="rviz" required="true"args="-d $(find turtlebot3_navigation)/rviz/turtlebot3_navWjx.rviz"/></group>
</launch>
turtlebot3_navigation.launch中引用的move_base.launch和amcl.launch文件也需要修改
move_base.launch
原文件:
<launch><!-- Arguments --><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="cmd_vel_topic" default="/cmd_vel" /><arg name="odom_topic" default="odom" /><arg name="move_forward_only" default="false"/><!-- move_base --><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"><param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" /><rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" /><rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" /><rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" /><remap from="cmd_vel" to="$(arg cmd_vel_topic)"/><remap from="odom" to="$(arg odom_topic)"/><param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" /></node>
</launch>
修改后(multi_move_base.launch):
<launch><!-- Arguments --><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="odom_frame_id" default="odom"/><arg name="base_frame_id" default="base_footprint"/><arg name="global_frame_id" default="map"/><arg name="cmd_vel_topic" default="/cmd_vel" /><arg name="odom_topic" default="odom" /><arg name="laser_topic" default="scan" /><arg name="move_forward_only" default="false"/><!-- move_base --><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"><param name="base_global_planner" value="global_planner/GlobalPlanner"/><param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS"/><rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" /><rosparam file="$(find turtlebot3_navigation)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" /><rosparam file="$(find turtlebot3_navigation)/param/local_costmap_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/global_costmap_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/move_base_params.yaml" command="load" /><rosparam file="$(find turtlebot3_navigation)/param/dwa_local_planner_params_$(arg model).yaml" command="load" /><!-- reset frame_id parameters using user input data --><param name="global_costmap/global_frame" value="$(arg global_frame_id)"/><param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/><param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/><param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/><param name="global_costmap/obstacle_layer/scan/topic" value="$(arg laser_topic)"/><param name="local_costmap/obstacle_layer/scan/topic" value="$(arg laser_topic)"/><remap from="cmd_vel" to="$(arg cmd_vel_topic)"/><remap from="odom" to="$(arg odom_topic)"/><remap from="scan" to="$(arg laser_topic)"/><param name="DWAPlanner/min_vel_x" value="0.0" if="$(arg move_forward_only)" /></node>
</launch>
amcl.launch
原文件:
<launch><!-- Arguments --><arg name="scan_topic" default="scan"/><arg name="initial_pose_x" default="0.0"/><arg name="initial_pose_y" default="0.0"/><arg name="initial_pose_a" default="0.0"/><!-- AMCL --><node pkg="amcl" type="amcl" name="amcl"><param name="min_particles" value="500"/><param name="max_particles" value="3000"/><param name="kld_err" value="0.02"/><param name="update_min_d" value="0.20"/><param name="update_min_a" value="0.20"/><param name="resample_interval" value="1"/><param name="transform_tolerance" value="0.5"/><param name="recovery_alpha_slow" value="0.00"/><param name="recovery_alpha_fast" value="0.00"/><param name="initial_pose_x" value="$(arg initial_pose_x)"/><param name="initial_pose_y" value="$(arg initial_pose_y)"/><param name="initial_pose_a" value="$(arg initial_pose_a)"/><param name="gui_publish_rate" value="50.0"/><remap from="scan" to="$(arg scan_topic)"/><param name="laser_max_range" value="3.5"/><param name="laser_max_beams" value="180"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_likelihood_max_dist" value="2.0"/><param name="laser_model_type" value="likelihood_field"/><param name="odom_model_type" value="diff"/><param name="odom_alpha1" value="0.1"/><param name="odom_alpha2" value="0.1"/><param name="odom_alpha3" value="0.1"/><param name="odom_alpha4" value="0.1"/><param name="odom_frame_id" value="odom"/><param name="base_frame_id" value="base_footprint"/></node>
</launch>
修改后(multi_amcl.launch读入数据):
<launch><!-- Arguments --><arg name="use_map_topic" default="true"/><arg name="scan_topic" default="scan"/><arg name="initial_pose_x" default="0.0"/><arg name="initial_pose_y" default="0.0"/><arg name="initial_pose_a" default="0.0"/><arg name="odom_frame_id" default="odom"/><arg name="base_frame_id" default="base_footprint"/><arg name="global_frame_id" default="map"/><!-- AMCL --><node pkg="amcl" type="amcl" name="amcl"><param name="use_map_topic" value="$(arg use_map_topic)"/><param name="min_particles" value="500"/><param name="max_particles" value="3000"/><param name="kld_err" value="0.02"/><param name="update_min_d" value="0.20"/><param name="update_min_a" value="0.20"/><param name="resample_interval" value="1"/><param name="transform_tolerance" value="0.5"/><param name="recovery_alpha_slow" value="0.00"/><param name="recovery_alpha_fast" value="0.00"/><param name="initial_pose_x" value="$(arg initial_pose_x)"/><param name="initial_pose_y" value="$(arg initial_pose_y)"/><param name="initial_pose_a" value="$(arg initial_pose_a)"/><param name="gui_publish_rate" value="50.0"/><remap from="scan" to="$(arg scan_topic)"/><param name="laser_max_range" value="3.5"/><param name="laser_max_beams" value="180"/><param name="laser_z_hit" value="0.5"/><param name="laser_z_short" value="0.05"/><param name="laser_z_max" value="0.05"/><param name="laser_z_rand" value="0.5"/><param name="laser_sigma_hit" value="0.2"/><param name="laser_lambda_short" value="0.1"/><param name="laser_likelihood_max_dist" value="2.0"/><param name="laser_model_type" value="likelihood_field"/><param name="odom_model_type" value="diff"/><param name="odom_alpha1" value="0.1"/><param name="odom_alpha2" value="0.1"/><param name="odom_alpha3" value="0.1"/><param name="odom_alpha4" value="0.1"/><param name="odom_frame_id" value="$(arg odom_frame_id)"/> <param name="base_frame_id" value="$(arg base_frame_id)"/> <param name="global_frame_id" value="$(arg global_frame_id)"/></node>
</launch>
三.多机器人编队导航
多机器人编队的仿真在前面文章中叙述过:多机器人三角形编队的实现,编队的程序不需要修改,可以直接运行。
启动gazebo仿真环境(launch 自己的文件名):
roslaunch turtlebot3_gazebo multi3_turtlebot3.launch
启动导航节点(RVIZ)
roslaunch turtlebot3_navigation turtlebot3_navigation
启动编队程序:
roslaunch turtlebot3_teams_wang turtlebot3_teams_follow_wang.launch
总结
简单总结了Turtlebot3多机器人编队仿真,在实现的过程中需要对RVIZ仿真环境进行配置,这个花费了我很长时间,后面我会专门的写一下,主要是添加多个2D nav Goal/2D pose estimate,以及导航、laser、全局路径/局部路径话题的订阅。
相关文章:

ROS Turtlebot3多机器人编队导航仿真
文章目录 前言一、Gzazebo中加载多台Turtlebot3机器人二、RVIZ中加载多个Turtlebot3机器人三.多机器人编队导航总结 前言 前面已经实现了在gazebo仿真环境中机器人一字型编队、三角形编队、N字型编队等仿真,接下来考虑多机器人编队在编队行进过程中的避障问题&…...

端口配置错误,导致RabbitMq启动报错
SpringBoot启动,报错如下: 2023-11-19 01:33:43.030 UID[] [] [AMQP Connection 116.xxx.xx.xxx:15672] ERROR com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connection driver error occured java.net.SocketException: Sock…...

<MySQL> 什么是JDBC?如何使用JDBC进行编程?
目录 一、JDBC是什么? 二、JDBC常用接口和类 2.1 DataSource 2.2 Connection 2.3 Statement 2.4 ResultSet 三、JDBC的使用 3.1 获得数据库驱动包 3.2 添加到项目依赖 3.3 描述数据库服务器 3.4 建立数据库连接 3.6 执行SQL语句和接收返回数据 3.7 释放…...

基于安卓android微信小程序的装修家装小程序
项目介绍 巧匠家装小程序的设计主要是对系统所要实现的功能进行详细考虑,确定所要实现的功能后进行界面的设计,在这中间还要考虑如何可以更好的将功能及页面进行很好的结合,方便用户可以很容易明了的找到自己所需要的信息,还有系…...

基于SSM的小区物业管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

c语言免杀火绒
文章目录 前记c加载器补充知识 前记 pyinstaller pyinstaller目前已经被杀疯了,简单打包一个hello a"hello" print(a)#pyinstaller -F -w b.py -n HipsMain.exe考虑Nuitka pip uninstall nuitka pip install nuitka pip install nuitka1.8.5 这里最新…...

MyBatis #{} 和 ${} 的区别
前言: #{} 和 ${} 的区别是 MyBatis 中一个常见的面试题,#{} 和 ${} 是MyBatis 中获取参数的两种方式,但我们在项目中大多数使用的都是 #{} 来获取参数,那么它们两个有什么区别呢? 区别 一. #{} 采用预编译 SQL&…...

计算机科学速成课
建议看看计算机科学速成课,一门很全面的计算机原理入门课程,短短10分钟可以把大学老师十几节课讲的东西讲清楚!整个系列一共41个视频,B站上有中文字幕版。 每个视频都是一个特定的主题,例如软件工程、人工智能、操作系…...

基于单片机的汽车安全气囊系统故障仿真设计
**单片机设计介绍, 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车安全气囊系统的故障检测系统是一种用于检测安全气囊系统故障的智能化设备,通过单片机控…...

JPA整合Sqlite解决Dialect报错问题, 最新版Hibernate6
前言 我个人项目中,不想使用太重的数据库,而内嵌数据库中SQLite又是最受欢迎的, 因此决定采用这个数据库。 可是JPA并不支持Sqlite,这篇文章就是记录如何解决这个问题的。 原因 JPA屏蔽了底层的各个数据库差异, 但是…...

算法通关村第十关-青铜挑战快速排序
大家好我是苏麟,今天带来快速排序 . 快速排序 单边快速排序(lomuto 洛穆托分区方案) 单边循环 (lomuto分区) 要点 : 选择最右侧元素作为基准点j 找比基准点小的,i 找比基准点大的,一旦找到,二者进行交换。 交换时机: 找到小的,…...

whisper large-v3 模型文件下载链接
#源码里找到的_MODELS {"tiny.en": "https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt","tiny": "https://openaipublic.azureedge.net/main/whisp…...

Ajax 之XMLHttpRequest讲解
一直以来都听别人说Ajax,今天终于接触到了。。。。。。。。。。 一.什么是Ajax? 答: AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。 AJAX 异步 JavaScript和XML&#x…...

小程序里面循环使用ref的话获取不到
文章目录 概要问题案例解决方法 概要 在小程序里面一般循环使用ref的话会获取不到 问题案例 //这个时自己封装的组件,然后循环使用 <jilianXuanzhe huoqu"huoqu" :ref"jilianXuanzhe i"></jilianXuanzhe>//如果这样使用的话获取…...

PY32F002B从压缩包到实现串口printf输出
最近学习使用芯领的PY32F002B开发板,记录学习历程供有同样需求的人参考。 本文主要讲述利用开发板实现printf语句串口输出。 开发环境的初步搭建 官方提供了一个压缩文件,文件名py32f002B_231026.zip, 链接:https://pan.baidu.c…...

音视频项目—基于FFmpeg和SDL的音视频播放器解析(八)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

CorelDRAW2024最新版本的图形设计软件
CorelDRAW2024是Corel公司推出的最新版本的图形设计软件。CorelDRAW是一款功能强大的矢量图形编辑工具,被广泛用于图形设计、插图、页面布局、照片编辑和网页设计等领域。 1. 新增的设计工具:CorelDRAW 2024引入了一些全新的设计工具,使用户能…...

【作业】操作系统实验一:进程和线程
文章目录 实验内容一、进程的创建1、编辑源程序2、编辑结果3、编译和运行程序4、解释运行结果 二、进程共享1、运行2、解释运行结果 三、进程终止1、运行2、解释运行结果 四、进程同步1、运行2、解释运行结果 五、Linux中子进程映像的重新装入1、运行2、解释运行结果 六、线程1…...

Linux 环境删除Conda
你可以按照以下步骤操作来删除Conda: 首先,停止所有conda环境。在终端中运行以下命令: conda deactivate然后使用以下命令获取conda安装的路径: which conda如果成功安装了conda,该命令输出的路径应该是类似于这样的&a…...

uni-app(1)pages. json和tabBar
第一步 在HBuilderX中新建项目 填写项目名称、确定目录、选择模板、选择Vue版本:3、点击创建 第二步 配置pages.json文件 pages.json是一个非常重要的配置文件,它用于配置小程序的页面路径、窗口表现、导航条样式等信息。 右键点击pages,按…...

window系统vscode 编译wvp前端代码
下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等…...

获取虎牙直播源
为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…...

Halcon (2):Halcon基础知识
文章目录 文章专栏视频资源前言Halcon文档案例学习结论 文章专栏 Halcon开发 视频资源 机器视觉之C#联合Halcon 前言 本章我们主要讲解Halcon的基础语法 Halcon文档 按下F1,就可以看到Halcon的文档,不过都是纯英文的 如果不清楚参数如何使用&#x…...
测不准原理
测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系: 设一个新态: 投影: 那么有: 代回Schwarz inequality 即可证明:...

微机原理_12
一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H,当执行完指令PUSH…...

设计模式(5)-使用设计模式实现简易版springIoc
自定义简易版springIoc 1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。 数据访问层。定义UserDao接口及其子实现类 public interface UserDao {public void add(); }public…...

数据结构与集合源码
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...

nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
主要功能有,管理员通过后台会对此教学辅助进行审核,管理员在还可以进行首页、个人中心、学生管理、教师管理、班级信息管理、科目名称管理、课程信息管理、教学资料管理、作业信息管理、作业提交管理、作业成绩管理、在线考试管理、试题管理、考试管理、…...

智能配电系统解决方案
智能配电系统解决方案是一种集成了先进技术和智能化功能的配电系统,它能够提高电力系统的效率、可靠性和安全性。力安科技智能配电系统解决方案依托电易云-智慧电力物联网,具体实施的方案如下: 智能化设备和传感器:采用智能化的开…...

Python基础入门---conda 如何管理依赖包以及复制相同环境的
文章目录 创建虚拟环境:创建虚拟环境并指定Python版本:安装依赖包:从环境导出依赖包清单:从依赖包清单创建环境:复制环境:移植环境:在Conda中,你可以使用conda create命令来创建和管理虚拟环境,而使用conda install命令来安装和管理依赖包。以下是一些基本的命令和步骤…...