#navigation

2023-05-16

#navigation

1.安装相关依赖

sudo apt-get install ros-kinetic-navigation
sudo apt-get install ros-kinetic-move-base
sudo apt-get install ros-kinetic-amcl 
sudo apt-get install ros-kinetic-dwa-local-planner 
sudo apt-get install ros-kinetic-teb-local-planner 
sudo apt-get install ros-kinetic-navfn ros-kinetic-global-planner

2.创建功能包

cd ros_ws/src
catkin_create_pkg xqrobot_navigation

在这里插入图片描述
在这里插入图片描述

3.配置rviz

先在xqrobot_navigation功能包里面新建一个名为config的文件夹,用以存放.rviz文件。

 cd xqrobot_navigation
 mkdir config

(1) 运行主节点roscore:
在这里插入图片描述
(2)启动rviz:
在这里插入图片描述
(3)点击“Add”,添加“Map”(topic可先不改)
在这里插入图片描述
(4)点击“Add”,添加“RobotModel”
在这里插入图片描述
(5)点击“Add”,添加“LaserScan”(size改为0.03,topic先不改)
在这里插入图片描述
(6)点击“Add”,添加“Group”(添加两个,分别重命名为“Global”、“Local”)、
在这里插入图片描述
(7)点击“Add”,添加两个“Map”、两个“Path”,鼠标左键按住不动,分别将它们分别拖到“Global”、“Local”中,如下图。(其中一个“Path可以修改颜色,用以区分”)
在这里插入图片描述
(8)点击“Add”,添加“Pose”、“PointCloud2”、“PoseArry”
在这里插入图片描述
(9)将配置好的rviz保存到刚才新建的config文件夹下(在左上角)
在这里插入图片描述
在这里插入图片描述
点进去找到config目录保存好就行。

4.创建yaml参数文件

同样需要先在xqrobot_navigation功能包里面新建params文件夹存放下面6个.yaml文件。
新建文件用命令“touch”,打开文件用“gedit”命令。

cd xqrobot_navigation
mkdir params

① navfn 全局路径规划器(navfn_global_planner_params.yaml)

NavfnROS: 
  visualize_potential: false 
  allow_unknown: false 
  planner_window_x: 0.0 
  planner_window_y: 0.0 
  default_tolerance: 0.0

②DWA 局部路径规划器(dwa_local_planner_params.yaml)

DWAPlannerROS:
  max_vel_x: 0.5 # 0.55 
  min_vel_x: 0.0 
  max_vel_y: 0.0 
  min_vel_y: 0.0 
  max_trans_vel: 0.5 
  trans_stopped_vel: 0.2 
  max_rot_vel: 1.5 
  min_rot_vel: 0.3 
  rot_stopped_vel: 0.3 
  acc_lim_x: 2.0 
  acc_lim_theta: 3.0 
  acc_lim_y: 0.0 
  yaw_goal_tolerance: 0.3 
  xy_goal_tolerance: 0.15 
  latch_xy_goal_tolerance: false 
  sim_time: 1.7 
  sim_granularity: 0.04 
  vx_samples: 6 
  vy_samples: 1 
  vtheta_samples: 20 
  path_distance_bias: 30.0 
  goal_distance_bias: 24.0 
  occdist_scale: 0.2 
  forward_point_distance: 0.325 
  stop_time_buffer: 0.4 
  scaling_speed: 0.25 
  max_scaling_factor: 0.2 
  oscillation_reset_dist: 0.05 
  controller_frequency: 20.0 
# Debugging 
  publish_cost_grid_pc: true 
  global_frame_id: odom

③代价地图公有参数配置 (common_costmap_params.yaml)

# Obstacle Cost Shaping (http://wiki.ros.org/costmap_2d/hydro/inflation) 
robot_radius: 0.25 # distance a circular robot should be clear of the obstacle 
#footprint: [[x0, y0], [x1, y1], ... [xn, yn]] # if the robot is not circular 

