11.1 pcl_ros的点云学习

本文是看了两个博主的内容,整理在这里是为了以后用时方便查找,更容易理解。引用的博文路径如下(本人也是刚开始看PCL的运用,本文是完全抄下面博主的内容,觉得这位博主写的很详细很清楚,并且自己运行了一遍有效):

ROS入门——PCL激光雷达点云处理(1)_pcl::torosmsg-CSDN博客

以下功能的实现是我在ubuntu20.04的环境下,搭建好了ros环境后进行的。ros环境的搭建可以参考以下博文:

3.ubuntu20.04环境的ros搭建-CSDN博客    或者

4.livox hap(大疆激光雷达)环境搭建_livox hap激光雷达-CSDN博客

下面进行pcl的实现

1、在home下新建文件夹

mkdir -p ~/catkin_ws/src

2、进入src文件夹并初始化

cd ~/catkin_ws/src
catkin_init_workspace

执行完该命令后,src目录下会多出一个 CMakeLists.txt 文件,这个文件一般不需要我们修改。

3、 返回到catkin_ws下,进行编译(注意:每次编译必须在这个ws工作空间下才能编译成功!)

cd ~/catkin_ws/
catkin_make

执行完该命令后,发现工作空间catkin_ws中有三个目录: build  devel  src。可以从5、看到它们的作用。

4、source一下将工作空间加入环境变量

source devel/setup.bash

注意: 这一步只重新加载了setup.bash文件。如果关闭并打开一个新的命令行窗口,也需要再输入该命令将得到同样的效果。

所以建议采用一劳永逸的方法:.

5、.bashrc文件在用户的home文件夹(/home/USERNAME/.bashrc)下。每次用户打开终端,这个文件会加载命令行窗口或终端的配置。所以可以添加命令或进行配置以方便用户使用。在bashrc文件添加source命令:
 

echo "source ~/catkin_ws/devel/setup.bash">> ~/.bashrc

或者也可以打开.bashrc文件采用手动修改的方式添加source ~/catkin_ws/devel/setup.bash:

gedit ~/.bashrc

添加完毕,你的bashrc文件应该有两句source:

添加完后,在 .bashrc的同目录下运行

~/.bashrc

 5、理解工作空间

工作空间结构:

源空间(src文件夹),放置了功能包、项目、复制的包等。在这个空间中,,最重要的一个文件是CMakeLists.txt。当在工作空间中配置包时,src文件夹中有CMakeLists.txt因为cmake调用它。这个文件是通过catkin_init_workspace命令创建的。

编译空间(build space):在build文件夹里,cmake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。

开发空间(Development(devel)space):devel文件夹用来保存编译后的程序,这些是无须安装就能用来测试的程序。一旦项目通过测试,就可以安装或导出功能包从而与其他开发人员分享。
 

一、创建节点发布点云数据并可视化

1、在ros工作空间的src目录下新建包(包含依赖项)

catkin_create_pkg chapter10_tutorials pcl_conversions pcl_ros pcl_msgs sensor_msgs

2、在软件包中新建src目录

rospack profile
roscd chapter10_tutorials
mkdir src

3、在src目录下新建pcl_create.cpp,该程序创建了100个随机坐标的点云并以1Hz的频率,topic为“pcl_output"发布。frame设为odom。

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>main (int argc, char **argv)
{ros::init (argc, argv, "pcl_create");ros::NodeHandle nh;ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);pcl::PointCloud<pcl::PointXYZ> cloud;sensor_msgs::PointCloud2 output;// Fill in the cloud datacloud.width  = 100;cloud.height = 1;cloud.points.resize(cloud.width * cloud.height);for (size_t i = 0; i < cloud.points.size (); ++i){cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}//Convert the cloud to ROS messagepcl::toROSMsg(cloud, output);output.header.frame_id = "odom";ros::Rate loop_rate(1);while (ros::ok()){pcl_pub.publish(output);ros::spinOnce();loop_rate.sleep();}return 0;
}

4、修改cmakelist.txt内容

cmake_minimum_required(VERSION 2.8.3)
project(chapter10_tutorials)
find_package(catkin REQUIRED COMPONENTSpcl_conversionspcl_rosroscppsensor_msgsrospy
)find_package(PCL REQUIRED)
catkin_package()include_directories(${catkin_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}
)link_directories(${PCL_LIBRARY_DIRS})add_executable(pcl_create src/pcl_create.cpp)
target_link_libraries(pcl_create ${catkin_LIBRARIES} ${PCL_LIBRARIES})

