多机编队—(3)Fast_planner无人机模型替换为Turtlebot3模型实现无地图的轨迹规划

news2024/10/17 7:44:37

文章目录

  • 前言
  • 一、模型替换
  • 二、Riz可视化
  • 三、坐标变换
  • 四、轨迹规划
  • 最后


前言

前段时间已经成功将Fast_planner配置到ubuntu机器人中,这段时间将Fast_planner中的无人机模型替换为了Turtlebot3_waffle模型,机器人识别到环境中的三维障碍物信息,并完成无地图的轨迹规划。


一、模型替换

先把turtlebot3功能包拷贝到配置成功的Fast_planner工作空间下,turtlebot3中含有turtlebot3_description功能包,里面包含了turtlebot3所有的模型文件。

普通在gazebo中加载turtlebot3的模型文件如图所示:

在这里插入图片描述
但Fast_planner需要环境中的三维信息,以进行路径的规划,故这里需要将2D激光雷达替换为3D激光雷达,如下所示在turtlebot3_waffle.urdf.xacro文件中加入VLP-16激光雷达,以获取环境中的三维信息。

<?xml version="1.0" ?>
<robot name="turtlebot3_waffle" xmlns:xacro="http://ros.org/wiki/xacro">

  <xacro:include filename="$(find turtlebot3_description)/urdf/common_properties.xacro"/>
  <xacro:include filename="$(find turtlebot3_description)/urdf/turtlebot3_waffle.gazebo.xacro"/>

  <xacro:property name="support_length" value="0.3" />      <!--0.3-->

   <xacro:arg name="gpu" default="false"/>
    <xacro:property name="gpu" value="$(arg gpu)" />
    <xacro:arg name="organize_cloud" default="true"/>
    <xacro:property name="organize_cloud" value="$(arg organize_cloud)" />

   <xacro:property name="base_z_size" value="0.122" />        <!--0.122-->
   <xacro:include filename="$(find turtlebot3_description)/urdf/sensors/inertial.xacro" />
   <xacro:include filename="$(find turtlebot3_description)/urdf/sensors/laser_support.xacro" />
    <xacro:include filename="$(find velodyne_description)/urdf/VLP-16.urdf.xacro"/>
    <xacro:VLP-16 parent="support" name="velodyne" topic="/velodyne_points" organize_cloud="${organize_cloud}" hz="10" samples="400" gpu="${gpu}">
          <origin xyz="0 0 ${support_length/4}" rpy="0 0 0" /> 
    </xacro:VLP-16>

    <xacro:include filename="$(find turtlebot3_description)/urdf/sensors/imu.xacro"/>
    <xacro:imu sensor_name="imu" parent_link="base_link">
    <origin rpy="0 0 0" xyz="-0.064 0 ${base_z_size/2}"/> 
    </xacro:imu>

其中的关键点为(上面代码也已展现出):需要将相关的模型加载文件放在设置的路径下。

然后在gazebo中加载新模型:

在这里插入图片描述

二、Riz可视化

<launch>
  <node name="rvizvisualisation" pkg="rviz" type="rviz" output="log" args="-d $(find plan_manage)/config/traj.rviz" />
</launch>

在这里插入图片描述

三、坐标变换

在模型加装VLP-16激光雷达时设置了雷达的话题:topic=“/velodyne_points”,为使雷达能得到地图中障碍物信息。

写下面的一段代码实现订阅激光雷达(如Velodyne)产生的点云数据,并将这些点云从base_link的坐标系转换到odom坐标系。转换后的点云数据再发布出去,以供其他节点使用。

#include <ros/ros.h>
#include <sensor_msgs/PointCloud.h>
#include <tf2_ros/transform_listener.h>
#include <tf2_sensor_msgs/tf2_sensor_msgs.h>
#include <tf2/transform_datatypes.h>

ros::Publisher points_pub;
tf2_ros::Buffer tfBuffer;

