精华内容
下载资源
问答
  • golang导入包的理解

    千次阅读 2018-01-04 21:11:04
    golang导入包的理解 1、首先是包的引入原理 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如...
    
    golang导入包的理解

    1、首先是包的引入原理

    程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。

    2、包导入的语法

     在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:

    import(
        "fmt"
    )

    然后在代码里面可以通过如下的方式调用

    fmt.Println("hello world")

    上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块。
     1. 点操作   

    import (
    	. "fmt"
    )

    这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”)  可以省略的写成Println(“hello world”)。注意:该包内的函数不能与其重名。

     2. 别名操作  

    import( f “fmt” ) 

    别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字,别名操作调用包函数时前缀变成了重命名的前缀,即f.Println(“hello world”)。

     3.  _操作   这个操作经常是让很多人费解的一个操作符,请看下面这个import

    import (
        _ "github.com/go-sql-driver/mysql"
    ) 

     _操作其实只是引入该包。当导入一个包时,它所有的init()函数就会被执行,但有些时候并非真的需要使用这些包,仅仅是希望它的init()函数被执 行而已。这个时候就可以使用_操作引用该包了。即使用_操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()。

    展开全文
  • TF功能包的理解

    千次阅读 2019-03-16 14:49:28
    TF功能包的理解 TF功能包其实是一个供用户调用的一个库 它是用来记录和整理每个ros节点关于相对位置坐标的已知信息 TF的消息发布 每个ros节点只需要把自己已知的任何相对坐标,比如机械手控制节点只知道机械手...


    TF功能包其实是一个供用户调用的一个库
    它是用来记录和整理每个ros节点关于相对位置坐标的已知信息

    TF的消息发布

    每个ros节点只需要把自己已知的任何相对坐标发布出去,比如机械手控制节点只知道机械手相对机械臂的坐标,那么就把已知信息通过TF的函数计算后发布出去。
    TF发布的话题一般有两种: /tf和/tf_static

    /tf是只要有节点发布就会有消息,/tf_static是在已知的坐标发生变化或有新的节点订阅的时候才会发布新的消息

    http://wiki.ros.org/tf2/Migration#Addition_of_.2BAC8-tf_static_topic

    有很多的节点都在发布坐标时,所有的关系串起来,就形成了一颗TF树
    图片来自《中科院ros教程》

    TF的消息订阅

    假如某个ros节点想得到机械手相对大地的位姿,也就是需要机械手坐标系相对于世界坐标系的位姿,那么只需要使用waitForTransform()和lookupTransform()来获取,这两个函数主要作用是订阅TF的话题,然后收集消息,在其中找到世界坐标系到机械手坐标系在TF树上的途径,把沿途的所有相对坐标全部找出来,最后作矩阵运算得到结果。

    展开全文
  • 关于move_base包的理解

    千次阅读 2019-07-01 09:43:14
    关于move_base包的理解 move_base是ROS下关于机器人路径规划的中心枢纽。 它通过订阅激光雷达、map地图、amcl的定位等数据,然后规划出全局和局部路径,再将路径转化为机器人的速度信息,最终实现机器人导航。 ...

    关于move_base包的理解

    move_base是ROS下关于机器人路径规划的中心枢纽。

    它通过订阅激光雷达map地图amcl的定位等数据,然后规划出全局和局部路径,再将路径转化为机器人的速度信息,最终实现机器人导航。

    上面这个图很好的展示了move_base的整个框架,下面我更加详细的介绍一下每个模块的功能及其是如何衔接的。

    首先amcl模块是ROS的导航定位模块,amcl也叫自适应蒙特卡罗定位,amcl通过订阅scan、map和tf信息,发布出机器人的pose,以供move_base使用,这部分具体可以上官网看看,这里就不做详细介绍了,左下角odom,即机器人里程计信息,右上角,map,顾名思义,我们需要的先验地图信息,一般通过slam建图后保存,ROS中主流的slam算法有:

    1.gmapping:需要激光雷达scan数据和里程计odom数据,采用的是PF(粒子滤波)。
    
    2.hector :基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
    
    3.Cartographer:累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。

    map_server包通过解析slam建好的地图并发布出去。

    右下角的传感器topic则在局部路径规划时起到作用,这部分就是costmap包起到的作用了,costmap为代价地图,目前主要的有inflation_layer、obstacle_layer、static_layer、voxel_layer四个plugins。分别为膨胀层、障碍物层、静态层和体素层。一般我们的全局路径需要静态层和膨胀层,因为全局规划应该只考虑到地图信息,所以一般都是静态的,而局部路径规划则需要考虑到实时的障碍物信息,所以需要障碍物层和膨胀层,这里你可能会有疑惑,为什么不把静态层放到局部路径规划里呢?因为我们的定位是会存在误差的,比如轮子打滑或其他情况,这个时候amcl会起到纠正作用,如果我们把静态层放到了局部中,这个定位会有问题,而且,假设当前机器人出现了定位的偏差,那么这个引入的静态层肯定是错误的,再加上局部的障碍物层(这里的障碍物层本应该和静态层重合的,但由于定位偏差,不会重合)可能会使得机器人误以为自己在障碍物层内,规划出现问题。


    下面我们我们说说move_base核心的部分了,也就是框框内的部分,主要包括global planner和local planner以及一些修复机制,包括rotate_recovery和clear_cost_map_recovery。有人可能会问,global planner是怎么和local planner联通的呢,这里不同的算法可能使用了不同的方法了,但核心都是大致相同了,都是将global planner作为local planner的一个初始参考或者优化方向。这些在深入看两个源码时就会有更加深入的理解了。目前ROS中可以使用的global planner主要包括:A*和Dijkstra。local planner主要有:dwa、trajectory、teb和eband等。目前自我感觉teb local planner效果会好点,有时间会详细的介绍一样该算法的思路,下面我把我的关于move_base的一些配置放到下面。

    首先,启动move_base的launch,包括解析map,move_base和amcl定位三个部分,这构成了一个完整的框架,下面我们主要来看move_base.launch里的配置。

    <launch>
     
      <param name="use_sim_time" value="false" />
      
      <!-- EDIT THIS LINE TO REFLECT THE NAME OF YOUR OWN MAP FILE 
           Can also be overridden on the command line -->
      <arg name="map" default="test_map.yaml" />
     
      <!-- Run the map server with the desired map -->
      <node name="map_server" pkg="map_server" type="map_server" args="$(find dart_nav)/maps/dart.yaml"/> 
     
      <!-- Start move_base  -->
      <include file="$(find dart_nav)/launch/tb_move_base_test.launch" />
     
      <!-- Fire up AMCL -->
      <include file="$(find dart_nav)/launch/tb_amcl.launch" /> 
     
     
    </launch>


    下面是move_base.launch内的配置:

    <launch>
      <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
        <rosparam file="$(find dart_nav)/config1/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find dart_nav)/config1/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find dart_nav)/config1/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find dart_nav)/config1/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find dart_nav)/config1/teb_local_planner_params.yaml" command="load" />
     
         <param name="base_global_planner" value="global_planner/GlobalPlanner"/> 
         <param name="planner_frequency" value="1.0" />
         <param name="planner_patience" value="5.0" />
     
         <param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
         <param name="controller_frequency" value="15.0" />
         <param name="controller_patience" value="15.0" />
     <rosparam file="$(find dart_nav)/config1/costmap_conversion_params.yaml" command="load" />
     
      </node>
      
    </launch>


    如上所示,我使用的是global_planner这个包,它默认使用的是dijkstra,当然也可以使用A*全局路径规划,局部路径规划我使用的是teb,同样需要配置上面第3行到第7行的一些yaml,这些yaml是costmap和planner的一些配置文件。我们来主要看一下local_costmap_params.yaml和global_costmap_params.yaml。这里配置了上面提到的各个层(layers)的使用。

    local_costmap_params.yaml:

    local_costmap:
       global_frame: /odom
       robot_base_frame: /base_link
       update_frequency: 3.0
       publish_frequency: 1.0
       static_map: false
       rolling_window: true
       width: 6.0
       height: 6.0
       resolution: 0.05
       transform_tolerance: 1.0
       map_type: costmap
       plugins:
         - {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
    #     - {name: social_layer,        type: "social_navigation_layers::ProxemicLayer"}   
    #     - {name: social_pass_layer,        type: "social_navigation_layers::PassingLayer"}  
    #     - {name: static_layer, type: "costmap_2d::StaticLayer"} 
         - {name: inflation_layer, type: "costmap_2d::InflationLayer"}
     
      #Configuration for the sensors that the costmap will use to update a map   
       obstacle_layer:
         observation_sources: scan  
         scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0} 
       inflation_layer: 
          inflation_radius: 0.35


    这里由于是局部层,所以我们要把static_map设为fasle,我们并不希望使用静态的地图,因为这不利于我们的局部避障,rollung_window设为true。下面的plugins就为各个层的设置了,在局部路径规划中我们只需要考虑障碍物的信息就可以了,不需要考虑我们之前slam建立的静态地图,所有我们添加了两个图层,即障碍物层和障碍物的膨胀层,下面这个很重要,我们需要声明我们的障碍物层的数据来源,即scan,要把topic对应你的scan的topic,否则你可能发现rviz里的local_costmap没有数据,这就是你没有声明的原因。最后两行为设置膨胀层的半径大小。

    global_planner_params.yaml:

    global_costmap:
       global_frame: /map
       robot_base_frame: /base_footprint
       update_frequency: 1.0
       publish_frequency: 0
       static_map: true
       rolling_window: false
       resolution: 0.05
       transform_tolerance: 1.0
       map_type: costmap
       plugins:
    #     - {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
         - {name: static_layer, type: "costmap_2d::StaticLayer"} 
       
         - {name: inflation_layer, type: "costmap_2d::InflationLayer"}
       inflation_layer: 
          inflation_radius: 0.35


    如上,由于在全局路径规划中,我们只应该考虑静态地图,即我们之前slam建立好的地图,所以我们把static_map设为true,rolling_window设为false,再看plugins:有两个层,静态层和膨胀层,这样就完成了global的yaml的配置,如果你需要把障碍物层也添加到全局地图中,plugins加入,同时别忘了在下面声明数据来源,但我个人不推荐将障碍物层加入到global中来。

    下面就是我使用的teb的local_planner的yaml了:


    TebLocalPlannerROS:
     

     odom_topic: odom
     map_frame: /odom
     
     # Trajectory
     
     teb_autosize: True
     dt_ref: 0.3
     dt_hysteresis: 0.1
     global_plan_overwrite_orientation: True
     max_global_plan_lookahead_dist: 3.0
     feasibility_check_no_poses: 5
     
     # Robot
     
     max_vel_x: 0.4
     max_vel_x_backwards: 0.15
     max_vel_theta: 0.4
     acc_lim_x: 2.0
     acc_lim_theta: 1.0
     min_turning_radius: 0.0
    # footprint_model/type: "circular"
    # footprint_model/radius: 0.40 # for type "circular"
     
     # GoalTolerance
     
     xy_goal_tolerance: 0.15
     yaw_goal_tolerance: 0.2
     free_goal_vel: False
     
     # Obstacles
     
     min_obstacle_dist: 0.45
     include_costmap_obstacles: True
     costmap_obstacles_behind_robot_dist: 1.0
     obstacle_poses_affected: 30
     costmap_converter_plugin: ""
     costmap_converter_spin_thread: True
     costmap_converter_rate: 5
     
     # Optimization
     
     no_inner_iterations: 5
     no_outer_iterations: 4
     optimization_activate: True
     optimization_verbose: False
     penalty_epsilon: 0.1
     weight_max_vel_x: 2
     weight_max_vel_theta: 1
     weight_acc_lim_x: 1
     weight_acc_lim_theta: 1
     weight_kinematics_nh: 1000
     weight_kinematics_forward_drive: 1
     weight_kinematics_turning_radius: 1
     weight_optimaltime: 1
     weight_obstacle: 300   #50
     weight_dynamic_obstacle: 10 # not in use yet
     alternative_time_cost: False # not in use yet
     
     # Homotopy Class Planner
     
     enable_homotopy_class_planning: False
     enable_multithreading: True
     simple_exploration: False
     max_number_classes: 4
     roadmap_graph_no_samples: 15
     roadmap_graph_area_width: 5
     h_signature_prescaler: 0.5
     h_signature_threshold: 0.1
     obstacle_keypoint_offset: 0.1
     obstacle_heading_threshold: 0.45
     visualize_hc_graph: False


    这里没什么好说的,简单介绍一下teb算法,teb是一个基于图优化的局部路径规划,了解slam的应该都知道BA(bundle adjustment),这里类似,是通过把路径问题构建成一个图优化的问题,然后通过g2o开源库求解优化,teb中是通过对全局路径规划的点(A*或dijkstra)进行优化,也就是最小化误差,这里的误差项为速度,加速度,避障,追踪全局路径等等,最后优化出最优的局部路径.


     

    展开全文
  • Java项目工程中utils包与tools包的理解

    千次阅读 2020-04-20 11:23:48
    以下是本人对utils包与tools包的分别理解: 定义: 包名 定义 方法或属性 举例 utils 通用的且与项目业务无关的类的组合;可供其他项目使用 方法通常是public static的;一般无类的属性,如果有,也是...

    在java工程中,一般我们会用UtilsTools的包名来封装一些通用的工具类。单单从字面上来看,两者都可以表示工具的意思,但往往并不能做出比较精准的定义。以下是本人对utils包与tools包的定义及理解:

    定义:

    包名 定义 方法或属性 举例
    utils 通用的且与项目业务无关的类的组合;可供其他项目使用 方法通常是public static的;一般无类的属性,如果有,也是public static的 字符串工具类,文件工具类等
    tools 当前项目中通用的业务类的组合;仅能当前项目使用 不限 用户校验工具类,支付工具类等

    例子:

    Utils:

    public class StringUtils {
    	...
    	public static final String SPACE = " ";
     	public static final String EMPTY = "";
     	...
     	public static boolean isEmpty(final CharSequence cs) {
            return cs == null || cs.length() == 0;
        }
         public static boolean isBlank(final CharSequence cs) {
            int strLen;
            if (cs == null || (strLen = cs.length()) == 0) {
                return true;
            }
            for (int i = 0; i < strLen; i++) {
                if (!Character.isWhitespace(cs.charAt(i))) {
                    return false;
                }
            }
            return true;
        }
        ...
     }   
    

    Tools:

    /**
    *验证工具类接口定义
    */
    public interface VerificationTools {
    
        /**
         * 发送邮件验证码
         * @param code 验证码
         * @return EmailVo
         */
        EmailVo sendEmail(VerificationCode code);
    
        /**
         * 验证用户
         * @param user实体类
         * @return 返回是或否
         */
        Boolean validatedUser(User user);
    }
    
    展开全文
  • ROS Navigation包的理解

    千次阅读 2018-04-09 11:25:12
    分三大块来理解,costmap,globalplanner,baselocalplanner 1.costMap 在costmap这一模块上面,首先就提出了分层 如果是一整张图,那么我们对图任何修改都会在它上面完成。实际上当信息量太多时候,很有可能...
  • PO、VO、POJO、DTO、DAO、Service包等常见包的理解

    千次阅读 多人点赞 2018-04-19 20:24:18
    POJO(Plain Ordinary Java Object),简单Java对象,名字强调它是一个普通java对象。 POJO只有private属性以及这个属性publicget和set方法,只能装载数据,也不能实现接口。 POJO不是JavaBean,不承担任何...
  • 彻底理解0-1背包问题

    万次阅读 多人点赞 2018-10-07 08:33:04
    给定n个重量为w1,w2,w3,…,wn,价值为v1,v2,v3,…,vn物品和容量为C背包,求这个物品中一个最有价值子集,使得在满足背包容量前提下,总价值最大 0-1背包问题指是每个物品只能使用一次 递归方法 ...
  • 动态规划之01背包问题(最易理解的讲解)

    万次阅读 多人点赞 2012-07-06 17:09:37
    01背包问题,是用来介绍动态规划算法最经典例子,网上关于01背包问题讲解也很多,我写这篇文章力争做到用最简单方式,最少公式把01背包问题讲解透彻。 01背包状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi...
  • 深入理解Python的包机制

    千次阅读 2014-09-03 16:19:08
    最近在重构Python代码时,感觉代码只分割到文件有点不够用了,但以前对Python的机制一直缺乏比较深入的理解,借此机会提升一下,彻底弄清楚Python的机制,更好组织代码结构。后面逐渐把Python工具箱使用组织...
  • Java——(概念理解+应用举例)

    千次阅读 2020-06-08 12:08:46
    1.对包的理解(Package) 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。Java 中的一个package(包)就是一个类库单元。 包内包含有一组类,他们在单一的名字空间之下被逻辑组织在了一起。 ...
  • 想彻底理解一个TCP机制,有个四部曲:1.读与其相关RFC;2.看Linux协议栈TCP实现;3.通过抓以及其它工具来确认事实就是如此;4.解决一个与之相关网络问题。经历了以上四步骤,相信任何人都可以在相关领域内...
  • Wireshark 抓包理解 HTTPS 协议

    千次阅读 2019-05-26 21:38:37
    Wireshark 抓包理解 HTTPS 协议 HTTPS 简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer)协议是 HTTP 协议安全版,在 HTTP 应用层和传输层加入了 SSL/TLS 层,确保数据传输安全性,...
  • 安卓多渠道打包意义理解

    千次阅读 2015-09-25 09:34:32
    安卓多渠道打包: 顾明思义:就是说标记我这个应用是来自于哪一个渠道,譬如...我给三家门店不同渠道,三家门店分别推广自己APK, 通过友盟这样统计系统去统计不同渠道装机量,以便于看看业务达标情况等
  • java中package(使用理解

    千次阅读 2018-08-09 22:20:12
    java中package(使用理解 2017年02月05日 02:30:08 阅读数:14186 最近在学习java,在学习到对象和类这一部分时,接触了java中很重要一个概念:package,也就是。一开始对于package使用我产生了许多...
  • 「软件测试」 抓token的理解

    千次阅读 2019-05-30 19:58:36
    国内大部分的授权协议都是Oauth2.0。... 通过token证明你可以有资格对这个测试环境中的页面进行抓包。...其实抓包是一个很简单的概念,只要对http协议有基本的了解就可以,网上有大量的可以抓包的库。其实只要时基本的...
  • 理解Java中【概念

    千次阅读 2016-10-29 12:51:15
    Java中用package关键字定义一个包,下面通过几个实验,理解Java中的包的概念和作用。 实验1:先看一个无包的情形 在G盘下新建一个Test.java,如图1: 111:11111111 写下面这些代码 public class PackageTest{ ...
  • jar和war区别及理解

    千次阅读 2020-07-20 16:04:37
    在开发阶段不适合使用war,因为在开发阶段,经常需要添加或删除Web应用程序内容,更新 Servlet类文件,而每一次改动后,重新建立war将是一件浪费时间事情。在产品发布阶段,使用war文件比较合适,因为在这...
  • 深入理解FIFO(包含有FIFO深度解释)

    万次阅读 多人点赞 2018-10-16 15:27:48
    深入理解FIFO(包含有FIFO深度解释)  FIFO:  一、先入先出队列(First Input First Output,FIFO)这是一种传统按序执行方法,先进入指令先完成并引退,跟着才执行第二条指令。  1.什么是FIFO?  FIFO是...
  • 浅谈bluebird包的使用理解

    千次阅读 2018-11-27 14:58:54
    bluebird是一个第三方Promise类库,相比其它第三方类库...通过require获取对模块引用:cnst Promise = require('bluebird'); 我们可以看到官方api使用说明 但我们在项目中常会使用方法有一下几部分 1:.all...
  • java.nio包的分析(三)---Charset的理解

    千次阅读 2014-10-03 11:14:22
    前面分析完2个主要的包类,现在我们来揭开Java.nio最后块神秘知识点,Charset编码类,他功能主要是实现字节与Unicode之间转码转换。同样先来看看他的包结构。,结构比较单一和简单。 里面一个最最主要...
  • 关于babel 一些包理解7.X版本

    千次阅读 2018-10-10 14:52:14
    babel 核心,编译器。提供转换API @babel/cli  babel命令行工具,通过命令行对js代码进行转译 具体命令使用:https://babeljs.io/docs/en/babel-cli  启动babel/cli 编译器 /node_modules/.bin/...
  • 作者:朱金灿http://blog.csdn.net/clever101 类...因此我们有必要搞清楚二者区别以及二者适用场合。 首先我们需要问一个问题是:为什么两个类不能互相包含头文件?所谓互相包含头文件,我举一个例子:我实现了
  • 理解v4下ViewPager类用法

    千次阅读 2016-07-28 19:47:19
    说到ViewPager, 有2个问题1、ViewPager默认会初始化几个fragment?... 本文所说类都是v4, 如android.support.v4.view.ViewPager。 我们看google对ViewPager类注释, 这里要更正一下,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,643
精华内容 29,857
关键字:

包的理解