使用mid360从0开始搭建实物机器人入门级导航系统,基于Fast_Lio,Move_Base

Introduction

本文原本只是自己在拿到mid360后,开始进行开发过程的一些问题和学习的记录。毕竟实物和仿真还是有很多不同,且由于碰到的问题也比较多,READEME也越来越详细,所以就干脆整合起来,做成了一篇使用mid360的搭建入门的导航系统全流程分享。里面用到的都是主流的开源的框架(部分文件做了修改和mid360适配),fast_lio, move_base等等,或许能帮助到第一次开发机器人实物导航的朋友。

本文的代码地址:https://github.com/66Lau/NEXTE_Sentry_Nav

环境:

  • ros-noetic
  • ubuntu 20.04

你可以跟着下文步骤,逐一对clone开源仓库,再进行修改配置,但是建议直接直接克隆本仓库至你的工作空间的src下(因为做了很多修改,如果再clone我引用的原来的仓库,可能有些地方我没记在README里面导致你运行失败)然后再根据本文的顺序逐一进行配置和尝试

在这里插入图片描述

Hardware info

  • MID360 offical web官网

  • Quick-start-doc|MID360快速开始手册

  • user-manual|MID360用户手册

  • Livox_sdk2源地址

  • livox_ros_driver2源地址

  • livox ros driver2安装博客

  • 虚拟机和mid360桥接博客

Livox和Fast-Lio配置流程

  1. 安装Livox_sdk2,readme有写相关过程,注意:要更改主机ip为192.168.1.50ubuntu修改方法,本人雷达ip为192.168.1.180
  2. 安装livox_ros_driver2, readme有写相关过程, 注意运行前要注意更改config里面的主机ip和雷达IP
  3. 配置fast-lio
    参考:
    FAST_LIO原地址
    FAST-LIO配置中文博客
    关于在ROS1下用MID360配置FAST-LIO2备忘
    更建议参考源地址的READEME
sudo apt install libeigen3-dev
sudo apt install libpcl-dev
# ros2需要安装
sudo apt install ros-humble-pcl-ros
# 编译fast-lio
cd ~/$A_ROS_DIR$/src
git clone https://github.com/hku-mars/FAST_LIO.git
cd FAST_LIO
git submodule update --init
cd ../..
catkin_make
source devel/setup.bash
# 注意,如果使用的是mid360,即使用的是livox_ros_driver2而非1的话,
# 需要前往fast-lio的CmakeLists文件修改find_package里的livox_ros_driver为livox_ros_driver2,同时package.xml里面的也一样
# 安装sophus
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff
mkdir build
cd build
cmake ../ -DUSE_BASIC_LOGGING=ON
make
sudo make install

上述步骤可能会报错,解决方案

/home/lau/Sophus/sophus/so2.cpp:32:26: error: lvalue required as left operand of assignment
   unit_complex_.real() = 1.;
                          ^~
/home/lau/Sophus/sophus/so2.cpp:33:26: error: lvalue required as left operand of assignment

打开其位置so2.cpp:32:26改为

SO2::SO2()
{
  unit_complex_.real(1.);
  unit_complex_.imag(0.);
}

sophus安装成功后再重新编译fast-lio

# 注意:laserMapping.cpp和laserMapping_re.cpp里面include的livox_ros_driver改为livox_ros_driver_v2

最后运行

source devel/setup.bash
roslaunch livox_ros_driver2 msg_MID360.launch
#再开一个终端
source devel/setup.bash
roslaunch fast_lio mapping_mid360.launch

hhh
fast_lio 建图效果

以上就是使用fast_lio建好的图的效果,最后会自动存在PCD文件夹中

导航流程

一些基础的入门介绍:

  • ROS入门(九)——机器人自动导航

  • 带你理清:ROS机器人导航功能实现、解析、以及参数说明


1.Relocalization

上面的建图完成后,如果我们希望下次机器人导航的时候,能找到机器人自己的当前位置,那么就需要对机器人进行定位操作。也有如下几种方式:

  • 方式一:直接在初始位置使用里程计定位,也就是说,如果能确保机器人每次的上电和程序运行的初始位置始终一至,那么就可以使用fast_lio的里程计进行机器人定位。但这样的劣势很明显:1.机器人需要确保自己每次的初始位置一致,否则就会有误差;2.机器人在移动时,里程计会产生累计误差,无法消除。
  • 方式二:使用地图进行重定位,简单来说,就是通过当前雷达的点云和已构建的地图进行匹配来找到机器人当前的位姿。一般二维地图采用amcl进行重定位,三维点云采用icp进行重定位,当然,也有一些新的论文会提出新的更好的重定位定位方法,这些优化的算法暂不讨论。这种重定位方式一般会要求人给一个大概的初始位置,又或者可以依靠机器人的其他传感器给出一个粗略的初始位置估计。