void pointCloudCallback(const sensor_msgs::PointCloud2::ConstPtr &msg) {

    try {
        geometry_msgs::TransformStamped transformStamped = tfBuffer.lookupTransform("odom", "base_link", ros::Time(0));

        sensor_msgs::PointCloud2 transformed_cloud;
        tf2::doTransform(*msg, transformed_cloud, transformStamped);

        transformed_cloud.header.frame_id = "odom";
        points_pub.publish(transformed_cloud);
    } catch(tf2::TransformException &e) {
        ROS_WARN("Failed to transform point cloud: %s", e.what());
    }

}

int main(int argc, char **argv) 
{
    ros::init(argc, argv, "point_cloud_transform_node");
    ros::NodeHandle nh;
    ros::Subscriber points_sub = nh.subscribe("/velodyne_points", 10, pointCloudCallback);

    points_pub = nh.advertise<sensor_msgs::PointCloud2>("point_cloud_map", 10);

    tf2_ros::TransformListener tfListener(tfBuffer);
    ros::spin();

    return 0;
}

在这里插入图片描述

四、轨迹规划

该部分借助Fast_planner来实现,前端通过混合A*生成初始路径,后端在对其进行B样条优化和重规划。
为使Turtlebot3使用下面是配置的接口文件:

<launch>
  <!-- size of map, change the size in x, y, z according to your application -->
  <arg name="map_size_x" value="40.0"/>
  <arg name="map_size_y" value="40.0"/>
  <arg name="map_size_z" value="0.5 "/>

  <!-- topic of your odometry such as VIO or LIO -->
  <arg name="odom_topic" value="/odom" />
  <!-- main algorithm params -->
  <include file="$(find plan_manage)/launch/lidar.xml">
    <arg name="map_size_x_" value="$(arg map_size_x)"/>
    <arg name="map_size_y_" value="$(arg map_size_y)"/>
    <arg name="map_size_z_" value="$(arg map_size_z)"/>
    <arg name="odometry_topic" value="$(arg odom_topic)"/>

    <!-- camera pose: transform of camera frame in the world frame -->
    <!-- depth topic: depth image, 640x480 by default -->
    <!-- don't set cloud_topic if you already set these ones! -->
    <arg name="camera_pose_topic" value="/pcl_render_node/camera_pose"/><!--geometry_msgs::PoseStamped-->
    <arg name="depth_topic" value="/pcl_render_node/depth"/>

    <!-- topic of point cloud measurement, such as from LIDAR  -->
    <!-- don't set camera pose and depth, if you already set this one! -->
    <arg name="cloud_topic" value="/point_cloud_map"/>

    <!-- intrinsic params of the depth camera -->
    <arg name="cx" value="321.04638671875"/>
    <arg name="cy" value="243.44969177246094"/>
    <arg name="fx" value="387.229248046875"/>
    <arg name="fy" value="387.229248046875"/>

    <!-- maximum velocity and acceleration the drone will reach -->
    <arg name="max_vel" value="3" />
    <arg name="max_acc" value="2" />

    <!-- 1: use 2D Nav Goal to select goal  -->
    <!-- 2: use global waypoints below  -->
    <arg name="flight_type" value="1" />
    
    <!-- global waypoints -->
    <!-- If flight_type is set to 2, the drone will travel these waypoints one by one -->
    <arg name="point_num" value="3" />

    <arg name="point0_x" value="2" />
    <arg name="point0_y" value="0" />
    <arg name="point0_z" value="0" />

    <!-- set more waypoints if you need -->
    <arg name="point1_x" value="2" />
    <arg name="point1_y" value="-5" />
    <arg name="point1_z" value="0" />

    <arg name="point2_x" value="5.0" />
    <arg name="point2_y" value="-10.0" />
    <arg name="point2_z" value="0.0" />
    
  </include>

  <!-- trajectory server -->
  <node pkg="plan_manage" name="traj_server" type="traj_server" output="screen">
    <remap from="/position_cmd" to="/planning/pos_cmd"/>

    <remap from="/odom_world" to="$(arg odom_topic)"/>
    <param name="traj_server/time_forward" value="1.5" type="double"/>
  </node>

  <node pkg="waypoint_generator" name="waypoint_generator" type="waypoint_generator" output="screen">
    <remap from="~odom" to="$(arg odom_topic)"/>        
    <remap from="~goal" to="/move_base_simple/goal"/>
    <remap from="~traj_start_trigger" to="/traj_start_trigger" />
    <param name="waypoint_type" value="manual-lonely-waypoint"/>    
  </node>
 