map_type: voxel 
#map_type: costmap 
obstacle_layer: 
  #Global Filtering Parameters 
    max_obstacle_height: 0.7 
    obstacle_range: 3.0 
    raytrace_range: 4.0 
  #ObstacleCostmapPlugin 
    track_unknown_space: false 
    footprint_clearing_enabled: true 
  #VoxelCostmapPlugin 
    origin_z: 0 #(double, default: 0.0) 
    z_resolution: 0.2 #(double, default: 0.2) 
    z_voxels: 10 #(int, default: 10) 
    unknown_threshold: 10 #(int, default: ~<name>/z_voxels) 
    mark_threshold: 0 #(int, default: 0) 
    publish_voxel_map: false #(bool, default: false) 
    footprint_clearing_enabled: true #(bool, default: true) 
    combination_method: 1 
    enabled: true
  #Sensor management parameters 
    observation_sources: bump scan #ultrasonic 
    bump: 
        data_type: PointCloud2 
        topic: /kinect_camera/depth/points 
        sensor_frame: kinect_frame_optical 
        observation_persistence: 0 
        expected_update_rate: 0.0 #(double, default: 0.0) 
        marking: true 
        clearing: true 
        min_obstacle_height: 0.1 
        max_obstacle_height: 0.8 
        obstacle_range: 3.0 
        raytrace_range: 4.0 
        inf_is_valid: false 
    # for debugging only, let's you see the entire voxel grid 
    scan: 
        data_type: LaserScan 
        topic: scan 
        sensor_frame: laser_rada_Link 
        observation_persistence: 0 
        expected_update_rate: 0.0 #(double, default: 0.0) 
        marking: true 
        clearing: true 
        min_obstacle_height: 0.1 
        max_obstacle_height: 0.8 
        obstacle_range: 4.0 
        raytrace_range : 5.0 
        inf_is_valid: false 
#cost_scaling_factor and inflation_radius were now moved to the inflation_layer ns
inflation_layer: 
    enabled: true 
    cost_scaling_factor: 5.0 # exponential rate at which the obstacle cost drops   off (default: 10) 
    inflation_radius: 0.3 # max. distance from an obstacle at which costs are incurred for planning paths. 
    
static_layer: 
    unknown_cost_value: -1 
    lethal_cost_threshold: 100 
    map_topic: map 
    first_map_only: false 
    subscribe_to_update: false 
    track_unknown_space: true 
    use_maximum: false 
    trinary_costmap: true 
    enabled: true

④ 全局代价地图参数配置(global_costmap_params.yaml)

global_costmap:
    global_frame: /map
    robot_base_frame: /base_footprint 
    update_frequency: 1.0 
    publish_frequency: 0.5 
    static_map: true 
    transform_tolerance: 0.5 
    plugins:     
     - {name: static_layer, type: "costmap_2d::StaticLayer"} 
     - {name: obstacle_layer, type: "costmap_2d::VoxelLayer"} 
     - {name: inflation_layer, type: "costmap_2d::InflationLayer"}

⑤ 局部代价地图参数配置(local_costmap_params.yaml)

local_costmap: 
    global_frame: odom 
    robot_base_frame: /base_footprint 
    update_frequency: 5.0 
    publish_frequency: 2.0 
    static_map: false 
    rolling_window: true 
    width: 4.0 
    height: 4.0 
    resolution: 0.05 
    transform_tolerance: 0.5 
    plugins: 
     - {name: obstacle_layer,type: "costmap_2d::VoxelLayer"} 
     - {name: inflation_layer,type: "costmap_2d::InflationLayer"}

⑥ move_base参数配置(move_base_navfn_dwa_params.yaml)

# Move base node parameters. For full documentation of the parameters in this  file, please see 
shutdown_costmaps: false 
controller_frequency: 5.0 
controller_patience: 3.0 
planner_frequency: 1.0 
planner_patience: 5.0 
oscillation_timeout: 10.0 
oscillation_distance: 0.2 