考虑到避免累计误差,我们采用方式二进行定位。我们选用了一个开源的重定位代码(实际采用的也是icp,使用python写的,考虑运行速度的话可以自行使用c++实现或者使用其他icp重定位代码):FAST_LIO_LOCALIZATION

# 所需包
sudo apt install ros-$ROS_DISTRO-ros-numpy
pip install numpy==1.21
pip install open3d

目前这套适用python3.8,如果你有多个python环境,自行修改哈。

在配置时,我们发现了一些问题,主要还是版本导致。
一个是原仓库使用的是python2,python2使用和安装外部库已经不太方便了,所以换成了python3。
另一个是FAST_LIO_LOCALIZATION里面也包含了FAST_LIO,但是这里面的FAST_LIO还是比较老的版本,建议还是从最新的FAST_LIO仓库里拉最新的(因为做了mid360的适配),然后记得在cmakelist里修改生成的可执行文件的名称,否则会和上一步的fast_lio的mapping重复报错。
所以想使用的话建议还是直接使用我们的sentry_slam/FAST_LIO_LOCALIZATIONsentry_slam/FAST_LIO这两个修改好的包。

同时记录一下我对FAST_LIO_LOCALIZATION所做的修改,包括以下文件:

  • global_localization.py

    • #!/usr/bin/python3 此处我们修改解释器为python3
    • *import _thread*, python3中使用thread会报错,已经改名为_thread
    • 在open3d的最新版本, o3d.registration应被替换为 o3d.pipelines.registration
    • FOV = 6.28 in 222 line 应该改成你使用的雷达的扫描范围. The scale of MID360 is 360, so 2*pi (rad)
    • FOV_FAR = 30, switch to you lidar max distance
  • localization_MID360.launch

    • 我们修改了 fastlio_mapping 可执行文件的所属包,我们直接使用fast_lio2中的mid360的launch文件启动
    • 使用 args="$(arg map) 5 _frame_id:=map cloud_pcd:=map" /> in line 28,而不是/map,即和你自己的tf树一致
    • modified to <arg name="map" default="/home/rm/ws_sentry/src/FAST_LIO/PCD/scans.pcd" />, that used the PCD file in FAST_LIO pkg, If you have your own PCD file, you can change it to your own PCD file path.

Usage:

roslaunch livox_ros_driver2 msg_MID360.launch
roslaunch fast_lio_localization localization_MID360.launch 
# 发布初始位姿(也可以用rviz,第一次尝试的时候更建议使用rviz)
rosrun fast_lio_localization publish_initial_pose.py 0 0 0 0 0 0
# also you could publish your initial point use RVIZ
# 这里的原点是你建图时候的起点。


2. 地图转换(PCD to 二维栅格地图)

在这里插入图片描述

这里面红色的点云就是PCD文件显示的三维点云地图,白色的就是熟知的二维栅格地图

地图转换主要是因为move_base是基于2d的栅格地图进行路径规划,而fast_lio默认的输出地图是三维点云的PCD文件,我们需要用一些方法获取2d的栅格地图,有以下几种方式:

  1. 用fast_lio构建好PCD地图后,将PCD地图转换为栅格地图
    方式一:使用pcd_package开源功能包,参考离线将PCD地图转换为pgm栅格地图
    方式二:使用octomap_server功能包,离线将pcd转换成栅格地图,参考octomap_server使用--生成二维占据栅格地图和三维概率地图
  2. 在fast_lio构建三维点云地图的同时,也实时构建2d的栅格地图

本文的代码仓库里两种方式都有,常用的是第二种

配置:
sudo apt install ros-noetic-map-server
# 打开一个终端.(ctrl+alt+T)输入下面指令安装octomap.
sudo apt-get install ros-noetic-octomap-ros #安装octomap
sudo apt-get install ros-noetic-octomap-msgs
sudo apt-get install ros-noetic-octomap-server
 
# 安装octomap 在 rviz 中的插件
sudo apt-get install ros-noetic-octomap-rviz-plugins
# install move_base
sudo apt-get install ros-noetic-move-base