</launch>

lidar.xml

<launch>
  <arg name="map_size_x_"/>
  <arg name="map_size_y_"/>
  <arg name="map_size_z_"/>

  <arg name="odometry_topic"/>
  <arg name="camera_pose_topic"/>
  <arg name="depth_topic"/>
  <arg name="cloud_topic"/>

  <arg name="cx"/>
  <arg name="cy"/>
  <arg name="fx"/>
  <arg name="fy"/>

  <arg name="max_vel"/>
  <arg name="max_acc"/>

  <arg name="point_num"/>
  <arg name="point0_x"/>
  <arg name="point0_y"/>
  <arg name="point0_z"/>
  <arg name="point1_x"/>
  <arg name="point1_y"/>
  <arg name="point1_z"/>
  <arg name="point2_x"/>
  <arg name="point2_y"/>
  <arg name="point2_z"/>

  <arg name="flight_type"/>

  <!-- main node -->
  <node pkg="plan_manage" name="fast_planner_node" type="fast_planner_node" output="screen">
    <remap from="/odom_world" to="$(arg odometry_topic)"/>
    <remap from="/sdf_map/odom" to="$(arg odometry_topic)"/>
    <remap from="/sdf_map/cloud" to="$(arg cloud_topic)"/>
    <remap from = "/sdf_map/pose"   to = "$(arg camera_pose_topic)"/> 
    <remap from = "/sdf_map/depth" to = "$(arg depth_topic)"/>

    <!-- replanning method -->
    <param name="planner_node/planner" value="1" type="int"/>

    <!-- planning fsm -->
    <param name="fsm/flight_type" value="$(arg flight_type)" type="int"/>
    <param name="fsm/thresh_replan" value="1.5" type="double"/>
    <param name="fsm/thresh_no_replan" value="1.0" type="double"/>

    <param name="fsm/waypoint_num" value="$(arg point_num)" type="int"/>
    <param name="fsm/waypoint0_x" value="$(arg point0_x)" type="double"/>
    <param name="fsm/waypoint0_y" value="$(arg point0_y)" type="double"/>
    <param name="fsm/waypoint0_z" value="$(arg point0_z)" type="double"/>
    <param name="fsm/waypoint1_x" value="$(arg point1_x)" type="double"/>
    <param name="fsm/waypoint1_y" value="$(arg point1_y)" type="double"/>
    <param name="fsm/waypoint1_z" value="$(arg point1_z)" type="double"/>
    <param name="fsm/waypoint2_x" value="$(arg point2_x)" type="double"/>
    <param name="fsm/waypoint2_y" value="$(arg point2_y)" type="double"/>
    <param name="fsm/waypoint2_z" value="$(arg point2_z)" type="double"/>

    <param name="sdf_map/resolution"      value="0.15" /> 
    <param name="sdf_map/map_size_x"   value="$(arg map_size_x_)" /> 
    <param name="sdf_map/map_size_y"   value="$(arg map_size_y_)" /> 
    <param name="sdf_map/map_size_z"   value="$(arg map_size_z_)" /> 
    <param name="sdf_map/local_update_range_x"  value="5.5" /> 
    <param name="sdf_map/local_update_range_y"  value="5.5" /> 
    <param name="sdf_map/local_update_range_z"  value="4.5" /> 
    <param name="sdf_map/obstacles_inflation"     value="0.3" /> <!--<膨胀的半径  单位米>-->
    <param name="sdf_map/local_bound_inflate"    value="0.0"/>
    <param name="sdf_map/local_map_margin" value="10"/>
    <param name="sdf_map/ground_height"        value="0"/>
    <!-- camera parameter -->
    <param name="sdf_map/cx" value="$(arg cx)"/>
    <param name="sdf_map/cy" value="$(arg cy)"/>
    <param name="sdf_map/fx" value="$(arg fx)"/>
    <param name="sdf_map/fy" value="$(arg fy)"/>
    <!-- depth filter -->
    <param name="sdf_map/use_depth_filter" value="false"/>
    <param name="sdf_map/depth_filter_tolerance" value="0.15"/>
    <param name="sdf_map/depth_filter_maxdist"   value="5.0"/><!--5.0-->
    <param name="sdf_map/depth_filter_mindist"   value="0.2"/>
    <param name="sdf_map/depth_filter_margin"    value="2"/>
    <param name="sdf_map/k_depth_scaling_factor" value="1000.0"/>
    <param name="sdf_map/skip_pixel" value="2"/>
    <!-- local fusion -->
    <param name="sdf_map/p_hit"  value="0.65"/>
    <param name="sdf_map/p_miss" value="0.35"/>
    <param name="sdf_map/p_min"  value="0.12"/>
    <param name="sdf_map/p_max"  value="0.90"/>
    <param name="sdf_map/p_occ"  value="0.80"/>
    <param name="sdf_map/min_ray_length" value="0.3"/>
    <param name="sdf_map/max_ray_length" value="5.0"/>

    <param name="sdf_map/esdf_slice_height" value="0.3"/>
    <param name="sdf_map/visualization_truncate_height"   value="2.49"/>
    <param name="sdf_map/virtual_ceil_height"   value="2.5"/>
    <param name="sdf_map/show_occ_time"  value="false"/>
    <param name="sdf_map/show_esdf_time" value="false"/>
    <param name="sdf_map/pose_type"     value="1"/>  
    <param name="sdf_map/frame_id"      value="odom"/>

  <!-- planner manager -->
    <param name="manager/max_vel" value="$(arg max_vel)" type="double"/>
    <param name="manager/max_acc" value="$(arg max_acc)" type="double"/>
    <param name="manager/max_jerk" value="4" type="double"/>
    <param name="manager/dynamic_environment" value="0" type="int"/>
    <param name="manager/local_segment_length" value="12.0" type="double"/>
    <param name="manager/clearance_threshold" value="0.2" type="double"/>
    <param name="manager/control_points_distance" value="0.5" type="double"/>

    <param name="manager/use_geometric_path" value="false" type="bool"/>
    <param name="manager/use_kinodynamic_path" value="true" type="bool"/>
    <param name="manager/use_topo_path" value="false" type="bool"/>
    <param name="manager/use_optimization" value="true" type="bool"/>

  <!-- kinodynamic path searching -->
    <param name="search/max_tau" value="1.0" type="double"/><!--如果考虑对时间维度进行划分才设置-->
    <param name="search/init_max_tau" value="0.8" type="double"/>
    <param name="search/max_vel" value="$(arg max_vel)" type="double"/>
    <param name="search/max_acc" value="$(arg max_acc)" type="double"/>
    <param name="search/w_time" value="10.0" type="double"/>
    <param name="search/horizon" value="5.0" type="double"/><!--限制全局规划的距离,保证实时性-->
    <param name="search/lambda_heu" value="4.0" type="double"/><!--启发函数权重-->
    <param name="search/resolution_astar" value="0.1" type="double"/><!--空间分辨率-->
    <param name="search/time_resolution" value="0.8" type="double"/><!--时间维度分辨率-->
    <param name="search/margin" value="0.2" type="double"/><!--检测碰撞-->
    <param name="search/allocate_num" value="100000" type="int"/><!--最大节点数目-->
    <param name="search/check_num" value="5" type="int"/><!--对中间状态安全检查-->

  <!-- trajectory optimization -->
    <param name="optimization/lambda1" value="10.0" type="double"/>
    <param name="optimization/lambda2" value="5.0" type="double"/>
    <param name="optimization/lambda3" value="0.00001" type="double"/>
    <param name="optimization/lambda4" value="0.01" type="double"/>
    <param name="optimization/lambda7" value="100.0" type="double"/><!-- reduces 'optimization/lambda7' to make the yaw changes slower-->
    <param name="optimization/dist0" value="0.4" type="double"/>
    <param name="optimization/max_vel" value="$(arg max_vel)" type="double"/>
    <param name="optimization/max_acc" value="$(arg max_acc)" type="double"/>

    <param name="optimization/algorithm1" value="15" type="int"/>
    <param name="optimization/algorithm2" value="11" type="int"/>

    <param name="optimization/max_iteration_num1" value="2" type="int"/>
    <param name="optimization/max_iteration_num2" value="300" type="int"/>
    <param name="optimization/max_iteration_num3" value="200" type="int"/>
    <param name="optimization/max_iteration_num4" value="200" type="int"/>

    <param name="optimization/max_iteration_time1" value="0.0001" type="double"/>
    <param name="optimization/max_iteration_time2" value="0.005" type="double"/>
    <param name="optimization/max_iteration_time3" value="0.003" type="double"/>
    <param name="optimization/max_iteration_time4" value="0.003" type="double"/>

    <param name="optimization/order" value="3" type="int"/>

    <param name="bspline/limit_vel" value="$(arg max_vel)" type="double"/>
    <param name="bspline/limit_acc" value="$(arg max_acc)" type="double"/>
    <param name="bspline/limit_ratio" value="1.1" type="double"/>

    <param name="bspline/limit_vel" value="$(arg max_vel)" type="double"/>
    <param name="bspline/limit_acc" value="$(arg max_acc)" type="double"/>
    <param name="bspline/limit_ratio" value="1.1" type="double"/>

  </node>