# local planner - default is trajectory rollout 
base_local_planner: "dwa_local_planner/DWAPlannerROS" 
#alternatives: global_planner/GlobalPlanner, carrot_planner/CarrotPlanner 
base_global_planner: "navfn/NavfnROS"
#We plan to integrate recovery behaviors for turtlebot but currently those  belong to gopher and still have to be adapted. 
## recovery behaviors; we avoid spinning, but we need a fall-back replanning 
#recovery_behavior_enabled: true 
#recovery_behaviors: 
 #- name: 'super_conservative_reset1' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'conservative_reset1' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'aggressive_reset1' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'clearing_rotation1' 
  #type: 'rotate_recovery/RotateRecovery' 
 #- name: 'super_conservative_reset2' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'conservative_reset2' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'aggressive_reset2' 
  #type: 'clear_costmap_recovery/ClearCostmapRecovery' 
 #- name: 'clearing_rotation2' 
  #type: 'rotate_recovery/RotateRecovery' 
#super_conservative_reset1: 
 #reset_distance: 3.0 
#conservative_reset1: 
 #reset_distance: 1.5 
#aggressive_reset1: 
 #reset_distance: 0.0 
#super_conservative_reset2: 
 #reset_distance: 3.0 
#conservative_reset2: 
 #reset_distance: 1.5 
#aggressive_reset2: 
 #reset_distance: 0.0

5.在launch目录中创建.launch文件

同样需要先在xqrobot_navigation功能包下新建launch文件夹存放下面4个.launch文件。
新建文件用命令“touch”,打开文件用“gedit”命令。
① amcl.launch(amcl启动文件)

<launch> 
<arg name="use_map_topic" default="false"/> 
<arg name="scan_topic" default="/scan"/> 
<arg name="initial_pose_x" default="0"/> 
<arg name="initial_pose_y" default="0"/> 
<arg name="initial_pose_a" default="0"/>
<arg name="odom_frame_id" default="/odom"/> 
<arg name="base_frame_id" default="/base_footprint"/> <arg name="global_frame_id" default="/map"/>
<node pkg="amcl" type="amcl" name="amcl">
<param name="use_map_topic" value="$(arg use_map_topic)"/>
<param name="odom_model_type" value="diff"/>
<param name="odom_alpha5" value="0.1"/>
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="60"/>
<param name="laser_max_range" value="12.0"/>
<param name="min_particles" value="500"/>
<param name="max_particles" value="2000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.04"/>
<param name="odom_alpha2" value="0.6"/>
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.3"/>
<param name="odom_alpha4" value="0.04"/>
<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"/>
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.25"/>
<param name="update_min_a" value="0.2"/>
<param name="odom_frame_id" value="$(arg odom_frame_id)"/>
<param name="base_frame_id" value="$(arg base_frame_id)"/>
<param name="global_frame_id" value="$(arg global_frame_id)"/>
<param name="resample_interval" value="1"/>
<!-- Increase tolerance because the computer can get quite busy -->
<param name="transform_tolerance" value="1.0"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
<param name="initial_pose_x" value="$(arg initial_pose_x)"/>
<param name="initial_pose_y" value="$(arg initial_pose_y)"/>
<param name="initial_pose_a" value="$(arg initial_pose_a)"/>
<remap from="scan" to="$(arg scan_topic)"/>
<remap from="amcl_pose" to="/amcl_pose"/>
<remap from="particlecloud" to="/particlecloud"/>
</node>
</launch>

② map_server.launch(map_server启动文件)

<launch> 
<arg name="map_file" default=" $(find xqrobot_gmapping)/maps/gmapping_sim.yaml"/> 
<!-- ****** Maps ***** --> 
<node name="map_server" pkg="map_server" type="map_server" args="$(arg 
map_file)"> 
<param name="frame_id" value="/map"/> 
</node> 
</launch>

③ move_base_navfn_dwa.launch (navfn+dwa版move_base启动文件)