5、进入工作空间编译包

cd ~/catkin_ws
catkin_make --pkg chapter10_tutorials

6、若编译成功,新窗口打开ros,新窗口运行pcl_create节点

roscore
rosrun chapter10_tutorials pcl_create

7、新窗口打开rviz,add topic"pcl_output",Global options 设置Frame为odom

rviz

二、加载pcd文件、保存点云为pcd文件

1、加载pcd文件并发布为pcl_output点云:在src下新建pcl_read.cpp,内容为:

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>main(int argc, char **argv)
{ros::init (argc, argv, "pcl_read");ros::NodeHandle nh;ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output", 1);sensor_msgs::PointCloud2 output;pcl::PointCloud<pcl::PointXYZ> cloud;pcl::io::loadPCDFile ("test_pcd.pcd", cloud);pcl::toROSMsg(cloud, output);output.header.frame_id = "odom";ros::Rate loop_rate(1);while (ros::ok()){pcl_pub.publish(output);ros::spinOnce();loop_rate.sleep();}return 0;
}

2、保存topic发布的点云为pcd文件,在src下新建pcl_write.cpp内容为:

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>void cloudCB(const sensor_msgs::PointCloud2 &input)
{pcl::PointCloud<pcl::PointXYZ> cloud;pcl::fromROSMsg(input, cloud);pcl::io::savePCDFileASCII ("write_pcd_test.pcd", cloud);
}main (int argc, char **argv)
{ros::init (argc, argv, "pcl_write");ros::NodeHandle nh;ros::Subscriber bat_sub = nh.subscribe("pcl_output", 10, cloudCB);ros::spin();return 0;
}

 3、添加内容到cmakelist.txt

add_executable(pcl_read src/pcl_read.cpp)
add_executable(pcl_write src/pcl_write.cpp)target_link_libraries(pcl_read ${catkin_LIBRARIES} ${PCL_LIBRARIES})
target_link_libraries(pcl_write ${catkin_LIBRARIES} ${PCL_LIBRARIES})

4、在catkin_ws空间下编译包(同上)

5、打开不同的窗口,在pcd文件夹下分别运行节点(因为pcl_read要读取pcd文件)

roscore
roscd chapter10_tutorials/data && rosrun chapter10_tutorials pcl_read
roscd chapter10_tutorials/data && rosrun chapter10_tutorials pcl_write

    注意:以上3个命令要打开3个新的终端窗口,依次运行即可。

6、可视化同上

三、cloud_viewer可视化pcd文件的点云

新建cpp文件,所有步骤同上。

#include <iostream>
#include <ros/ros.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>class cloudHandler
{
public:cloudHandler(): viewer("Cloud Viewer"){pcl::PointCloud<pcl::PointXYZ> cloud;pcl::io::loadPCDFile ("0.pcd", cloud);viewer.showCloud(cloud.makeShared());viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB, this);}void timerCB(const ros::TimerEvent&){if (viewer.wasStopped()){ros::shutdown();}}protected:ros::NodeHandle nh;pcl::visualization::CloudViewer viewer;ros::Timer viewer_timer;
};main (int argc, char **argv)
{ros::init (argc, argv, "pcl_filter");cloudHandler handler;ros::spin();return 0;
}

编译并在pcd数据文件夹下运行节点,可得下图。可以按住ctrl键滑轮放大缩小。

四、点云预处理——滤波和缩减采样

1、滤波删除离群值pcl_filter.cpp,处理流程同上