</launch>

可能会出现规划出的路径实际位置与目标期望位置存在偏差的情况:

Fast_planner规划期望位置与实际位置偏差-解决前

这是由于OneShot中检查边界出现问题,令其返回了false,即认为最后寻找的目标点是不可达的,上一节点可达,故此时规划目标位置接近目标点但不是目标点。
sdf_map.cpp

  node_.param("sdf_map/map_size_x", x_size, -1.0);
  node_.param("sdf_map/map_size_y", y_size, -1.0);
  node_.param("sdf_map/map_size_z", z_size, -1.0);

kinodynamic_astar.cpp

if (coord(0) < origin_(0) || coord(0) >= map_size_3d_(0) || coord(1) < origin_(1) || coord(1) >= map_size_3d_(1) 
     || coord(2) < origin_(2)  || coord(2) >= map_size_3d_(2))
    {
      return false;
    }

在进行OneShot时边界约束判断当前点是否存在一条路经直到终点,因为coord(2)小车z轴信息为-0.000981506, origin(2)为0,小车z值为负一直小于origin(2),则会一直满足判断条件返回false,故无法到目标点。

在这里插入图片描述
如果仍有问题,请检查其他的约束条件。
由当前点寻找到终点的最优路径简单证明思路如下(感兴趣可以自己推一下):
在这里插入图片描述


