开源自主导航小车MickX4(九)基于move_base 的自主导航框架

2023-05-16

开源自主导航小车MickX4(九)move_base 导航框架

  • 1 move_base 导航框架整体分析
    • 1.1 map_server
    • 1.2 AMCL定位
    • 1.3 move_base 包
  • 2 AMCL 定位 配置
    • 2.1 map_server 发布地图
    • 2.2 AMCL 定位
  • 3 move_base配置
  • 4 测试视频
  • 参考资料

目前开源的导航框架有 百度的 Applo,autoware和move_base。move_base的框架资料较多,上手比较容易,适用于激光传感器在小车上实现自主导航,move_base相比其他两个框架,其本身没有融合有感知模块,需要自己添加模块和定义接口。这一部分中我们首先介绍自主导航小车的软件框架,随后介绍每一个部分的配置过程。(本章节主要分析自主导航小车的算法框架,文字表述较大,希望大家耐心读完!)

1 move_base 导航框架整体分析

实现自主导航小车一般分为三个部分:建图、路径规划、控制。建图指通过激光雷达或者视觉相机的数据建立2D栅格地图或者是3D点云地图,其中基于2D激光雷达建图的算法一般有Gmapping、Hector、Cartograph。3D激光雷达的建图算法有谷歌的Cartographer算法和LeGO-LOAM。这些算法很多已经集成到了ROS中作为一个功能包。路径规划则是在已有的地图中计算得到一条代价最小的路径(这个路径也可以由你来画),控制则是控制小车按照预设的轨迹行驶实现轨迹跟踪。

ROS中已经有了自己的自主导航包集合(这张万年不变的老图),ROS官方给出的这张图非常的经典,基本包含了自主导航小车的框架,我们按照自主导航小车的功能块来分析这个图。在这里插入图片描述

1.1 map_server

假设我们已经通过gmapping或者其他的算法获得了一张点云图,以2D地图为例(通常会得到xxx.pgm和xxx.yaml两个文件)。接下来我们利用扫描得到的地图进行自主导航。我们利用map_server这个包加载已有的导航地图并将其转换为导航可用的图(具体来说就是costmap),这个costmap提供地图中每个点的代价。

如下图所示,map_server主要是加载我们之前扫描到的地图发布出costmap地图,map_server这个节点对外提供了2张2维3层的地图,其中2张是指global_costmap和local_costmap。一张用于move_base中的全局规划器(global_planner),另外一张用于move_base中的局部规划器(local_planner)。每张地图有三层(staticlayer(静态层)、obstaclelayer(动态层)、inflationlayer(膨胀层))。map_server发布"/map"和"/map_metadata"两个topic, "/map"则被AMCL接收用于匹配激光传感器数据 。 /map_metadata 被move_base接收。
在这里插入图片描述

1.2 AMCL定位