#如果使用方式一,还需将pcd2pgm拉到工作空间的src目录下编译
#本文代码仓库已经包含了该仓库,再sentry_tools/pcd2pgm,如果直接使用本文代码仓库,则不需要再拉
git clone https://github.com/Hinson-A/pcd2pgm_package.git
方式一实现
# pcd2pgm offline
# modify run.launch file in pcd2pgm such as the pcd file pasth etc.
# 修改 pcd2pgm中的run.launch文件,修改输入的pcd文件路径等
roslaunch pcd2pgm run.launch
方式二实现

使用octomap_server功能包中的octomap_server_node节点, 实时读取三维点云, 并生成栅格地图.

我们在 FAST_LIO 功能包中添加了 Pointcloud2Map.launch, which will update the 2D mapping at same time, if you publish the PointCloud2 from FAST_LIO.

然后我们综合了 SLAM, relocalization, 实时构建栅格地图三个功能, in only one launch file ==> sentry_build.launch.

运行此功能包后,系统便会开始自动同步构建栅格地图.

如果你对你构建的三维点云地图和二维栅格地图满意,并希望保存下来:

  1. 三维点云地图pcd文件会在sentry_build.launch运行结束后自动保存到fast_lio/PCD文件夹下
  2. 如果你希望保存二位栅格地图,请运行以下命令:
# save the pgm map file
rosrun map_server map_saver map:=/<Map Topic> -f PATH_TO_YOUR_FILE/mymap
#eg,举例:
rosrun map_server map_saver map:=/projected_map -f /home/rm/ws_sentry/src/FAST_LIO/PCD/scans

3. Pointcloud2 to Lasercan

在这里插入图片描述

这里面栅格地图上的黑色像素块(障碍物或者地图边界)上面有一层绿色的小方格,那个就是实时的二维点云

move_base框架下,我们构建局部代价地图时,需要输入当前的laserscan的实时二位点云

The output format of 3d point clouds of FAST_LIO is /pointclouds2. However, the input format of move_base is /Laserscan. Therefore, it is necessary to transfrom the /pointclouds2 to /Laserscan.

我使用的包是pointcloud_to_laserscan.
The package we are using is pointcloud_to_laserscan.

有关这个包的博客 pointcloud_to_laserscan :
blog about pointcloud_to_laserscan : pointcloud_to_laserscan_blog

启动文件为PointsCloud2toLaserscan.launch
The launch file is PointsCloud2toLaserscan.launch


4. 坐标系映射

input:body frame,即机器人在三维点云坐标系下的位姿
output: body_2d frame,即机器人在二维栅格地图坐标系下的位姿

由于fast_lio_localization输出的 body frame是当前机器人在三维点云坐标系下的位姿,而move_base需要的map frame是二维栅格地图坐标系下的坐标body_2d,因此需要进行坐标系转换。

此处需要根据你的雷达安装方式进行相应的转换。如:你的雷达是正向安装,或者正向稍微倾斜一点安装,即mid360的底部始终指向地面。这种情况下,对于坐标系的位置,只需要把body frame中的(x,y,z)取(x,y,0)赋给body_2d即可。同时,对于坐标系的姿态,把body frame 中的四元数(x,y,z,w)取(0,0,z,w)赋给body_2d即可。

这样最后的效果就是,3d中的机器人坐标系映射到二维body_2d,位置信息z始终为0,而位置信息x,y始终跟随body frame同步。同时姿态信息只有yaw轴会跟着3d中的机器人同步。这样坐标系body_2d的xy轴就可以始终贴合地图,便于路径规划。

如果你的机器人将mid360反装,即底部指向天空,你需要修改tf的转换

此处的代码请见: \sentry_nav\src\Trans_TF_2d.cpp
如何修改tf发布和订阅请见: tf/Tutorials(ps: 没有找见很好的中文材料,且英文教程和源码比较官方详细)


5. MOVE_BASE 避障和路径规划

我们主要采用开源的成熟框架move_base进行路径规划,避障。
主要是简单好用,资料丰富,对于小白来说比较合适。
自然也会有一些不足之处,暂时只是用move_base进行2d的避障和路径规划。如果需要上坡,或者z轴方向上有移动,需要参考更加复杂的路径规划算法,后续找到了鲁棒的方案再更新(2023-10-28)。