最后

Fast_planner规划期望目标位置与实际位置-解决后

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS开发(ArkUI简单使用)

一、开发准备 1.官网 https://developer.huawei.com/consumer/cn/ 2.工具 DevEco Studio 下载&#xff1a; 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 3.安装 4.开发组件ArkTs ArkTS是HarmonyOS主力应用开发语言。它在TypeScript&#xf…

分享一个关于产线工控安全的主机加固方案

在数字化时代&#xff0c;数据安全是企业运营的重中之重。勒索病毒作为一种新型的网络攻击手段&#xff0c;已经成为全球范围内企业面临的严峻挑战。最近&#xff0c;一起震惊全球的勒索病毒事件再次敲响了警钟&#xff1a;一家国际航运巨头遭受了勒索软件攻击&#xff0c;导致…

设计模式和软件框架的关系

设计模式和软件框架在软件开发中都有助于解决复杂问题和提高代码质量&#xff0c;但它们在概念和使用上存在一些区别。它们的关系可以通过以下几点理解&#xff1a; 层次与抽象程度 设计模式&#xff08;Design Patterns&#xff09;是一组通用的、可复用的解决方案&#xff0…

Android10 recent键相关总结

目录 初始化流程 点击Recent键流程 RecentsActivity 显示流程 RecentsModel 获取数据管理类 RecentsActivity 布局 已处于Recent界面时 点击recent 空白区域 点击返回键 recent组件配置 Android10 Recent 功能由 System UI&#xff0c;Launcher共同实现。 初始化流程 …

注册_登录安全分析报告:宝马中国

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

前端开发攻略---取消已经发出但是还未响应的网络请求