<launch> 
<arg name="odom_frame_id" default="/odom"/> 
<arg name="base_frame_id" default="/base_footprint"/> 
<arg name="global_frame_id" default="/map"/> 
<arg name="odom_topic" default="/odom" /> 
<arg name="laser_topic" default="/scan" /> 

<node pkg="move_base" type="move_base" respawn="false" name="move_base_node" output="screen"> 
<rosparam file="$(find xqrobot_navigation)/params/common_costmap_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find xqrobot_navigation)/params/common_costmap_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find xqrobot_navigation)/params/local_costmap_params.yaml" command="load" />
<rosparam file="$(find xqrobot_navigation)/params/global_costmap_params.yaml" command="load" />
<rosparam file="$(find xqrobot_navigation)/params/dwa_local_planner_params.yaml" command="load" />
<rosparam file="$(find xqrobot_navigation)/params/move_base_navfn_dwa_params.yaml" command="load" />
<rosparam file="$(find xqrobot_navigation)/params/navfn_global_planner_params.yaml" command="load" />
<!-- reset frame_id parameters using user input data -->
<param name="global_costmap/global_frame" value="$(arg global_frame_id)"/>
<param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
<param name="local_costmap/global_frame" value="$(arg odom_frame_id)"/>
<param name="local_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
<param name="DWAPlannerROS/global_frame_id" value="$(arg odom_frame_id)"/>

<remap from="odom" to="$(arg odom_topic)"/>
<remap from="scan" to="$(arg laser_topic)"/>
<remap from="cmd_vel" to="/cmd_vel"/>
</node>
</launch>

④xqrobot_navigation_navfn_dwa.launch(navfn+dwa版导航总启动文件)

<launch> 
<!--gazebo--> 
<include file="$(find xqrobot_description)/launch/display_xqrobot_gazebo.launch"/> 
<!--map_server--> 
<include file="$(find xqrobot_navigation)/launch/map_server.launch"/> 
<!--move_base--> 
<include file="$(find xqrobot_navigation)/launch/move_base_navfn_dwa.launch"/> 
<!--amcl--> 
<include file="$(find xqrobot_navigation)/launch/amcl.launch"/>
<!-- **************** Visualisation **************** -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find xqrobot_navigation)/config/navigation.rviz"/>
</launch>

6.maps

将上次Gmapping保存地图时生成的两个文件调整一下位置。
原位置:
在这里插入图片描述
新位置:
在xqrobot_gmapping功能包下新建一个名为“maps”的文件夹,然后把map.pgm和“map.yaml”放进去,并将“map.yaml”改名为“gmapping_sim.yaml”。
在这里插入图片描述

7.运行仿真结果

(1)安装依赖

sudo apt-get install ros-kinetic-global-planner 
sudo apt-get install ros-kinetic-navfn 
sudo apt-get install ros-kinetic-dwa-local-planner 
sudo apt-get install ros-kinetic-teb-local-planner

(2)编译(catkin_make)在这里插入图片描述
(3)运行
回到工作空间运行以下命令,roslaunch那句注意巧用“Tab”键补齐,补不齐的,可能会报错。

export SVGA_VGPU10=0
source devel/setup.bash
roslaunch xqrobot_navigation xqrobot_navigation_navfn_dwa.launch

在这里插入图片描述
在这里插入图片描述
运行起来之后,rviz中的Map、LaserScan等的“topic”可以下拉选择,大概就如下图所示了,出不来就就就,摆烂吧 ~ (上图是经过我缩放、摆正过的,并不是运行roslaunch就能像我的一样!)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

8.仿真环境开始自主导航效果

① gazebo物理仿真环境中截图
在这里插入图片描述

② rviz可视化界面截图
在这里插入图片描述
点击“2D Nav Goal”之后画个箭头,机器人就能自动形成轨迹过去了。

③ 使用QT可视化工具,查看topic之间的关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.拜拜 ~

如果遇到以下错误的,不要找我,(因为我也不会)我只能告诉你去重新装虚拟机。第一个是安装不了相关依赖,第二个问题我也看不懂,貌似是move_base和Map_server的问题。除了这两个错误,其他的错误可以私信我。
在这里插入图片描述
在这里插入图片描述
附:实践报告七(仅供参考,请勿他用!)

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

