【6. 激光雷达接入ROS】
欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】🥳🥳🥳
2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号👻👻👻,座右铭:脚踏实地,仰望星空🛹🛹🛹
🎏🎏主要开发专栏🎏🎏
《arduino学习》:学习最简单开源便利的单片机Arduino,与时俱进😆😆😆
《Arduino编程参考》:本专栏围绕Arduino语法和Arduino库使用开发;🌻🌻🌻
《 Arduino小项目开发》:本专栏围绕Arduino生态结合实际需求设计综合的小项目开发。🌼🌼🌼
《HomeAssistant》:介绍homeassistant中基本开发, 重点设计esphome和nodered开发,包含小爱同学打印机等诸多设备添加。🎉🎉🎉
本文章属于《Ubuntu学习》和《ROS机器人学习》
:围绕Ubuntu系统基本配置及相关命令行学习记录!机器人操作系统 (ROS) 是一组软件库和工具,可帮助您构建机器人应用程序。👍👍👍
1. 前言
Ubuntu环境搭建
【经典Ubuntu20.04版本U盘安装双系统教程】
【Windows10安装或重装ubuntu18.04双系统教程】
【Ubuntu同步系统时间】
【Ubuntu中截图工具】
【Ubuntu安装QQ】
【Ubuntu安装后基本配置】
【Ubuntu启动菜单的默认项】
【ubuntu系统中修改hosts配置】
【18.04Ubuntu中解决无法识别显示屏】
ROS学习笔记
【1. Ubuntu18.04安装ROS Melodic】
【2. 在Github上寻找安装ROS软件包】
【3. 初学ROS,年轻人的第一个Node节点】
【4. ROS的主要通讯方式:Topic话题与Message消息】
【5. ROS机器人的运动控制】
接下来学习激光雷达如何接入ros机器人,激光雷达是用来探测周围障碍物的分布状况!
2. 激光雷达分类
其按照测量的维度可以分为单线雷达和多线雷达
按照测量原理分为三角测距雷达和TOF雷达
根据工作方式分为机械旋转雷达和固态雷达
激光雷达虽各有不同,但是在ROS中呈现的数据格式是一样的,只是在数据完整度和精度上会有所差异。下面就选取TOF激光雷达作为例子
3. TOF和三角测距激光雷达
3.1 何为飞行时间测距(TOF)?
简单来说,就是计算光的“飞行时间”。
由激光器发射一个激光脉冲,通过计时器记录下光的出射和回返的时间,两个时间相减即可得到光的“飞行时间”,而光速是固定的,根据已知速度和时间就可以计算出距离。
3.2 何为三角测距?
三角测距采用激光器发射激光,在照射到物体之后,反射光会由线性CCD接收,因为激光器和探测器间隔了一段距离,所以根据光学路径,不同距离的物体将会在CCD上成像在不同的位置,按照三角公式进行计算,就可以推导出被测物体的距离。
3.3 激光雷达测距
TOF激光雷达计算如下
4. 使用RViz观测传感器数据
RViz这个工具的全名叫做 The Robot Visualization Tool
4.1 运行模板样机
打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rviz
首先把这个Fixed Frame修改成base_footprint
状态栏添加机器人模型,最后点击ok
选择激光雷达的话题名称/scan
调整size为0.03
调整RViz和Gazebo分屏
Gazebo是模拟真实机器人发出传感器数据的工具
RViz显示的是机器人实际能探测到的环境状况
另外一点就是RViz并不参与机器人算法的运行,它只是一个为了方便人类进行观测的工具而已
即使没有RViz,也不影响机器人的ROS系统的运行
只有需要观察某些数据实时变化的时候,才会打开RViz
下面添加虚拟环境的圆柱体障碍物
4.2 保存RViz配置
点击file菜单,选择Save Config As
选择保存地址,方便后期直接加载
然后关闭所有终端
打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rviz
然后在RViz中的file菜单,选择Open Config
然后选择刚保存的位置
4.3 自动加载rviz配置文件
还可以在launch文件里自动加载rviz配置文件
先关闭RViz,然后打开终端输入
roslaunch wpr_simulation wpb_rviz.launch
关闭摄像头,保留激光雷达
调整视角
5. ROS系统中的激光雷达消息包格式
5.1 运行模板样机
打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
roslaunch wpr_simulation wpb_rviz.launch
在Gazebo中围绕机器人堆积障碍物
5.2 sensor_msgs中Laserscan_msgs消息属性
进入ROS Index官网搜索sensor_msgs
进入website
在消息中找到LaserScan
这就打开了激光雷达消息包的格式定义
5.3 查看scan消息
新开终端输入
rostopic echo /scan --noarr
显示对比
6. 用C++获取ROS激光雷达数据节点
6.1 运行模板样机
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrunwpr_simulation deno_lidar_data
6.2 构思功能的思路和步骤
构思
实现步骤
- 构建一个新的软件包,包名叫做lidar_pkg。
- 在软件包中新建一个节点,节点名叫做lidar_node。
- 在节点中,向ROS大管家NodeHandle申请订阅话题/scan,并设置回调函数为LidarCallback()。
- 构建回调函数LidarCallback(),用来接收和处理雷达数据。
- 调用ROS_INFO()显示雷达检测到的前方障碍物距离。
6.3 创建lidar_pkg包
在工作空间src文件创建基于sensor_msgs模板的lidar_pkg
cd ~/catkin_ws/src/
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs
在lidar_pkg文件夹下src中创建lidar_node.cpp
6.4 编写订阅者节点
lidar_node源码
#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
void Lidarcallback(const sensor_msgs::LaserScan msg)
{float fMidDist = msg.ranges[180] ;ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);
}
int main(int argc,char *argv[])
{setlocale(LC_ALL, "" );ros::init(argc, argv,"lidar_node" );ros::NodeHandle n;ros::Subscriber lidar_sub = n.subscribe( " /scan", 10, &LidarCallback);ros::spin();return 0;
}
ctrl+s快捷保存
6.5 设置C++编译规则
打开CMake文件
add_executable(lidar_node src/lidar_node.cpp)
target_link_libraries(lidar_node${catkin_LIBRARIES}
)
ctrl+s快捷保存
ctrl+shift+b快捷编译
6.6 编译运行lidar_node节点
编译,打开终端
cd ~/catkin_ws/
catkin_make
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node
前方距离2.6m,然后在Gazebo中调整书柜,选择移动靠近机器人
可参照可以打开.wpr_simulation里的demo_lidar_data.cpp文件
7. 用python获取ROS激光雷达数据节点
7.1 运行模板样机
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun wpr_simulation deno_lidar_data.py
7.2 构思功能的思路和步骤
构思
实现步骤
- 构建一个新的软件包,包名叫做lidar_pkg。
- 在软件包中新建一个节点,节点名叫做lidar_node.py。
- 在节点中,向ROS大管家rospy申请订阅话题/scan,并设置回调函数为LidarCallback()。
- 构建回调函数LidarCallback(),用来接收和处理雷达数据。
- 调用loginfo()显示雷达检测到的前方障碍物距离。
7.3 创建lidar_pkg包
在工作空间src文件创建基于sensor_msgs模板的lidar_pkg,编译
cd ~/catkin_ws/src/
catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs
cd ..
catkin_make
在lidar_pkg文件夹下新建script文件夹中创建lidar_node.py
7.4 编写订阅者节点
先引入python包,设置中文utf-8显示
- ros>=20.04,采用python3
- ros<20.04,采用python
lidar_node.py源码
#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
def Lidarcallback(msg):dist = msg.ranges [ 180]rospy.loginfo("前方测距 ranges [ 180] = %f 米" , dist)
if _name ="_main_":rospy.init_node( "lidar_node" )lidar_sub = rospy.Subscriber( " /scan" ,LaserScan,Lidarcallback,queue_size=10)rospy.spin()
ctrl+s快捷保存
7.5 添加可执行的权限
在所在文件夹打开终端
cd catkin_ws/src/lidar_pkg/scripts/
ls
chmod +x lidar_node.py
ls
文件名变成绿色表示权限添加成功
7.6 运行lidar_node节点
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node.py
前方距离2.6m,然后在Gazebo中调整书柜,选择移动靠近机器人
可参照可以打开wpr_simulation里的script文件夹中创建lidar_node.py
8. 用C++编写激光雷达避障节点
基于前面学习的机器人运动控制和激光雷达数据,下面将联系这两点编写激光雷达避障节点
8.1 构思功能的思路和步骤
- 让大管家NodeHandle 发布速度控制话题/cmd_vel 。
- 构建速度控制消息包vel_cmd。
- 根据激光雷达的测距数值,实时调整机器人运动速度,避开障碍物。
8.2 修改lidar_node.cpp
见6.4源码
修改成如下lidar_node源码
#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
#include <geometry msgs/Twist.h>
ros::Publisher vel_pub;void Lidarcallback(const sensor_msgs::LaserScan msg)
{float fMidDist = msg.ranges[180] ;ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);geometry msgs::Twist vel_cmd ;if( fMidDist< 1.5){vel_cmd.angular.z = 0.3;}else{vel_cmd.linear.x = 0.05;}vel_pub.publish(vel_cmd);}
int main(int argc,char *argv[])
{setlocale(LC_ALL, "" );ros::init(argc, argv,"lidar_node" );ros::NodeHandle n;ros::Subscriber lidar_sub = n.subscribe( " /scan", 10, &LidarCallback);ros::spin();return 0;
}
ctrl+s快捷保存
ctrl+shift+b快捷编译
8.4 运行lidar_node节点
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node
机器人撞到障碍物,机器人有宽度
8.4 优化避障策略
当机器人检测前方障碍物时,最简单把转弯角度调大一点,原地转弯
lidar_node源码
#include <ros/ ros.h>
#include <sensor msgs/Laserscan.h>
#include <geometry msgs/Twist.h>
ros::Publisher vel_pub;
int ncount = 0;void Lidarcallback(const sensor_msgs::LaserScan msg)
{float fMidDist = msg.ranges[180] ;ROS_INFO("前方测距ranges [180]=%f 米", fMidDist);if(ncount > 0){ncount--;return;}geometry msgs::Twist vel_cmd ;if( fMidDist< 1.5){vel_cmd.angular.z = 0.3;ncount = 50;}else{vel_cmd.linear.x = 0.05;}vel_pub.publish(vel_cmd);}
int main(int argc,char *argv[])
{setlocale(LC_ALL, "" );ros::init(argc, argv,"lidar_node" );ros::NodeHandle n;ros::Subscriber lidar_sub = n.subscribe( " /scan", 10, &LidarCallback);ros::spin();return 0;
}
ctrl+s快捷保存
ctrl+shift+b快捷编译
然后在调试就OK啦
可参照开源项目wpr_simulation下的src文件夹的demo_lidar_behavior.cpp
9. 用python编写激光雷达避障节点
9.1 构思功能的思路和步骤
构思
实现步骤
- 让大管家rospy 发布速度控制话题/cmd_vel 。
- 构建速度控制消息包vel_cmd。
- 根据激光雷达的测距数值,实时调整机器人运动速度,避开障
碍物。
9.2 修改lidar_node.py
打开7.4编写lidar_node.py
lidar_node.py源码
#!/usr/bin/env python3
#coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twistcount =0def Lidarcallback(msg):global vel_pubglobal countdist = msg.ranges [ 180]rospy.loginfo("前方测距 ranges [ 180] = %f 米" , dist)if count > 0:count = count - 1returnvel_cmd = Twist()if dist< 1.5:vel_cmd .angular.z = 0.3else:vel_cmd.linear.x = 0.05vel_pub.publish(vel_cmd)if _name ="_main_":rospy.init_node( "lidar_node" )lidar_sub = rospy.Subscriber( " /scan" ,LaserScan,Lidarcallback,queue_size=10)vel_pub = rospy.Publisher( " /cmd_vel" ,Twist , queue_size=10)rospy.spin()
ctrl+s快捷保存
6.6 运行lidar_node节点
采用wpr_simulation开源工程,打开三个终端分别运行三条指令
roscore
roslaunch wpr_simulation wpb_simple.launch
rosrun lidar_pkg lidar_node.py
可参照可以打开wpr_simulation里的script文件夹中demo_lidar_behavior.py
10. 总结
本节学习了ROS机器人的激光雷达原理和数据查看,尝试C++和python两种语言编写,并且结合前面的机器人运动编写了避障节点,接下来会介绍机器人的IMU传感器的操作。🎉🎉🎉
相关文章:
【6. 激光雷达接入ROS】
欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】🥳🥳🥳 2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号👻👻👻,座右铭:脚踏实地,仰望星空&#…...
Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承
文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后:成员变量和方法的访问特点五、继承后:方法重写六、继承后:子类构造器的特点七、继承后:子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…...
[angstromctf 2023] 部分
这个比赛打了个开头就放弃了,最近放弃的比较多,国外的网太慢,国内的题太难。 Crypto ranch 这题直接给出密文这提示 rtkw{cf0bj_czbv_nvcc_y4mv_kf_kip_re0kyvi_uivjj1ex_5vw89s3r44901831} Caesar dressing is so 44 BC... 然后是加密程序…...
死信队列
死信队列 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息…...
基于YOLOv5的目标检测系统详解(附MATLAB GUI版代码)
摘要:本文重点介绍了基于YOLOv5目标检测系统的MATLAB实现,用于智能检测物体种类并记录和保存结果,对各种物体检测结果可视化,提高目标识别的便捷性和准确性。本文详细阐述了目标检测系统的原理,并给出MATLAB的实现代码…...
使用ChatGPT工具阅读文献的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
实训笔记1
实训笔记 第一天 1.安装tomcat或者其他大数据开发的路径不含中文及空格 2.和同开发 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FoApp1oX-1683039421826)(C:\Users\18249\AppData\Roaming\Typora\typora-user-images\image-20230422110823748…...
CCD视觉检测设备如何选择光源
CCD视觉检测设备的机器视觉系统对光源的要求很高,光源是决定图像质量的一个重要因素。那么,我们就来看看CCD图像加网设备和机器视觉系统光源的选择点——CCD图像加网设备。 CCD视觉检测设备机器视觉系统光源选择要点: 1. 对比度:…...
基于协同过滤的旅游推荐系统设计与实现(论文+源码)_kaic
1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 研究目标与意义 1.4 主要研究工作 2 相关理论介绍 2.1HTML与JavaScript 2.2 MySQL数据库 2.3 协同过滤算法简介 3 系统分析与设计 3.1 系统需求分析 3.1.1 功能性需求 3.1.2 安全性需求 3.2 系统总体架构 3.3 功能模块设计 3…...
代码随想录补打卡 746 使用最小花费爬楼梯
代码如下 func minCostClimbingStairs(cost []int) int { dp : make([]int,len(cost)1) //思路:设置一个花费数组dp,dp数组的长度等于之前的cost在加上1(1为楼顶元素) dp[0] 0 dp[1] 0 for i : 2 ; i < len(c…...
有理函数的不定积分习题
前置知识:有理函数的不定积分 习题 计算 ∫ x 3 1 x 4 − 3 x 3 3 x 2 − x d x \int \dfrac{x^31}{x^4-3x^33x^2-x}dx ∫x4−3x33x2−xx31dx 解: \qquad 将被积函数的分母因式分解得 x 4 − 3 x 3 3 x 2 − x x ( x − 1 ) 3 x^4-3x^33x^2-xx…...
PS滤镜插件-Nik Collection介绍
PS滤镜插件-Nik Collection介绍 什么是Nik CollectionNik Collection都包含什么? 什么是Nik Collection Nik Collection是一款PS滤镜插件套装,其包含了八款PS插件,功能涵盖修图、调色、降噪、胶片滤镜等方面。Nik Collection 作为很多摄影师…...
力扣刷题2023-05-04-1——题目:2614. 对角线上的质数
题目: 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数,返回 0 。 注意: 如果某个整数大于 1 ,且不存在除 1 和自身之外的正整数因子,…...
【Java笔试强训 2】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥排序子…...
术数基础背诵口诀整理
物象对应 五行方位天干神兽季节气候星宿生成数脏器木东甲乙青龙春风岁八肝火南丙丁朱雀夏热荧惑七心土中戊己?长夏湿镇五脾金西庚辛白虎秋燥太白九肺水北壬癸玄武冬寒辰六肾 口诀:东方甲乙青龙木,南方丙丁朱雀火,戊己勾陈腾蛇土&…...
Linux 基础语法 -2
如果我们以后再Linux当中 写了一些命名,导致程序我们不能进行操作了,如这个死循环: 他就会一直输出 "hello Linux" ,我们就使用 ctrl c 来终止因为程序或者指令异常,而导致我们无法进行指令输入ÿ…...
深度学习框架发展趋势
深度学习方法的发展是推动深度学习框架进步的最大动力,因此深度学习框架的功能和设计应顺应 算法和模型的发展趋势: 第一,易用性。深度学习领域仍处于快速发展期,参与者和学习者不断增加,新模型大量提出。因 此&#…...
Mysql为json字段创建索引的两种方式
目录 一、前言二、通过虚拟列添加索引(Secondary Indexes and Generated Columns)三、多值索引(Using multi-valued Indexes)四、官网地址 一、前言 JSON 数据类型是在mysql5.7版本后新增的,同 TEXT,BLOB …...
cassandra数据库入门-4
插入数据 在表中创建数据 您可以使用命令 INSERT 将数据插入表中一行的列中。 下面给出了在表中创建数据的语法。 INSERT INTO <tablename> (<column1 name>, <column2 name>....) VALUES (<value1>, <value2>....) USING <option> 例子…...
微服务学习——分布式搜索
初识elasticsearch 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域…...
ChatGPT根据销售数据、客户反馈、财务报告,自动生成报告,并根据不同利益方的需要和偏好进行调整?
该场景对应的关键词库(24个): 汇报对象身份(下属、跨部门平级、领导)、销售数据(销售额、销售量、销售渠道)、财务报告(营业收入、净利润、成本费用)、市场分析…...
Flask开发之环境搭建
目录 1、安装flask 2、创建Flask工程 编辑 3、初始化效果 4、运行效果 5、设置Debug模式 6、设置Host 7、设置Port 8、在app.config中添加配置 1、安装flask 如果电脑上从没有安装过flask,则在命令行界面输入以下命令: pip install flask 如果电…...
Java集合框架与ArrayList、LinkedList的区别
文章目录 Java集合框架与ArrayList、LinkedList的区别集合框架ArrayList特点操作 LinkedList特点操作 区别代码实践注意事项 Java集合框架与ArrayList、LinkedList的区别 在Java中,集合框架是非常重要的一部分。集合框架提供了各种数据结构和算法,可以方…...
python-pandas库
目录 目录 目录 1.pandas库简介(https://www.gairuo.com/p/pandas-overview) 2.pandas库read_csv方法(https://zhuanlan.zhihu.com/p/340441922?utm_mediumsocial&utm_oi27819925045248) 1.pandas库简介(http…...
C++学习day--01 C生万物
1、C/C学习中遇到的问题: 1. 大部分初学者,学习 C/C 都是从入门到放弃。 C/C太难吗? 2. 90% 以上的初学者,学完 C/C 以后,考试完了,书看完了, 但还是不会做项目 是学的不够好吗࿱…...
链表及链表的常见操作和用js封装一个链表
最近在学数据结构和算法,正好将学习的东西记录下来,我是跟着一个b站博主学习的,是使用js来进行讲解的,待会也会在文章后面附上视频链接地址,大家想学习的可以去看看 本文主要讲解单向链表,双向链表后续也会…...
源码安装工具checkinstall使用
每当从源码包编译程序时,安装过程很愉快,但当你想删除时,就很费脑筋了,你可能要去找你当时编译的目录执行make unistall,当然更可能的是,你早就把源码包给删除了,对于强迫症来说,这显…...
离散数学集合论
集合论 主要内容 集合基本概念 属于、包含幂集、空集文氏图等 集合的基本运算 并、交、补、差等 集合恒等式 集合运算的算律,恒等式的证明方法 集合的基本概念 集合的定义 集合没有明确的数学定义 理解:由离散个体构成的整体称为集合,…...
TypeScript 基础
类型注解 类型注解:约束变量的类型 示例代码: let age:number 18 说明:代码中的 :number 就是类型注解 解释:约定了类型,就只能给变量赋值该类型的值,否则,就会报错 错误演示:…...
MySQL InnoDB引擎 和 Oracle SGA
MySQL InnoDB引擎和Oracle SGA有以下异同: 异同点: 两者都是用来管理数据存储和访问的。 它们都可以通过调整参数来优化性能。 它们都支持事务处理和ACID属性。 它们都可以通过备份和恢复来保护数据。 异点: MySQL InnoDB引擎是一种存储…...
怎么做点击图片进网站/注册域名在哪里注册
一、OSPF的基本概念和工作过程 1、OSPF路由协议概述 自治系统(AS),划分自治系统的原因:收敛时间 内部网关协议(IGP)——RIP、OSPF 外部网关协议(EGP)——BGP OSPF工作过程: 建立邻接关系—…...
网站空间面板/seo关键词排名优化价格
元数据:文件或目录的一引起描述信息,如大小、时间信息、是否加密或压缩、存储位置信息等,将这些描述信息统称为文件或目录的元数据。 FAT文件系统中最重要的结构:…...
网站页面优化方法有哪些内容/网站推广策划书模板
while(fabs(x0-x1)>1e-6);return x1;}11: 第11题下列程序定义了nn的二维数组,并在主函数中自动赋值。请编写函数 fun(int a[][n]),该函数的功能是:使数组左下半三角元素中的值全部置成0。答案:int fun(int a[][N]){int I,j;for(i0;i&#…...
销售网站是什么/一般开车用什么导航最好
LRU缓存问题:https://leetcode.cn/problems/lru-cache/ LFU缓存问题:https://leetcode.cn/problems/lfu-cache/ 刷上述两题时顺带复习一波OS调度算法,望着镜子中我那与智慧成反比的发量,我开心的笑了… 😃 进程调度算…...
Wordpress主题禁用水平滚动/河南网站排名优化
微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。 前言 哨兵和集群的两种高可用解决方案,但是两者在保证高可用上的实现基本是一致的,因为集群模式的高可用解决方案基本就是“照搬”哨兵模式的。 集群可以认为就是用来代替哨兵的…...
网站建设的常见问题/谷歌推广费用
Nginx是什么? 开源且高性能、可靠的HTTP中间件、代理服务。 类似于nginx的? HTTPD-apache基金会、IIS-微软、GWS-Google 为什么使用nginx? IO多路复用epoll 轻量级(功能模块少、代码模块化) CPU亲和:…...