#include <iostream>
#include <ros/ros.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/filters/statistical_outlier_removal.h>class cloudHandler
{
public:cloudHandler(): viewer("Cloud Viewer"){pcl::PointCloud<pcl::PointXYZ> cloud;pcl::PointCloud<pcl::PointXYZ> cloud_filtered;pcl::io::loadPCDFile ("0.pcd", cloud);pcl::StatisticalOutlierRemoval<pcl::PointXYZ> statFilter;//统计离群值算法statFilter.setInputCloud(cloud.makeShared());//输入点云statFilter.setMeanK(10);//均值滤波statFilter.setStddevMulThresh(0.4);//方差0.4statFilter.filter(cloud_filtered);//输出结果到点云viewer.showCloud(cloud_filtered.makeShared());viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB, this);}void timerCB(const ros::TimerEvent&){if (viewer.wasStopped()){ros::shutdown();}}protected:ros::NodeHandle nh;pcl::visualization::CloudViewer viewer;ros::Timer viewer_timer;
};main (int argc, char **argv)
{ros::init (argc, argv, "pcl_filter");cloudHandler handler;ros::spin();return 0;
}

滤波结果:

2、滤波以后缩减采样pcl_dawnSample.cpp,采用体素栅格的方法,将点云分割为若干的小立方体(体素),以体素重心的点代表这个体素中所有的点。

public:cloudHandler(): viewer("Cloud Viewer"){pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::PointCloud<pcl::PointXYZ> cloud_filtered;pcl::PointCloud<pcl::PointXYZ> cloud_downsampled;pcl::io::loadPCDFile ("0.pcd", cloud);//剔除离群值pcl::StatisticalOutlierRemoval<pcl::PointXYZ> statFilter;statFilter.setInputCloud(cloud.makeShared());statFilter.setMeanK(10);statFilter.setStddevMulThresh(0.2);statFilter.filter(cloud_filtered);
//缩减采样pcl::VoxelGrid<pcl::PointXYZ> voxelSampler;//初始化 体素栅格滤波器voxelSampler.setInputCloud(cloud_filtered.makeShared());//输入点云voxelSampler.setLeafSize(0.01f, 0.01f, 0.01f);//每个体素的长宽高0.01mvoxelSampler.filter(cloud_downsampled);//输出点云结果viewer.showCloud(cloud_downsampled.makeShared());viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB, this);}

缩减采样结果:

五、点云预处理——点云分割

1、pcl_segmentation.cpp采用RANSAC算法提取点云的plane平面。处理步骤同一

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>main(int argc, char **argv)
{ros::init (argc, argv, "pcl_filter");ros::NodeHandle nh;//初始化pcl::PointCloud<pcl::PointXYZ> cloud;pcl::PointCloud<pcl::PointXYZ> cloud_filtered;pcl::PointCloud<pcl::PointXYZ> cloud_downsampled;pcl::PointCloud<pcl::PointXYZ> cloud_segmented;ros::Publisher pcl_pub0 = nh.advertise<sensor_msgs::PointCloud2> ("pcl_cloud", 1);ros::Publisher pcl_pub1 = nh.advertise<sensor_msgs::PointCloud2> ("pcl_segment", 1);ros::Publisher ind_pub = nh.advertise<pcl_msgs::PointIndices>("point_indices", 1);ros::Publisher coef_pub = nh.advertise<pcl_msgs::ModelCoefficients>("planar_coef", 1);sensor_msgs::PointCloud2 output0;sensor_msgs::PointCloud2 output1;pcl::io::loadPCDFile ("0.pcd", cloud);pcl::toROSMsg(cloud, output0);output0.header.frame_id = "odom";
//剔除离群值pcl::StatisticalOutlierRemoval<pcl::PointXYZ> statFilter;statFilter.setInputCloud(cloud.makeShared());statFilter.setMeanK(10);statFilter.setStddevMulThresh(0.2);statFilter.filter(cloud_filtered);
//体素栅格法下采样pcl::VoxelGrid<pcl::PointXYZ> voxelSampler;voxelSampler.setInputCloud(cloud_filtered.makeShared());voxelSampler.setLeafSize(0.01f, 0.01f, 0.01f);voxelSampler.filter(cloud_downsampled);
//RANSAC算法 分割pcl::ModelCoefficients coefficients;//初始化模型系数pcl::PointIndices::Ptr inliers(new pcl::PointIndices());//初始化索引参数pcl::SACSegmentation<pcl::PointXYZ> segmentation;//创建算法segmentation.setModelType(pcl::SACMODEL_PLANE);//设置分割模型为平面模型segmentation.setMethodType(pcl::SAC_RANSAC);//设置迭代算法segmentation.setMaxIterations(1000);//设置最大迭代次数segmentation.setDistanceThreshold(0.01);//设置到模型的最大距离segmentation.setInputCloud(cloud_downsampled.makeShared());//输入点云segmentation.segment(*inliers, coefficients);//输出点云结果  ×inliers是结果点云的索引,coe是模型系数
//发布模型系数pcl_msgs::ModelCoefficients ros_coefficients;pcl_conversions::fromPCL(coefficients, ros_coefficients);//pcl->msg//发布抽样的内点索引pcl_msgs::PointIndices ros_inliers;pcl_conversions::fromPCL(*inliers, ros_inliers);//创建分割点云,从点云中提取内点pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud_downsampled.makeShared());extract.setIndices(inliers);extract.setNegative(false);extract.filter(cloud_segmented);pcl::toROSMsg(cloud_segmented, output1);output1.header.frame_id = "odom";ros::Rate loop_rate(1);while (ros::ok()){pcl_pub0.publish(output0);pcl_pub1.publish(output1);ind_pub.publish(ros_inliers);coef_pub.publish(ros_coefficients);//发布ros::spinOnce();loop_rate.sleep();}return 0;
}

出现警告:

[pcl::VoxelGrid::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow.

滤波缩减采样后的结果:

平面滤波结果:

滤波缩减采样结果:

平面滤波结果:

2、(这是一个错误的程序,等以后学明白了再来解释为什么错误。viewer可以显示分割出的点云,不知道为啥没有发布成功,在rviz中不能显示,rostopic echo topic 也不能显示消息。)

#include <iostream>
#include <ros/ros.h>
#include <pcl/visualization/cloud_viewer.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/point_cloud.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>class cloudHandler
{
public:cloudHandler(): viewer("Cloud Viewer"){
//初始化pcl::PointCloud<pcl::PointXYZ> cloud;pcl::PointCloud<pcl::PointXYZ> cloud_filtered;pcl::PointCloud<pcl::PointXYZ> cloud_downsampled;pcl::PointCloud<pcl::PointXYZ> cloud_segmented;pcl_pubb = nh.advertise<sensor_msgs::PointCloud2>("pcl_cloud", 1);pcl_pub = nh.advertise<sensor_msgs::PointCloud2>("pcl_segmented", 1);ind_pub = nh.advertise<pcl_msgs::PointIndices>("point_indices", 1);coef_pub = nh.advertise<pcl_msgs::ModelCoefficients>("planar_coef", 1);pcl::io::loadPCDFile ("test_pcd.pcd", cloud);
//剔除离群值pcl::StatisticalOutlierRemoval<pcl::PointXYZ> statFilter;statFilter.setInputCloud(cloud.makeShared());statFilter.setMeanK(10);statFilter.setStddevMulThresh(0.2);statFilter.filter(cloud_filtered);
//体素栅格法下采样pcl::VoxelGrid<pcl::PointXYZ> voxelSampler;voxelSampler.setInputCloud(cloud_filtered.makeShared());voxelSampler.setLeafSize(0.01f, 0.01f, 0.01f);voxelSampler.filter(cloud_downsampled);//RANSAC算法 分割pcl::ModelCoefficients coefficients;//初始化模型系数pcl::PointIndices::Ptr inliers(new pcl::PointIndices());//初始化索引参数pcl::SACSegmentation<pcl::PointXYZ> segmentation;//创建算法segmentation.setModelType(pcl::SACMODEL_PLANE);//设置分割模型为平面模型segmentation.setMethodType(pcl::SAC_RANSAC);//设置迭代算法segmentation.setMaxIterations(1000);//设置最大迭代次数segmentation.setDistanceThreshold(0.01);//设置到模型的最大距离segmentation.setInputCloud(cloud_downsampled.makeShared());//输入点云segmentation.segment(*inliers, coefficients);//输出点云结果  ×inliers是结果点云的索引,coe是模型系数
//发布模型系数pcl_msgs::ModelCoefficients ros_coefficients;pcl_conversions::fromPCL(coefficients, ros_coefficients);//pcl->msgcoef_pub.publish(ros_coefficients);//发布
//发布抽样的内点索引pcl_msgs::PointIndices ros_inliers;pcl_conversions::fromPCL(*inliers, ros_inliers);ind_pub.publish(ros_inliers);//创建分割点云,从点云中提取内点pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud_downsampled.makeShared());extract.setIndices(inliers);extract.setNegative(false);extract.filter(cloud_segmented);//发布点云sensor_msgs::PointCloud2 output;pcl::toROSMsg(cloud_segmented, output);pcl_pub.publish(output);sensor_msgs::PointCloud2 outputt;pcl::toROSMsg(cloud,outputt);pcl_pubb.publish(outputt);//可视化viewer.showCloud(cloud_segmented.makeShared());viewer_timer = nh.createTimer(ros::Duration(0.1), &cloudHandler::timerCB, this);}void timerCB(const ros::TimerEvent&){if (viewer.wasStopped()){ros::shutdown();}}protected:ros::NodeHandle nh;pcl::visualization::CloudViewer viewer;ros::Timer viewer_timer;ros::Publisher pcl_pubb,pcl_pub, ind_pub, coef_pub;
};main (int argc, char **argv)
{ros::init (argc, argv, "pcl_filter");cloudHandler handler;ros::spin();return 0;
}

六、播放bag并可视化激光雷达点云

1、查看无人艇的视频和雷达数据20200116.bag信息:

rosbag info 20200116.bag

发现时长约3分钟,topic有fix(卫星导航数据)、heading(姿态四元数)、points_raw(激光雷达点云)、rosout(节点图)、camera_info(摄像机信息)、image_raw(摄像机图片)、time_reference(时间)、vel(速度?角速度?)

2、回放bag文件:

rosbag play 20200116.bag

3、打开rviz:

rosrun rviz rviz

4、点击add--->add topic--->Pointcloud2(或 image)

5、Global Options :Fixed Frame 改成pandar

(刚开始没有改fixed frame,add topic以后总是显示错误,后来在src下的雷达的包里看到readme文件里面写着:4. Change fixed frame to `pandar`。所以在vriz里修改了,图像和点云都可以显示了。

七、其他

1、将bag文件中的点云直接转成pcd文件,每帧一个pcd文件。

 rosrun pcl_ros bag_to_pcd data.bag /points_raw /media/xiaoxiong/小狗熊/无人艇/GKSdata



原文链接:https://blog.csdn.net/weixin_40820983/article/details/105803811

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

【J-Flash基本使用总结】

【J-Flash基本使用总结】 VX&#xff1a;hao541022348 ■ 烧录文件■ 创建新的工程■ 烧录模式-SWD模式■ J-Flash下载程序到单片机 ■ J-Flash拼接多个hex或bin文件■ J-Flash读单片机的option byte■ J-Flash读单片机Flash数据■ 将读出来的文件用jflash烧录到其他的芯片■ 设…

Kafka集群与可靠性

Kafka集群与可靠性 1.Kafka集群搭建实战 使用两台Linux服务器&#xff1a;一台192.168.182.137 一台192.168.182.138 安装kafka首先&#xff0c;我们需要配置java环境变量&#xff08;这里就略过了&#xff09; mkdir /opt/kafka #上传压缩包kafka_2.13-3.3.1.tgz并解压 ta…

imgaug库指南(28):从入门到精通的【图像增强】之旅(万字长文)

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

java客户端连接redis并设置序列化处理

1、导入依赖 <!--继承父依赖--> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup paren…

数学建模常见算法的通俗理解(更新中)

目录 1.层次分析法&#xff08;结合某些属性及个人倾向&#xff0c;做出某种决定&#xff09; 1.1 粗浅理解 1.2 算法过程 1.2.1 构造判断矩阵 1.2.2 计算权重向量 1.2.3 计算最大特征根 1.2.4 计算C.I.值 1.2.5 求解C.R.值 1.2.6 判断一致性 1.2.7 计算总得分 2 神经…

CleanMyMac X .4.14.7如何清理 Mac 系统?

细心的用户发现苹果Mac电脑越用越慢&#xff0c;其实这种情况是正常的&#xff0c;mac电脑用久了会产生很多的缓存文件&#xff0c;如果不及时清理会影响运行速度。Mac系统在使用过程中都会产生大量系统垃圾&#xff0c;如不需要的系统语言安装包&#xff0c;视频网站缓存文件&…

Microsoft Word 设置底纹

Microsoft Word 设置底纹 References 打开文档页面&#xff0c;选中特定段落或全部文档 在“段落”中单击“边框”下三角按钮 在列表中选择“边框和底纹”选项 在“边框和底纹”对话框中单击“底纹”选项卡 在图案样式和图案颜色列表中设置合适颜色的底纹&#xff0c;单击“确…

Spark原理——逻辑执行图

逻辑执行图 明确逻辑计划的边界 在 Action 调用之前&#xff0c;会生成一系列的RDD,这些RDD之间的关系&#xff0c;其实就是整个逻辑计划 val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source") val sc new SparkContext(conf)v…

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…

使用 vsCode创建GO项目

最近回顾了一下go的使用&#xff1a;具体操作看下面的参考连接&#xff0c;下面只描述一些踩过的坑&#xff1a; 1. go安装配置 安装go->配置go环境变量 推荐官网下载&#xff0c;速度很快&#xff1b; 这里需要配置五个参数&#xff1a;GOPATH/GOROOT/Path、GO111MODULE/…

stable-diffusion 学习笔记

必看文档&#xff1a; 万字长篇&#xff01;超全Stable Diffusion AI绘画参数及原理详解 - 知乎 &#xff08;提示词&#xff09;语法控制 常用语法&#xff1a; 加权&#xff1a;() 或 {} 降权&#xff1a;[](word)//将括号内的提示词权重提高 1.1 倍 ((word))//将括号内的提示…