input(至少需要这些信息):
  • /Laserscans, 即机器人坐标系的2维点云数据,
    • 如何用mid360获取,见上面第三点, 如果你需要避障,则必须提供此信息或者/PointCloud
  • /tf, 你的tf中需要至少包含以下坐标系
    • /map, 二维栅格地图坐标系, 在我的源码中名字为map
    • /odom, 机器人里程计坐标系, 在我的源码中名字为camera_init
    • /base_link, 机器人坐标系, 在我的源码中名字为body_2d
    • PS: 如何看自己的坐标系是否正确呢?终端输入rqt,打开插件中的tf tree就能看到
  • /map, 这个/map不是坐标系信息,而是使用map_server发布的栅格地图信息
    • 在我的代码中,调用map_server写在fast_lio_localization包中的sentry_localize.launch 文件
  • move_base_simple/goal, 机器人希望到达的位置,可以使用rviz的红色箭头发布
  • /odom, 里程计信息
    • 在我的代码中, 在运行sentry_localize.launch文件时,会自动运行fast_lio发布里程计信息
output:(这个比较多,发布的东西很全,挑几个重点关注的)
  • 发布/cmd_vel话题,控制机器人运动
    • 如果你是第一次使用ros,这个信息需要重点关注,因为输出的就是xyz方向的线速度和绕xyz轴旋转的角速度,有了这个消息就可以用控制机器人导航了,检查cmd_vel时,建议使用rqt中的波形图,检查是否正确
  • 发布 global path 和local_path
  • 发布 cost map, 即代价地图
    在这里插入图片描述
实机测试

具体实现

其他信息不再过多阐述,建议参考move_base官方wiki | dwa_local_planner官方wiki | autolabor的ros教程(导航实现04_路径规划)
本文有关move_base的相关参数设置和代码请见 Sentry_Nav功能包
本导航系统运行的最终的命令为

  1. build the map 构建地图

    • roslaunch roslaunch livox_ros_driver2 msg_MID360.launch
    • roslaunch fast_lio_localization sentry_build_map.launch
    • 如果你认为当前构建的栅格地图还可以,运行 rosrun map_server map_saver map:=/projected_map -f /home/rm/ws_sentry/src/sentry_slam/FAST_LIO/PCD/scans, 来保存栅格地图,注意,三维点云的PCD是运行结束后自动保存到在launch file中指定的路径下的
  2. navigation 导航

    • check the 2d map in PCD dir, especially the scans.yaml, make sure the origin[x,y,yaw] can not be nan.
      检查在fast_lio/PCD下中保存的2d地图scans.yaml,确保其中参数origin[x,y,yaw]不能是nan,如果yaw是nan的话,将其设置为0.

    • roslaunch roslaunch livox_ros_driver2 msg_MID360.launch

    • roslaunch fast_lio_localization sentry_localize.launch

    • publish the initial pose by using rviz or rosrun fast_lio_localization publish_initial_pose.py 0 0 0 0 0 0

    • roslaunch sentry_nav sentry_movebase.launch

    • 发布目标点 rviz | publish the goal point through rviz

    • using rqt to check the cmd_vel, in ros, the red axis delegate the x axis, the green one is the y axis, the blue one is the z axis. Besides, when the angular velocity bigger than 0, it means that the robot should rotate anticlockwise, and when the angular velocity smaller than 0, it means that the robot should rotate clockwise.
      使用rqt来检查cmd_vel,在ros中,红轴代表x轴,绿色的是y轴,蓝色的是z轴。当角速度大于0时,表示机器人应“逆时针旋转”,当角速度小于0时,表示机器人应“顺时针旋转”。

Serial and Decision

即机器人控制的决策层和通讯,这里采用的是串口

1. Serial

当你的导航部分完成后,系统理论会针对你给的目标点生成路径和cmd_vel的话题,至此,就可以控制机器人移动。

本文使用的是虚拟串口发送给下位机相关的数据,通讯协议是由我们自己定义的,仅供参考。
Blog about Serial in ros

Setting serial port permissions

sudo usermod -aG dialout $USER
# USRE is your username
# eg:
sudo usermod -aG dialout lau
1. suscribe the cmd_vel
2. use serial.write to send data
3. For detail please see /sentry_comm/sentry_serial/src/serial_send.cpp
rosrun sentry_serial sentry_send <serial port path>

#eg:

rosrun sentry_serial sentry_send /dev/ttyACM0
#the default seriial port path is /dev/ttyACM0, if you do not offer the param

2. Decision