#navigation 的相关文章

  • Angular 4 + zonejs:路由在未捕获的错误后停止工作

    如果在路由期间组件 构造函数或 ngOnInit 出现未捕获的错误 则导航将不再起作用 即使有一个全局 ErrorHandler 和一个用于 RouterModule 的 ErrorHandler 也会发生这种情况 也添加了一个 ZoneL
  • 如何将滑动选项卡视图放入导航抽屉选项之一

    更新的代码 Override public View onCreateView LayoutInflater inflater ViewGroup container Bundle savedInstanceState View rootV
  • React Native - 设备后退按钮处理

    我想检查当按下设备后退按钮时是否有多个屏幕在堆栈上 如果是 我想显示上一个屏幕 如果否 我想退出应用程序 我已经检查了一些例子 但那些使用BackAndroid and Navigator 但它们都已被弃用 BackHandler是替代Ba
  • 在 emacs 中跳转 java 方法

    我想通过方法跳转我的java文件 例如当我到达任何地方时 执行一个键盘快捷键即可跳转到方法的下一个结尾或方法的开头 Emacs 的 通过 defuns 移动 与 C M a 和 C M e 对于 C 来说非常有用 并且完全符合我的要求 但显
  • 导航到目的地时仅创建一个片段实例(android)

    我正在使用导航组件 导航时 如果片段已经存在于后台堆栈中 我不想创建新的片段实例 并弹出前面已经存在的片段 findNavController navigate RequestTransferFragmentDirections actio
  • 如何防止 Eclipse 在包资源管理器中显示打开的文件

    不知何故 我最终遇到这样的情况 当我使用 Eclipse 浏览源文件时 Eclipse 总是选择 并展开 使用包资源管理器打开的文件 有了这个我结束了 在 Package Explorer 上丢失我的位置 我的包资源管理器扩展并且非常混乱
  • 如何清除导航堆栈?

    我的应用程序中的导航有问题 我使用 xamarin forms 如何清理我的导航堆栈 不使用 Pop 和 Push 我可以查看完整的导航堆栈吗 在最新版本的 Xamarin Forms 中 您可以使用以下方式查看导航堆栈 Navigatio
  • 谷歌地图API可以进行语音导航吗?

    如何使用 google 地图 api v3 激活基于语音的方向 我已经实现了给出从起点到终点的方向的地图 但现在我想听听我当前所在位置的名称 请帮忙 我在 ios UIWebView 中实现了它 所以我从 GPS 获取当前位置 现在我每 2
  • React Native 导航显示白屏

    使用反应本机导航进行编译时出现白屏 请问为什么会这样 我似乎没有收到任何错误代码 什么也没有 我只看到一个白屏 为什么会这样呢 我的代码看起来像这样 表明到目前为止我似乎没有任何错误 Here is what the Error seems
  • 如何在 React-Navigation/Drawer 6 中实现“返回”

    我在 React navigation drawer 6 中实现 goBack 功能时遇到问题 react navigation drawer 6 1 4 准确地说 我能够使用以下代码在react navigation drawer 5中完
  • html5 Android 应用程序上的 Google 导航

    我只是想知道是否有人可以解释为什么这种情况发生在我身上 我正在使用phonegap 和jquerymobile 开发一个移动应用程序 该应用程序的功能之一是引导用户使用导航工具 对于 iOS 我们选择 Waze 添加它真的很容易 a hre
  • 如何导航到托管 bean 中的另一个页面?

    我正在尝试使用命令按钮转发托管 bean 中的页面
  • JSF 2 全局异常处理,导航到错误页面未发生

    我正在开发一个基于 JSF 2 0 的 Web 应用程序 我正在尝试实现一个全局异常处理程序 每当发生任何异常 例如 NullPointerException ServletException ViewExpiredException 等
  • Eclipse 的 Visual Studio Ctrl+Tab 和 Ctrl+Shift+Tab 等效项

    In Visual Studio I always use Ctrl Tab and Ctrl Shift Tab to navigate between documents I see that Eclipse has Ctrl F6 t
  • NavigationUI 无法与底部导航视图实现一起正常工作

    所以我有一个场景 其中我有 5 个带有底部导航的片段 1 主页 2 收件箱 3 搜索 4 通知 5 个人资料 因此 我有另一个名为 BarcodeDetail 的片段 我从 Home Fragment 导航到该片段 首页 gt 条码详情 现
  • Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航

    我的应用程序具有以下结构 并且由于路线 B 有自己的底部导航栏 因此有自己的 NavHost 我如何从屏幕 C 从选项卡栏打开 导航到路线 A Nested Route onboarding route startDestination s
  • 从 ADF Faces JSF 1.2 中的托管 bean 构造函数导航

    是否可以从托管 bean 的构造函数导航到另一个页面 视图 如果发生任何异常 我希望进行此重定向 我尝试了很多方法 Try 1 getFacesContext responseComplete getFacesContext getAppl
  • 更改垂直分隔线导航栏

    我正在尝试更改 Bootstrap 中垂直分隔线类的背景图像 我有这个菜单 div class navbar div class navbar inner a class brand href a ul class nav li class
  • 现代 UI WPF 导航

    我正在使用现代 ui wpf 并尝试从 CheckLogin xaml 页面导航到 MainWindow xaml 页面 它们位于解决方案根目录中 我在 CheckLogin xaml 中写了这样的内容 BBCodeBlock bbBloc
  • 在 Android 中使用 Fragment 时处理后按

    我在应用程序中使用 Android 滑动菜单和导航抽屉 并且在应用程序中使用片段而不是活动 当我打开抽屉时 单击一个项目会出现一个片段 我使用以下代码从一个片段移动到另一个片段 Fragment fragment null fragment