目录 注意&#xff1a; 1、Axios实现 2、Fetch实现 3、XHR实现 注意&#xff1a; 当请求被取消时&#xff0c;只会本地停止处理此次请求&#xff0c;服务器仍然可能已经接收到了并处理了该请求。开发时应当及时和后端进行友好沟通。 1、Axios实现 <!DOCTYPE html> &…

Map 双列集合根接口 HashMap TreeMap

Map接口是一种双列集合,它的每一个元素都包含一个键对象Key和值Value 键和值直接存在一种对应关系 称为映射 从Map集中中访问元素, 只要指定了Key 就是找到对应的Value 常用方法 HashMap实现类无重复键无序 它是Map 接口的一个实现类,用于存储键值映射关系,并且HashMap 集合没…

51单片机快速入门之 LED点阵 结合74hc595 的应用 2024/10/16

51单片机快速入门之 LED点阵 结合74hc595 的应用 74HC595是一种常用的数字电路芯片&#xff0c;具有串行输入并行输出的功能。它主要由两个部分组成&#xff1a;一个8位的移位寄存器和一个8位的存储寄存器。数据通过串行输入管脚&#xff08;DS&#xff09;逐位输入&#xff0…

unity Gpu优化

不一样的视角&#xff0c;深度解读unity性能优化。unity性能优化&#xff0c;unity内存优化&#xff0c;cpu优化&#xff0c;gpu优化&#xff0c;资源优化&#xff0c;资源包、资源去重优化&#xff0c;ugui优化。 gpu优化静态批处理静态批处理原理规则静态合批的原理静态合批的…

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

Appium环境搭建、Appium连接真机

文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk&#xff0c;这里就不演示安装jdk的过程了 SDK下载地址&#xff1a;Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

云栖实录 | 智能运维年度重磅发布及大模型实践解读

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 钟炯恩 | 阿里云智能集团运维专家 张颖莹 | 阿里云智能集团算法专家 活动&#xff1a; 2024 云栖大会 AI 可观测专场 -智能运维&#xff1a;云原生大规模集群GitOps实践 2024 …

【c++】c++11多线程开发

2 C多线程 本文是参考爱编程的大丙c多线程部分内容&#xff0c;按照自己的理解对其进行整理的一篇学习笔记&#xff0c;具体一些APi的详细说明请参考大丙老师教程。 代码性能的问题主要包括两部分的内容&#xff0c;一个是前面提到资源的获取和释放&#xff0c;另外一个就是多…

使用rabbitmq-operator在k8s集群上部署rabbitmq实例

文章目录 前言一、rabbitmq-operator二、进行部署1.部署cluster-operator2.创建自己需要的特定命名空间3.创建rabbitmq的instance4.创建nodeport访问 结果验证 前言 使用rabbitmq-operator在k8s集群上部署rabbitmq实例。时区设置为上海 一、rabbitmq-operator 官网地址&#…

数学建模算法与应用 第16章 优化与模拟方法

目录 16.1 线性规划 Matlab代码示例&#xff1a;线性规划求解 16.2 整数规划 Matlab代码示例&#xff1a;整数规划求解 16.3 非线性规划 Matlab代码示例&#xff1a;非线性规划求解 16.4 蒙特卡洛模拟 Matlab代码示例&#xff1a;蒙特卡洛模拟计算圆周率 习题 16 总结…

java代码生成器集成dubbo,springcloud详解以及微服务遐想

摘要 今天终于有了点空闲时间&#xff0c;所以更新了一下代码生成器&#xff0c;修复了用户反馈的bug&#xff0c;本次更新主要增加了dubbo和springcloud脚手架的下载功能&#xff0c;架子是本人亲自搭建&#xff0c;方便自由扩展或者小白学习使用&#xff0c;你也许会问为什么…

红日安全vulnstack (二)

目录 环境搭建 网卡设置 修改Kali网段 IP 分布 WEB渗透 Weblogin服务开启 漏洞扫描 CVE工具利用 MSF上线 内网渗透 域内信息收集 凭证横向移动 权限维持 黄金票据 参考文章 https://www.cnblogs.com/bktown/p/16904232.htmlhttps://blog.csdn.net/m0_75178803/ar…

leetcode54:螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,…

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器&#xff0c;发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…