决策层就是上位机通过机器人的设计需求和使用需求,决定机器人应该做什么,以及如何做。本导航系统的决策层的主要任务就是,控制机器人在某时刻,某地点,某事件中的目标位置选取。

正因为决策层是由机器人的使用需求决定的,而不同人的使用需求又大相径庭,此处只根据本项目的使用需求进行设计,仅供参考,若想使用至其他场景,请自行修改。

搭建实物场地中,所以决策层TBD。


运行命令

本导航系统运行的最终的命令为:

  1. build the map 构建地图
roslaunch roslaunch livox_ros_driver2 msg_MID360.launch
roslaunch fast_lio_localization sentry_build_map.launch
rosrun map_server map_saver map:=/projected_map -f /home/rm/ws_sentry/src/sentry_slam/FAST_LIO/PCD/scans
  1. navigation 导航
roslaunch roslaunch livox_ros_driver2 msg_MID360.launch
roslaunch fast_lio_localization sentry_localize.launch
# 用rviz发布初始位姿或者 `rosrun fast_lio_localization publish_initial_pose.py 0 0 0 0 0 0`
roslaunch sentry_nav sentry_movebase.launch
# 用rviz发布目标点
rosrun sentry_serial sentry_send /dev/ttyACM0

由于文件中不可避免的会出现一些绝对路径的信息,还有诸如dev/ttyACM0这样应取决于你的硬件设备的相关文件,所以直接运行大概率会出问题,一般出问题后仔细查看报错,修改相关文件即可(这里因人而异,本章中无法做到非常详尽的指导,有过ros和c++开发经验应该很快能自己解决)


后续优化或修改

上面的内容可以作为导航系统的雏形,或者说是初学者的快速入门。得益于ROS不同功能包之间的良好的解耦,后续可以针对上面slam部分,避障部分,路径规划部分独立修改并优化,后续的优化或修改,可以参考以下内容:

  • 2023-10-28更换局部规划器为dwa,同时使cmd_vel输出全向移动机器人的y方向速度而不是使用默认的yaw

F&Q

  1. 如何确保栅格地图和三维点云地图处于完全重合的状态
    • 采用时候fast_lio构建三维点云地图的同时,将点云数据用octomap压至二维地图,同时构建的地图可以确保relocalize在三维点云中的机器人位姿可以完全映射到二位栅格地图中使用。(二维地图如果不满意反正可以P,但要是三维地图和二维不重合就比较麻烦)

TODO


END

未经允许,请勿转载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python、execl数据分析(数据描述)

一 python 1.各函数 1.1python库的安装与导入 #pip install os#pip install matplotlib#pip install seaborn#pip install scikit-learn#pip install scipy#修 改 工 作 目 录import osos.getcwd () # 查看当前工作环境os.chdir( F :\my course\database ) # 修改工作环境o…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎&#xff0c;是一种与 Hadoop 相似的开源集群计算环境&#xff0c;但是两者之间还存在一些不同之处&#xff0c;这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

高效物联网连接技术创新:ECWAN边缘协同自组网的未来——基于ChirpLAN窄带扩频技术的无线混合组网

物联网是指将各种物理设备通过互联网进行连接和通信的技术。它是一个庞大的网络&#xff0c;由传感器、设备、网络和云服务组成&#xff0c;旨在实现对物体的远程监测、控制和数据采集。 基于ChirpLAN窄带扩频技术的无线混合组网协议ChirpLAN&#xff0c;ChirpLAN是基于其自有的…

将 SOC 集成到应用程序安全中以增强网络弹性

从历史上看&#xff0c;安全运营中心 (SOC) 和应用程序安全 (AppSec) 计划在组织的更广泛的网络安全框架内作为不同的实体运行。SOC 一直是实时威胁检测、分析和响应、监控网络恶意活动迹象以及管理事件响应以减轻潜在损害的据点。 相反&#xff0c;AppSec 专注于网络安全的预…

JavaWeb——过滤器

Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;Web开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功能。例如实现URL级别…

学会Sass的高级用法,减少样式冗余

在当今的前端开发领域&#xff0c;样式表语言的进步已经显著提升了代码组织性和可维护性。Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;作为CSS预处理器的翘楚&#xff0c;以其强大的变量、嵌套规则、混合宏&#xff08;mixin&#xff09;、循环和函数等高…

【Canvas与艺术】淡蓝辉光汽车速度仪表盘