在基于激光导航的小车中定位数据来源有两个地方轮式里程计和AMCL包。其中AMCL(称为自适应蒙特卡洛定位),这个包主要是利用当前激光雷达获取到的数据在已有的地图中进行搜索匹配,定位出小车在地图中的位置。AMCL接收当前激光雷达的数据(/scan)、TF变换树和初始位姿估计(/Initialpose),在map_server发布的地图中 /map 匹配定位机器人在地图中的位置,AMCL包估计地图与里程计(即"odom"和"map “)之间的TF变换,形成一个误差项,修正"odom"坐标系。AMCL会将定位数据发布在TF树和”/amcl_pose"这个topic中。

注意:在自主导航中传感器之间的位置关系以及小车在地图中的位置均是通过TF变换来表达的,比如说轮式里程计输出的"odom"和"base_link"之间的变换,底盘与激光雷达的相对安装位置则是通过"base_link"和"laser"之间的TF来表示的。这样就可以形成一颗TF树,通过TF树可以找到树上任意两个节点之间的TF变换(即旋转和平移闭环)。

1.3 move_base 包

导航所需要的地图(map_server)和机器人当前的位置(amcl)都知道以后,我们可以开始规划路径了,move_base这个包由全局规划器和局部规划器组成,全局规划器接收由map_server提供的global_costmap地图(地图类型依旧是costmap)规划出全局路径,这里用到的算法通常是A和D算法。局部规划器在local_costmap地图上动态规划,实现避障、绕行等功能,其中所涉及到的算法为人工势场法和DWA算法。move_base这个包含了局部规划器和全局规划器,这个包需要输入机器人当前的速度信息(里程计输出的"odom"和"base_link"之间的变换)和机器人在地图中的位置(由ACML模块输出的"odom"和"map"之间的TF变换)。计算输出底盘速度和转角控制参数到"/cmd_vel"这个topic上,最后由机器人底盘节点从这个topic上接收速度和角度控制指令,对底盘实现闭环控制。

小结,总体来讲自主导航小车的算法结构如上图所示。建图、定位、路径规划、控制是实现自主导航小车的四个基本要素。其中运动规划主要由move_base包提供,到这里我们基本上搞清楚了自主导航小车的算法框架及其组成部分,接下来我们按步骤配置每一个模块,将小车实现建图和路径规划。

2 AMCL 定位 配置

2.1 map_server 发布地图

新打开一个终端,启动map_server ,测试地图我们放在了代码目录下的 mick_robot/mick_navigation/map中

source / catkin_ws/devel/setup.bash
rosrun map_server map_server /home/administrator/catkin_ws/src/mick_robot/mick_navigation/map/cqu_lab.yaml

如果提示没有 map-server的话可以通过以下命令安装

sudo apt-get install ros-kinetic-map-server

map-server 启动以后会有一个 /map/map_metadata 两个topic发出。
在这里插入图片描述

2.2 AMCL 定位

这里我们使用AMCL这个模块进行实验,先把导航框架的数据通道打通。在后面可以切换成cartographer的定位算法或者其他的定位算法。这里我们在文件夹“mick_navigation/launch”中建立名为" amcl.launch"的文件,对AMCL模块进行配置:

<launch>
  <arg name="use_map_topic" default="false"/>
  <arg name="scan_topic" default="scan" />

  <node pkg="amcl" type="amcl" name="amcl">
    <param name="use_map_topic" value="$(arg use_map_topic)"/>
    <!-- Publish scans from best pose at a max of 10 Hz -->
    <param name="odom_model_type" value="omni-corrected"/>
    <param name="odom_alpha5" value="0.1"/>
    <param name="gui_publish_rate" value="10.0"/>
    <param name="laser_max_beams" value="720"/>
    <param name="laser_min_range" value="0.1"/>
    <param name="laser_max_range" value="30.0"/>
    <param name="min_particles" value="500"/>
    <param name="max_particles" value="2000"/>
    <!-- Maximum error between the true distribution and the estimated distribution. -->
    <param name="kld_err" value="0.05"/>
    <param name="kld_z" value="0.99"/>
    <param name="odom_alpha1" value="0.2"/>
    <param name="odom_alpha2" value="0.2"/>
    <!-- translation std dev, m -->
    <param name="odom_alpha3" value="0.2"/>
    <param name="odom_alpha4" value="0.2"/>
    <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_model_type" value="likelihood_field"/>
    <!-- Maximum distance to do obstacle inflation on map, for use in likelihood_field model. -->
    <param name="laser_likelihood_max_dist" value="2.0"/>
    <!-- Translational movement required before performing a filter update.  -->
    <param name="update_min_d" value="0.1"/>
    <!--Rotational movement required before performing a filter update. -->
    <param name="update_min_a" value="0.314"/>
    <param name="odom_frame_id" value="odom"/>
    <param name="base_frame_id" value="base_link"/>
    <param name="global_frame_id" value="map"/>
    <!-- Number of filter updates required before resampling. -->
    <param name="resample_interval" value="1"/>
    <!-- Increase tolerance because the computer can get quite busy -->
    <param name="transform_tolerance" value="1.0"/>
    <!-- Exponential decay rate for the slow average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.001. -->
    <param name="recovery_alpha_slow" value="0.0"/>
    <!--Exponential decay rate for the fast average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.1. -->
    <param name="recovery_alpha_fast" value="0.1"/>
    <!-- Initial pose mean -->
    <param name="initial_pose_x" value="0.0" />
    <param name="initial_pose_y" value="0.0" />
    <param name="initial_pose_a" value="0.0" />
    <!-- When set to true, AMCL will subscribe to the map topic rather than making a service call to receive its map.-->
    <param name="receive_map_topic" value="true"/>
    <!--  When set to true, AMCL will only use the first map it subscribes to, rather than updating each time a new one is received. -->
    <param name="first_map_only" value="false"/>
    <remap from="scan" to="$(arg scan_topic)"/>
  </node>

</launch>

再新打开一个终端,启动AMCL节点

source / catkin_ws/devel/setup.bash
roslaunch mick_navigation amcl.launch

这时候我们新开一个终端启动RVIZ添加“/map”的topic 就可以看到我们在(开源自主导航小车MickX4(六)cartographer 室外2D建图)中建好的2D 地图了
在这里插入图片描述

注意:amcl节点如果提示没有map和base_link的有效数据,这是由于底盘没有发布有odom坐标系的TF。只需要启动底盘节点 激光雷达和URDF模型就可以了。

source / catkin_ws/devel/setup.bash
roslaunch mick_bringup mickx4_bringup_v2.launch

这时候我们再启动底盘的节点,并RVIZ中点击一下“2D Pose Estimate”就可以正常定位了

3 move_base配置

接下来开始配置move_base模块,move_base模块需要有五个文件分别是:

  • local_costmap_params.yaml(局部costmap参数文件)
  • global_costmap_params.yaml(全局地图参数文件)
  • dwa_local_planner_params.yaml(局部规划器参数文件)
  • global_planner_params.yaml(全局规划器参数文件)
  • move_base_params.yaml(move_base运行参数)。

其中xxx_costmap_params.yaml两个文件主要是配置地图的,比如地图的膨胀区域。xxx_ planner_params.yaml两个文件主要的规划器的运行参数。基本上这些参数按照wiki上的教程进行配置能运行起来,但是运行的不太好,这里面的参数很多还需要进一步理解。最好的方法是找一个开源的框架,模仿他的配置方法,然后在这个基础上对参数进行修改,然后对照文档理解参数的含义

我在配置的时候主要参考了 navguide.pdf 文档 [5], 文档是英文的,也有博客[4]进行了翻译梳理。此外,这两篇博客:[2][3]也可以进行参考理解其中参数的意思。

在文件夹“mick_navigation/launch”中建立名为" mickx4_amcl.launch"的文件,将所有的节点放在一个launch文件中启动:

<?xml version="1.0"?>
<launch>
  <arg name="rviz" default="true"/>

   <!-- chassis -->
  <include file="$(find mick_bringup)/launch/mickx4_bringup_v2.launch" />
  
   <!-- urdf -->
  <include file="$(find mick_description)/launch/state_publisher.launch" />
  
   <!-- imu -->
  <!-- include file="$(find imu_driver)/launch/wit_imu.launch" /-->
  
   <!-- xsens  -->
  <include file="$(find xsens_driver)/launch/xsens_driver.launch" />
  
   <!-- rslidar -->
  <include file="$(find rslidar_pointcloud)/launch/rs_lidar_16.launch" />
 
   <!-- pointcloud_to_laserscan -->
  <include file="$(find pointcloud_to_laserscan)/launch/rslidar.launch" />

  <!-- Map Server -->
 <arg name="map_file" default="$(find mick_navigation)/map/cartograph_test.yaml"/>
 <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

  <!-- AMCL -->
 <include file="$(find mick_navigation)/launch/include/amcl.launch.xml" />


 <!-- Move Base -->
 <include file="$(find mick_navigation)/launch/include/move_base_mickx4.launch.xml" />

  <!-- RViz -->
  <node if="$(arg rviz)" pkg="rviz" type="rviz" name="$(anon rviz)" respawn="false" output="screen" args="-d $(find mick_navigation)/rviz/localization_mickx4.rviz" />

</launch>

配置好move_base以后,新开启一个终端启动mickX4差速底盘、传感器、move_base 、map_server以及amcl 导航模组 。(我所使用的参数文件[6])

source / catkin_ws/devel/setup.bash
roslaunch mick_navigation mickx4_amcl.launch

注意:AMCL需要手动设置初始化点(通过点击RVIZ上面的箭头 2D Pose Estimate),初始化成功以后,可以看到激光扫描的线是和地图的边缘对齐的,小车周围也会有一对的带箭头的线(粒子)。这时如果move_base配置正确,再点击 箭头(2D Nav Goal)再地图上就会出现一个红色的线(全局规划路径),靠近车前面会有一段绿色的路径(局部规划路径)。这时候把遥控器上的模式切换开关切换到自主模式下,底盘就可以运动了。

注意小车必须要要有局部规划路径才可以动,也就是绿色的曲线。

在这里插入图片描述

4 测试视频

配置导航的内容基本上就是这些,如果还需要设置开机自启动和上位机控制,可以参考我的其他博客文章配置。

ROS节点开机自启动
ROS上位机界面-nav2djs导航组件

参考资料

[1] https://github.com/RuPingCen/mick_robot
[2] https://blog.csdn.net/qq_25241325/article/details/81207278
[3] https://blog.csdn.net/forrest_z/article/details/62891055
[4] http://zkytony.com/documents/navguide.pdf
[5] https://blog.csdn.net/tobebest_lah/article/details/93633163
[6] https://github.com/RuPingCen/mick_robot/blob/master/mick_navigation/launch/mickx4_amcl.launch

上一篇:开源自主导航小车MickX4(八)LeGo-LOAM 室外3D建图

下一篇:开源自主导航小车MickX4(十)总结

欢迎大家点赞在评论区交流讨论(cenruping@vip.qq.com) O(∩_∩)O*

或者加群交流(1149897304)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源自主导航小车MickX4(九)基于move_base 的自主导航框架 的相关文章

  • LTE中的各种ID含义

    原文链接 xff1a http www hropt com ask q 7128 html ECI 28 Bits 61 eNB ID 20 Bits 43 Cell ID 8 Bits 换成16进制就是ECI共7位 xff0c eNB I
  • 西门子Step7找不到有效授权的解决方法

    1 停止automation license manager service服务 2 删除授权文件 检查你的授权文件夹AX NF ZZ是放在哪个盘 xff0c C盘还是D盘 xff0c 在工具 文件夹选项 查看 选上显示所有文件和文件夹 x
  • AUGULAR安装使用

    先下载并安装NODE js xff0c 里面包含安装完成后已包含NPM NPM应该是augular一个管理工具 https www angular cn docs ts latest guide setup html develop loc
  • 成功不是依靠机会 ---- 参加移动开发者大会大会有感

    这次有幸参加了CSDN和创新工厂主办的移动开发者大会 xff0c 感觉良多 第一印象是 xff1a 这真的是一次技术的大会 我之前参加过很多大会 我特别说的是微软的技术大会 xff0c 已经感受不到什么技术的味道了 xff0c 或者说是这种
  • 基于机器学习的web异常检测

    基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线 随着网络技术的快速更新 xff0c 新的黑客技术也层出不穷 xff0c 为传统规则防火墙带来了挑战 传统web入侵检测技术通过维护规则集对入侵访问进行拦截 一方面 xff0c
  • rosserial_java_ros系统下通过pyserial模块实现串口通讯(Python)

    经过几天的摸索终于实现了 xff1a 在ros系统下 xff0c 订阅Twist cmd vel 消息 xff0c 经过USB转串口通信 xff0c 实现了通过灯带实时反映小车 差速 运行状态的功能 通信部分主要依赖pyserial模块的功
  • 禁止显示Apache目录列表-Indexes FollowSymLinks

    禁止显示Apache目录列表 Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表 缺省情况下如果你在浏览器输入地址 xff1a http localhost 8080 如果你的文件根目录里有
  • 一个老兵的linux学习和面试经验分享

    特别说明 xff1a 本文为约9个月前老男孩linux培训内部师兄给师弟的经验分享 xff0c 经过该同学同意 xff0c 特此分享给所有博友 学习和面试经验分享 大家好 xff0c 非常高兴能在这里给大家分享学习和面试的经验 xff0c
  • 开源自主导航小车MickX4(八)LeGo-LOAM 室外3D建图

    开源自主导航小车MickX4 xff08 八 xff09 LeGo LOAM 室外3D建图 1 安装 LeGO LOAM1 1安装依赖项 2 运行 LeGO LOAM2 1 运行论文demo2 2 修改配置文件2 3 运行自己的bag包2
  • 微信支付开发中遇到的两个神坑

    微信支付本身是提供了三大Web开发语言的SDK下载的 xff0c 按理说应该很Easy怎么会有坑呢 xff1f 其实坑大多出在文档上 xff0c 文档不完善 xff0c 很多东西都得你去摔一跤才明白 xff0c 事先绝不告诉你 xff0c
  • 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】

    转自 xff1a http www hangge com blog cache detail 1461 html 一 MADVR介绍 MADVR 是一款超强的视频插件 xff0c 其配合高清播放软件 xff0c 可以做到目前 PC 上播放高
  • 自动化运维为什么是必须的?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 运维团队负责最大限度提高效率 降低成本 xff0c 这也意味着他们往往承受着巨大的压力 xff0c 需要解决在不增加员工的情况下 xff0c 最大限度产出价值的问题 达成这
  • 如何理解事件溯源

    在近期举行的PHPDublin见面会上 xff0c 来自DynamicRes的架构师Barry Sullivan被问到 什么是事件溯源 xff0c 作为对这个问题的回答 xff0c 他在博客上写下了这篇文章 xff0c 详细解释了什么是事件
  • C语言 · 删除数组中的0元素

    算法提高 6 9删除数组中的0元素 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 编写函数CompactIntegers xff0c 删除数组中所有值为0的元素 xff0c 其后元素向数组首端移动 注意 xff0c
  • 解决com.intellij.openapi.project.IndexNotReadyException: Please change caller according to com.intelli...

    File gt Invalidate Cache and Restart
  • PyShark入门(2):FileCapture和LiveCapture模块

    原文地址 xff1a http zodiacg net 2016 07 in 本系列文章译自thePacketGeek的系列文章 原创翻译 xff0c 转载请注明出处 PyShark中进行数据包分析的两个典型方法是使用 FileCaptur
  • 使用ctdb+samba+glusterfs搭建NAS集群系统

    1概述 本文介绍使用开源软件ctdb 43 samba 43 gluster搭建NAS集群系统 1 1 使用的开源软件介绍 1 glusterfs glusterfs是一个开源的分布式文件系统 xff0c 只适用于大文件存储 xff0c 存
  • react中优雅使用svg矢量图

    icon图标可以有很多形式 比如说CSS Sprite 引用字体图标 纯css 简单的icon 等等 优缺点这里不在赘述 xff0c 自行google之 下面就进入正题说说今天的主角svg 1 svg的发展历史 2001年9月4日 xff0
  • 使用自制相机运行 VINS-Mono

    使用自制相机运行VINS Mono 1 相机与IMU标定2 自制相机测试3 运行效果参考资料 1 相机与IMU标定 VINSmono的安装这里就省略了 xff0c 可以参考作者的github网页 2 我所使用的是ZED相机和Xsens IM
  • 标准正态分布变量的累积概率分布函数

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近有个期权项目 xff0c 计算理论价时需要使用标准正态分布变量的累积概率分布函数 xff0c excel中可以通过normsdist函数得到该结果 xff0c 但是项目

随机推荐

  • spring boot 中 @ConditionalOnMissingBean和@ConditionalOnBean注解注意事项

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 关于使用 64 Bean注解注入bean导致ConditionOnMissBean和 ConditionOnBean 注解有时候会失效的问题 文档上提示 xff0c 需要注
  • vscode左侧文件不同颜色标识含义

    代码里的左侧颜色标识 红色 xff0c 未加入版本控制 刚clone到本地 绿色 xff0c 已经加入版本控制暂未提交 新增部分 蓝色 xff0c 加入版本控制 xff0c 已提交 xff0c 有改动 xff1b 修改部分 白色 xff0c
  • 读取本地文件转化成MultipartFile

    介绍 现在有个上传文件功能 xff0c 需要将文件上传到oss上 xff0c 但是文件有点多 xff0c 于是使用接口进行上传 但是需要上传文件转换为MultipartFile类型文件进行上传 主要代码 添加pom文件 lt depende
  • 桌面上嵌入窗口(桌面日历)原理探索

    摘要 今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面 xff0c 让它和桌面融为一体 xff0c 就像很多桌面日历软件那样 阅读全文 Richard Wei 2012 05 03 22 07 发表评论 转载于 https www cnbl
  • Git中分支merge和rebase的适用场景及区别

    几乎所有的版本控制工具都有branch功能 xff0c branch主要用于以下几个场景 xff1a 1 xff0c 控制产品OEM 基本上做产品 xff0c 不同的客户都会提出多种不同特性需求 xff0c 最简单的例子就是LOGO和标题完
  • sass安装与教程

    首先下载ruby http dlsw baidu com sw search sp soft ff 22711 rubyinstaller V2 2 2 95 setup 1439890355 exe 安装时注意勾选一下选项 安装完ruby
  • 集成学习原理小结

    集成学习 ensemble learning 可以说是现在非常火爆的机器学习方法了 它本身不是一个单独的机器学习算法 xff0c 而是通过构建并结合多个机器学习器来完成学习任务 也就是我们常说的 博采众长 集成学习可以用于分类问题集成 xf
  • 这款APP明确告诉你,无人机在什么地方可以飞

    美国联邦航空管理局 xff08 FAA xff09 为无人机管制推出了一个新的应用 B4UFLY xff0c 用来向用户显示无人机飞行的合法范围 关于如何有效的对无人机飞行进行管制 xff0c 已经是老生常谈的问题了 xff0c 除了制定相
  • 什么是委托?为什么要使用委托?什么是事件?

    1 什么是委托 xff1f 首先声明一个委托 xff1a public delegate string IsLengthFive string s 下面写几个方法 xff1a public string DoWork string a pu
  • 读取多超声波传感器

    读取多超声波传感器 1 背景2 使用教程2 1 接线说明2 2 上传协议 3 ROS节点使用3 1 下载与配置3 3 常见问题 无串口权限 4 更新程序参考资料 该模块是一个开源模块 xff0c 并提供了配套的ROS节点 xff0c 接收串
  • 系统级性能分析工具perf的介绍与使用

    测试环境 xff1a Ubuntu16 04 43 Kernel xff1a 4 4 0 31 系统级性能优化通常包括两个阶段 xff1a 性能剖析 xff08 performance profiling xff09 和代码优化 性能剖析的
  • VR的商業模式

    1 硬件销售 根据Digi Capital预估 xff0c 在5年内 xff0c AR VR将会有数亿量级的用户数 从免费到高端系统 xff0c 硬件销售将获利最多 届时每由AR VR生成的10美元利润 xff0c 就有4美元收入属于硬件销
  • arm汇编基础(转)

    先看个例子 xff1a void test2 int a int b int c int k 61 a j 61 b m 61 c GCC反汇编 xff1a 00000064 lt test2 gt mov ip sp IP 61 SP 保
  • STL学习思想

    1 模版 xff1a 一定要注意参数和返回值的模版 2 STL一系列的API xff1a 一定要注意返回值 3 容器中的都是值拷贝 而不是引用 在执行插入时 内部实行拷贝动作 所以STL中插入类时 一般都必须 xff1a 无参构造函数 拷贝
  • 中国地质大学(北京)软件工程非全2019研究生复试总结

    呼 今早刚出家门就收到地大发来的拟录取通知 xff0c 算是圆满的给2019考研划上了句号 前言 3 26号去参加了中国地质大学 xff08 北京 xff09 软件工程专业非全日制的复试 因为本人初试分数较低 xff0c 调剂的时候报了不少
  • [转载] 职业生涯步步高:一位知名经理人的职业生涯感悟

    这篇5万多字的文章在网上流传甚广 简单考证了一下 应该是出自landy0985 64 天涯之手 最早是07年时发表在天涯上 文章很长 讲了很多东西 找工作的人和考虑自己职业规划的人可以参考一下 分为以下几个部分 序言 第一章 职业生涯扬帆于
  • C语言的源程序有没有主函数,一个c源程序必须包含一个main函数吗

    是的 xff0c 必须包含一个main函数 main函数是程序默认的入口 xff0c 程序的执行是从main函数开始 xff1b 如果没有main函数 xff0c 则编译器不知道程序从哪里开始执行 xff0c 所以一个c源程序有且仅有一个主
  • PX4/PixHawk无人机飞控应用开发

    最近做的一个国防背景的field UAV项目 xff0c 细节不能多谈 xff0c 简单写点技术体会 1 PX4 Pixhawk飞控软件架构简介 PX4是目前最流行的开源飞控板之一 PX4的软件系统实际上就是一个firmware xff0c
  • PID算法终于弄明白原理了,原来就这么简单

    看起来PID高大尚 xff0c 实则我们都是被他的外表所震撼住了 先被别人唬住 xff0c 后被公式唬住 xff0c 由于大多数人高数一点都不会或者遗忘 xff0c 所以再一看公式 xff0c 简直吓死 了解了很浅的原理后 xff0c 结果
  • 开源自主导航小车MickX4(九)基于move_base 的自主导航框架

    开源自主导航小车MickX4 xff08 九 xff09 move base 导航框架 1 move base 导航框架整体分析1 1 map server1 2 AMCL定位1 3 move base 包 2 AMCL 定位 配置2 1