随机推荐

  • socket编程十三:send()/recv()和write()/read():发送数据和接收数据

    在 Linux 和 Windows 平台下 xff0c 使用不同的函数发送和接收 socket 数据 xff0c 下面我们分别讲解 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件 xff0c 使用 write 可以向套
  • 【数据结构与算法】(JAVA版)8大排序算法带图文解说,选择排序,冒泡排序,插入排序,希尔排序,快速排序,归并排序,基数排序,堆排序

    排序算法 常见排序列表 xff1a 1 冒泡排序 xff08 Bubble Sorting xff09 span class token keyword package span span class token namespace que
  • 【数据结构与算法】(Java)二分法查找,插值查找,斐波那契查找,哈希表应用场景:员工信息管理在内存中

    查找算法 有序表查找 二分法查找 span class token keyword package span span class token namespace dataStructure span span class token pu
  • ubuntu 20.04 | 设置默认 python、pip(软连接)并换源

    ubuntu 20 04 设置默认python pip xff08 软连接 xff09 并换源 PythonPip1 安装pip32 建立软连接3 更换pip源4 更新pip5 卸载pip6 使用pip6 1 pip安装软件包6 2 pip
  • JavaWeb实现简单登录功能

    创建一个web项目 xff0c 配置好Tomcat xff0c java环境 xff0c 并部署到idea中 xff0c 安装好MySQL并导入jar包 mysql connector的jar包 jquery的js包 servlet api
  • telnet是什么

    Telnet是远程连接服务 xff0c 它工作于tcp ip协议的应用层 telnet命令通常用来远程登录 是Internet远程登陆服务的标准协议和主要方式 它为用户提供了在本地计算机上完成远程主机工作的能力 在终端使用者的电脑上使用te
  • 头文件与库文件的区别

    一 头文件与库文件的区别 头文件一般而言 xff0c 是申明和定义 库文件是已经编译好的二进制代码 这个二进制代码可以是动态的 xff0c 如 so xff1b 也可以是静态的 xff0c 如 a 如果是动态的 xff0c 则最后生成的程序
  • C++入门 vector的使用 + 进阶【模拟实现】

    目录 基本接口函数介绍迭代器空间容量增删查改迭代器失效问题探讨 vector模拟实现reserve迭代器空间容量删除insert析构函数vector拷贝构造函数拷贝赋值运算符 基本接口函数介绍 函数名功能vector xff08 重点 xf
  • C++11:继承

    目录 继承的基本概念 继承方式 基类和派生类对象赋值转换 切片 继承中的作用域 派生类的四个成员函数 xff1a 构造函数 拷贝构造函数 赋值重载 析构函数 静态成员 继承与友元 多继承 菱形继承 多继承的指针偏移问题 组合 继承的基本概念
  • socket编程二十六:基于UDP的服务器端和客户端

    前面的文章中我们给出了几个 TCP 的例子 xff0c 对于 UDP 而言 xff0c 只要能理解前面的内容 xff0c 实现并非难事 UDP中的服务器端和客户端没有连接 UDP 不像 TCP xff0c 无需在连接状态下交换数据 xff0
  • 下载高清电影的必须收藏的网站

    下载高清电影的必须收藏的网站 Posted 2012 12 06 分类 生活范儿 电影 生活范儿 电影 CHD 虽然蓝光推出 xff0c 但是高清已经势不可挡 xff0c 动辄几G甚至几十G一部的电影冲击着我们的视觉 xff0c 也考验着我
  • 电赛总结|电赛注意事项

    电赛总结 赛前 1 准备模块非常重要 如果没有提前准备模块 xff0c 在赛中也是在想尽办法买模块 xff0c 只是花更多的钱和运费等 xff0c 也不会去自己搭 所以赛前一定要准备模块 常见模块 降压模块 xff0c 升压稳压模块 xff
  • Putty使用教程

    Putty作为免费且开源的老牌 SSH 客户端 xff0c PuTTY 经常用于 Windows 下连接管理远程服务器 为方便刚接触 VPS 的新手参考使用 xff0c 本文配合截图介绍 PuTTY 的基础用法及一些设置技巧 xff0c 希
  • #Python实现话题的发布与订阅

    Python实现话题的发布与订阅 首先我们的先了解ROS文件系统的基本框架 xff0c 如下图所示 xff1a 由上图可知 xff0c py文件放在工作包里面的scripts文件夹内 xff0c 所以 xff0c 整活 xff01 1 在工
  • #创建自定义topic

    创建自定义topic 前面我们学了用C 43 43 和Python创建发布者与订阅者 xff0c 这次我们创建自定义的话题 xff0c 其实同C 43 43 实现topic差不多 xff0c 都是编写 cpp文件 步骤有点多且繁琐 xff0
  • #使用TF实现海龟机器人跟随

    使用TF实现海龟机器人跟随 昨天粗略地讲解了一会儿TF变换 xff0c 用的是ROS系统中自带的功能包实现小海龟跟随的功能 xff08 具体见 初识TF变换 xff09 今天我们将用自己编写节点的方式实现小海龟跟随的功能 xff0c 并且
  • #创建虚拟机器人URDF模型

    创建虚拟机器人URDF模型 题外话 xff1a 作业发布已有一两天了 xff0c 之所以今天才编辑这篇博客 xff0c 是因为我也遇到问题了 xff0c 现在以及解决了 xff08 小细节 xff1a 创建功能包之前先编译工作空间确保里面已
  • # gazebo 仿真

    gazebo 仿真 1 给 base link 添加惯性 xff0c 碰撞以及 gazebo 属性 在路径xqrobot description urdf xacro 件夹下新建 件夹 gazebo xff0c 并在 gazebo 件下创建
  • #Gmapping

    Gmapping 开始之前先安装两个功能包 xff0c 命令如下 xff1a sudo apt span class token operator span get install ros span class token operator
  • #navigation

    navigation 1 安装相关依赖 sudo apt span class token operator span get install ros span class token operator span kinetic span