【关键点】 内圈处渐变色的采用。 【效果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>淡蓝辉光汽车速度仪表盘</t…

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤&#xff1a;点击启动Ubuntu后&#xff0c;一直起不来&#xff1f;没办法正常关机&#xff0c;选择重启又一直卡在这里&#xff0c;原来是同样的错误 Freeing initrd memory: 131304K 原因&#xff1a;本机联想小新14Pro&#xff0c;AMD 7840HS&#xff0c;锐龙版。而Ryze…

基于TensorFlow的花卉识别(算能杯)%%%

Anaconda Prompt 激活 TensorFlow CPU版本 conda activate tensorflow_cpu //配合PyCharm环境 直接使用TensorFlow1.数据分析 此次设计的主题为花卉识别&#xff0c;数据为TensorFlow的官方数据集flower_photos&#xff0c;包括5种花卉&#xff08;雏菊、蒲公英、玫瑰、向日葵…

设计模式之单例模式精讲

UML图&#xff1a; 静态私有变量&#xff08;即常量&#xff09;保存单例对象&#xff0c;防止使用过程中重新赋值&#xff0c;破坏单例。私有化构造方法&#xff0c;防止外部创建新的对象&#xff0c;破坏单例。静态公共getInstance方法&#xff0c;作为唯一获取单例对象的入口…

后端常问面经之Redis

Redis基础 常见的读写策略有哪些&#xff08;保证缓存和数据库数据的一致性&#xff09; Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式&#xff0c;比较适合读请求比较多的场景。 Cache Aside Pat…

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…

Ubuntu deb文件 安装 MySQL

更新系统软件依赖 sudo apt update && sudo apt upgrade下载安装包 输入命令查看Ubuntu系统版本 lsb_release -a2. 网站下载对应版本的安装包 下载地址. 解压安装 mkdir /home/mysqlcd /home/mysqltar -xvf mysql-server_8.0.36-1ubuntu20.04_amd64.deb-bundle.tar# …

阿里 Modelscope 创空间部署在本地环境操作文档

创建创空间的步骤直接跳过。 备注:我的电脑是Windows 第一步&#xff1a;获取创空间代码&#xff0c;直接下载代码太慢了&#xff0c;建议通过git获取代码 第二步:复制链接,打开cmd 直接粘贴回车下载。下载完之后的到了我的Service-Assistant文件夹。再git clone https://gith…

Publish Over SSH实现Jenkins构建项目发布

1. 在Jenkins上安装Publish Over SSH插件 在“系统设置–插件管理–可选插件”界面搜索&#xff1a;SSH&#xff0c;然后选择 Publish Over SSH&#xff0c;点击安装&#xff0c;然后重启。 这里是已经安装过&#xff0c;所以在“已安装”界面里&#xff01; 2. 配置 Publis…

Linux系统下安装部署Linux管理面板1panel

目录 一 1panel介绍 1、1Panel简介 2、1Panel特点 二、本地环境规划 1、本此实验目的 2、本地环境部署 三、部署1Panel&#xff08;在线安装&#xff09; 1.创建安装目录 2.一键部署1Panel 3.检查1Panel服务运行状态 4.检查1Panel监听端口 四、关闭防火墙和selinux…

线程的状态:操作系统层面和JVM层面

在操作系统层面&#xff0c;线程有五种状态 初始状态&#xff1a;线程被创建&#xff0c;操作系统为其分配资源。 可运行状态(就绪状态)&#xff1a;线程被创建完成&#xff0c;进入就绪队列&#xff0c;参与CPU执行权的争夺。或因为一些原因&#xff0c;从阻塞状态唤醒的线程…

2024年购买阿里云服务器多少钱?1000元年预算配置报价

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

区块链创新:探索 Web3 的去中心化应用

引言 随着数字化时代的发展&#xff0c;区块链技术作为一种颠覆性的技术正在改变着我们的社会和经济生活。在这个背景下&#xff0c;Web3的概念应运而生&#xff0c;它代表了一种去中心化的互联网新时代&#xff0c;为去中心化应用&#xff08;DApps&#xff09;的发展提供了坚…

面试笔记——MyBatis(执行流程、延迟加载和缓存)

MyBatis 是一个持久层框架&#xff0c;用于简化 Java 应用程序与数据库之间的交互过程。具体而言&#xff0c;它提供了一种将数据库操作映射到 Java 方法的方式&#xff0c;通过 XML 文件或注解配置 SQL 语句与 Java 方法的映射关系。使用 MyBatis&#xff0c;开发人员可以通过…