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,按…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...