搭建机器人模型进行slam过程记录

有需要的小伙伴可以在评论区留言获取完整的工作空间代码包

环境:ubuntu18.04, ROS melodic

机器人底盘URDF文件编写

首先在工作空间目录下创建一个功能包,用来放置机器人模型,以及对机器人模型进行可视化操作

catkin_creating_pkg mrobot_description urdf xacro

该功能包需要 urdf 和 xacro 这两个依赖

搭建机器人模型进行slam过程记录_第1张图片

进入 mrobot_description 文件夹并创建一个 urdf 文件夹,用来放置机器人的模型文件

下面进入对机器人的urdf文件的编写。URDF即 United Robot Description Format,统一机器人描述格式,这是ROS中重要的机器人模型描述格式。完整代码如下所示,对于重要的部分,我进行了注释。




    
        
            
            
                
            
            
                
            
        
    

    
                
        
        
    

    
        
            
            
                
            
            
                
            
        
    

    
        
        
        
        
    

    
        
            
            
                
            
            
                
            
        
    

    
                
        
        
    

    
        
            
            
                
            
            
                
            
        
    

    
        
        
        
        
    

    
        
            
            
                
            
            
                
            
        
    

    
        
        
        
    

    
        
            
            
                
            
            
                
            
        
    

完成了底盘urdf文件的编写之后,我们可以使用两个小工具对编写的正确性进行检验

通过命令check_urdf mrobot_chassis.urdf可以check语法错误,编写正确的运行结果如下所示:

搭建机器人模型进行slam过程记录_第2张图片

 

还可以通过命令urdf_to_graphiz mrobot_chassis.urdf查看urdf文件的整体结构:

 

搭建机器人模型进行slam过程记录_第3张图片

urdf文件编写没有问题的话,下面我们将机器人模型在rviz中进行可视化。

还在刚刚的 mrobot_desription文件夹下,创建一个 launch文件夹,编写一个 display_mrobot_chassis_urdf.launch文件


    
    
    
    
    
    
    

在工作空间下通过catkin_make 命令进行编译,在工作空间路径下执行以下命令

source ./devel/setup.bash

roslaunch mrobot_description display_mrobot_chassis_urdf.launch

搭建机器人模型进行slam过程记录_第4张图片

可以看到机器人的模型成功展示出来了。

现在仅仅是将机器人的外形展示了出来,对于仿真是不足够的,还需要机器人的质量、惯性张量、碰撞体积等参数,下面以base_link 为例加入标签

    
        
            
            
                
            
            
                
            
        

        
            
            
            
        
        
            
            
                
            
        
    

需要强调的是惯性张量可以通过solidworks等三维建模软件进行计算得到,碰撞体积是对于外形的简化,以减少计算量,这里机器人本身的模型已经比较简单了,碰撞模型和本身模型进行了重叠。

机器人底盘XACRO文件编写

xacro是另一种精简化、可复用、模块化的描述形式,可以建立宏定义,也支持一些可编程接口,比如常量、变量、数学公式、条件语句等。

下面是机器人底盘的xacro文件。



    
    
    
    
    
    
    
    
    
    


    
        
            
        
        
            
        
        
            
        

        
            
                
                
                    
                
            
        

        
            
                
                
                
                        
            
                
                
                    
                
                
            
            
                
                
                    
                
            
        
        
        
            
            
            
        

        
            
                
                
                
            
            
                
                
                    
                
                
            
            
                
                
                    
                
            
        

        
            
            
            
        

        
            
                
                
                
                
            
                
                
                    
                
                
            
            
                
                
                    
                
                    
        

        
            
            
            
            
        

        
            
                
                
                
            
            
                
                
                    
                
                
            
            
                
                
                    
                
            
        
        
        
            
            
            
        

        
            
                
                
                
                
            
                
                
                    
                
                
            
            
                
                
                    
                
                    
        

        
            
            
            
            
        

        
            
                
                
                
            

            
                
                
                    
                
                
            

            
                
                
                    
                
            
            
        
        
            
            
            
        
    

xacro 文件与URDF文件很相似,类似于,是xacro中定义的常量,需要提到的是,在xacro文件中根link并不是base_link而是base_footprint,引入base_footprint主要是解决机器人模型会有一部分处在rviz中的grid之下,引入base_footprint可以方便的更改机器人本体的位置。

如需改变机器人某个link的尺寸,直接修改前面的常量即可,简洁了许多,这里xacro文件中直接定义了一个宏定义,我们可以再编写一个xacro文件引用该文件,并直接使用该宏定义,增强了代码的复用性,而且后期完成slam任务时,我们还需要摄像头或者雷达等传感器,这样只需要更改上层的xacro文件即可,结构清晰。

下面来创建另一个xacro文件来引用 mrobot_body.urdf.xacro.



    
    

可以看到,这套代码相当简洁。

下面再编写一个launch文件对xacro文件的机器人模型在rviz中进行可视化。


    
    

    
    
    
    
    

下面是运行结果。

搭建机器人模型进行slam过程记录_第5张图片

 

通过ArbotiX和rviz控制机器人运动

ArbotiX是一款控制电机、舵机的控制板,并提供相应的ROS功能包,这个功能包不仅能驱动真实的ArbotiX控制板,它还提供相应的ROS功能包,这个功能包提供了一个差速控制器,通过接收速度控制指令更新机器人的joint状态,即通过监听/cmd_vel话题,将话题信息转化为joint的转动。

首先进行ArbotiX的安装,通过命令git clone GitHub - vanadiumlabs/arbotix_ros: Arbotix ROS drivers repository进行clone,由于网络限制的问题,可能会失败,可以使用科学上网的方式,down在windows中再copy到虚拟机中,目前(2022/12)github托管的功能包是适配ROS-Noetic版本,需要进行更改,使之适配于melodic版本。

melodic中默认python为2.7版本的,找到图中的py文件,将第一行的 #!/usr/bin/env python3 改为

#!/usr/bin/env python,然后在工作空间下进行catkin_make编译

搭建机器人模型进行slam过程记录_第6张图片

 

接下来进行ArbotiX控制器的配置。

首先在mrobot_description文件下创建一个config文件夹,创建一个fake_mrobot_arbotix.yaml文件

controllers: {
  base_controller: {type: diff_controller, base_frame_id: base_footprint, base_width: 0.26, ticks_meter: 4100, Kp: 12, Kd: 12, Ki: 0, Ko: 50, accel_limit: 1.0 }  
}

注意yaml文件的语法,每个冒号后面都要跟一个空格。

接下来创建一个launch文件


    

    
    

    
    
    
    
        
    
    
    
        
        
     

这个launch文件主要多了一个控制器节点。再完成这两部分之后,我们还需要对之前的xacro文件修改,因为控制器的作用是监听/cmd_vel话题,将信息更新到joint上,因此模型的joint和控制器joint名称应统一,把xacro中的 left_wheel_joint 和 right_wheel_joint 改为 base_l_wheel_link 和 base_r_wheel_link.

最后使用键盘控制节点,控制机器人在rviz中运动

通过命令sudo apt-get install ros-melodic-teleop-twist-board安装键盘控制节点

roslaunch mrobot_description arbotix_mrobot.launch

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

运行结果如下,通过键盘即可控制机器人在rviz中运动。

搭建机器人模型进行slam过程记录_第7张图片

搭建机器人模型进行slam过程记录_第8张图片

Gazebo运动仿真

首先在gazebo中建立一个仿真环境,通过命令

roscore

rosrun gazebo_ros gazebo

打开gazebo软件,如果出现如下所示的错误,一般是由于虚拟机的显卡加速设置导致的。

搭建机器人模型进行slam过程记录_第9张图片

gedit ~/.bashrc

在末尾加入 export SVGA_VGPU10=0 从而禁用显卡加速。

在工作空间目录下创建一个新的包 用于gazebo仿真

catkin_creat_pkg mrobot_gazebo roscpp gazebo_ros gazebo_plugins gazebo_ros_control

该功能包依赖上面几个包,请确认这些功能包安装完整。

在 mrobot_gazebo下创建worlds文件夹,再通过前述命令打开gazebo,创建一个简单的仿真环境。

如果在gazebo运行过程中,报错

将~/.ignition/fuel/config.yaml中的 https://api.ignitionfuel.org 改为 https://api.ignitionrobotics.org即可

最终创建的实验环境如下图所示,保存至 mrobot_gazebo/worlds/my_world.world

搭建机器人模型进行slam过程记录_第10张图片

下面通过launch文件启动gazebo并生成实验环境。

在 mrobot_gazebo/launch下创建view_mrobot_gazebo.launch


    
    
    
    
    
    

    
        
        
        
        
        
        
    

这其中的大部分参数都很好理解,这里主要说两个参数,paused:在暂停状态打开gazebo;headless:gazebo的日志记录。

通过命令roslaunch mrobot_gazebo view_mrobot_gazebo.launch,运行结果如下所示:

搭建机器人模型进行slam过程记录_第11张图片

实验环境建立完毕,在gazebo中进行仿真,还进行对机器人模型的xacro文件的完善,将之前的完成的两个xacro文件粘贴到如下图所示的位置。

搭建机器人模型进行slam过程记录_第12张图片

mrobot.urdf.xacro无需修改,下面对mrobot_body.urdf.xacro文件进行修改,完整的文件如下所示:




    
    
        
    

    
        
    

    
        
    
    
    
    

    
     
    
    

    
    
    
     
     
    

    
     
    
    
    
    
     
    
    


    
    
        
            
            
        
    

    
        
            
             
        
    

    
    
        
        
            
                 
                
                    
                
                
            
            
                
                
                    
                
            
            
        

        
            Gazebo/White
        

        
            
                 
                
                    
                
                
            
            
                
                
                    
                
            
            
        
        
            Gazebo/Black
        

        
            
            
             
            
        

        
        
            transmission_interface/SimpleTransmission
            
            
                VelocityJointInterface
                1
            
        
        
        
            
            
             
        
    

    
    
        
        
            
                 
                
                    
                
                
              
            
                
                    
                
                 
                  
            
        

        
            Gazebo/Black
        

        
            
            
            
        
    



    
    
    
        
            
                
                
                    
                
            
        

        
            
            
            
        

        
        
        
            
            
                
                
                    
                
                
            

            
                
                
                    
                
               
        
        
            Gazebo/Orange
        

        
        
        

        
        



        
        
            
                Debug
                true
                /
                1
                true
                true
                100.0
                true
                base_to_wheel_left_joint
                base_to_wheel_right_joint
                ${base_link_radius*2}
                ${2*wheel_radius}
                1
                30
                1.8
                cmd_vel
                odom 
                odom 
		true
		world
                base_footprint
            
         

    

这个文件与之前的xacro主要不同之处:

(1)每个link都多了标签,使之能够在gazebo正确显示自身的颜色。

(2)对于转动的joint添加了标签,使之弄够在gazebo中正确的运动。

(3)文件末尾对于整个机器人多了标签,添加了差分控制器以及一些所必须的参数。

修改view_mrobot_gazebo.launch文件,在gazeb中生成环境的同时生成机器人模型。


    
    
    
    
    
    

    
        
        
        
        
        
        
    
    
    
    
    
        
    
    

这个launch文件和之前的很类似,多了最后一个node,这个node就是在gazebo中生成机器人模型文件。

roslaunch mrobot_gazebo view_mrobot_gazebo.launch

运行结果如下所示。

搭建机器人模型进行slam过程记录_第13张图片

再次启动键盘控制节点 rosrun teleop_twist_keyboard teleop_twist_keyboard.py

成功通过键盘控制机器人在gazebo仿真环境中移动。

搭建机器人模型进行slam过程记录_第14张图片

Gazebo中的slam与导航仿真

进行slam,首先应该对机器人模型添加相应的传感器,我们采用激光雷达进行slam,对机器人添加激光雷达的模型。编写一个激光雷达的xacro文件。




    
        
        
            
                
                
                
            

            
                
                
                    
                
                
            

            
                
                
                    
                
            
        
        
            Gazebo/Black
        

        
            
                0 0 0 0 0 0
                false
                5.5
                
                    
                      
                        360
                        1
                        -3
                        3
                      
                    
                    
                      0.10
                      6.0
                      0.01
                    
                    
                      gaussian
                      0.0
                      0.01
                    
                
                
                    /scan
                    laser_link
                
            
        

    

其中比较重要的部分就是文件末尾的标签,激光雷达的传感器类型是ray,rplidar的相关参数在产品手册中可以找到。为了获取尽量贴近真实的仿真效果,需要根据实际参数配置中的雷达参数:360°检测范围、单圈360个采样点,5.5Hz采样频率,最远6m检测范围等。最后使用标签添加激光雷达插件libgazebo_ros_laser.so,所发布的激光雷达话题是/scan

下面再编写一个带有雷达的机器人模型的xacro文件。



    
    

    
    
    

    
    
        
        
        
    
    

该文件的内容主要就是包括了原有的机器人模型和雷达的模型,定义了雷达的相关参数以及确定了雷达相对于机器人的位置,即确定了rplidar_joint.然后我们再编写一个launch文件,在gazebo中启动带有雷达的机器人。


    
    
    
    
    
    

    
        
        
        
        
        
        
    
    
    
    
    
        
    
    

这个launch文件和之前在gazebo中启动机器人的launch非常相似,唯一不同的点就是包含的机器人模型不同。启动后的运行效果如下所示:

搭建机器人模型进行slam过程记录_第15张图片

搭建机器人模型进行slam过程记录_第16张图片

通过命令rostopic list,可以看到/scan话题

搭建机器人模型进行slam过程记录_第17张图片

搭建机器人模型进行slam过程记录_第18张图片

再通过命令rosrun rviz rviz启动rviz,添加LaserScan,话题选择/scan

可以看到激光雷达的点云信息都显示在了rviz界面中

搭建机器人模型进行slam过程记录_第19张图片

下面通过开源的gmapping功能包进行slam。关于gmapping算法的原理,可以阅读下列链接中的相关论文。OpenSLAM.org

安装gmapping:sudo apt-get install ros-melodic-gmapping

在工作空间下创建一个新的功能包。

catkin_create_pkg mrobot_navigation geometry_msgs move_base_msgs roscpp tf visualization_msgs

在mrobot_navigation/launch下创建一个gmapping.launch文件,主要用于节点参数的配置。


    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

这里比较重要的两个参数:一个是odom_frame参数要和机器人本身的里程计坐标系一致;另一个就是激光雷达的话题名。

下面再创建一个launch文件,同时启动上面的gmapping节点和rviz界面。


    
    

下面启动gmapping_demo.launch 和 view_mrobot_with_laser_gazebo.launch,再启动键盘控制节点,即可控制小车在gazebo仿真环境中移动,并且rviz中会同时建立相应地图,如下图所示。

搭建机器人模型进行slam过程记录_第20张图片

在仿真环境中完整的跑一遍,建立完整的地图。

先安装一个地图管理的功能包sudo apt-get install ros-melodic-map-server

通过命令rosrun map_server map_saver保存当前建立好的地图

搭建机器人模型进行slam过程记录_第21张图片

 

完成建图之后,下面进行机器人的导航。首先安装相关依赖

sudo apt-get install ros-melodic-navigation

我们使用move_base进行导航,以及利用ACML进行定位,使用move_base进行导航的时候需要对代价地图和本地规划器进行配置,首先是代价地图配置中的通用配置文件。

obstacle_range: 2.5
raytrace_range: 3.0
#footprint: [[0.15, 0.15], [0.15, -0.15], [-0.15, -0.15], [-0.15, 0.15]]
#footprint_inflation: 0.01
robot_radius: 0.15
inflation_radius: 0.02
max_obstacle_height: 0.6
min_obstacle_height: 0.0
observation_sources: scan
scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0}

obstacle_range即检测障碍物的最大范围,raytrace_range即检测自由空间的最大范围,footprint机器人在二维地图上的占用面积,inflation_radius即障碍物的膨胀参数,observation_sources参数列出了代价地图需要关注的所有传感器信息,每个传感器信息都会在后面列出详细内容。

然后是代价地图的全局规划配置文件。

global_costmap:
   global_frame: map
   robot_base_frame: base_footprint
   update_frequency: 1.0
   publish_frequency: 1.0
   static_map: true
   rolling_window: false
   resolution: 0.01
   transform_tolerance: 1.0
   map_type: costmap

global_frame用来表示全局代价地图需要在哪个参考系下运行,robot_base_frame用来表示代价地图可以参考的机器人本体的坐标系。

然后是代价地图的本地规划配置文件。

local_costmap:
   global_frame: map
   robot_base_frame: base_footprint
   update_frequency: 3.0
   publish_frequency: 1.0
   static_map: true
   rolling_window: false
   width: 6.0
   height: 6.0
   resolution: 0.01
   transform_tolerance: 1.0

最后是本地规划器配置

controller_frequency: 3.0
recovery_behavior_enabled: false
clearing_rotation_allowed: false

TrajectoryPlannerROS:
   max_vel_x: 0.5
   min_vel_x: 0.1
   max_vel_y: 0.0  # zero for a differential drive robot
   min_vel_y: 0.0
   max_vel_theta: 1.0
   min_vel_theta: -1.0
   min_in_place_vel_theta: 0.4
   escape_vel: -0.1
   acc_lim_x: 1.5
   acc_lim_y: 0.0  # zero for a differential drive robot
   acc_lim_theta: 1.2

   holonomic_robot: false
   yaw_goal_tolerance: 0.1 # about 6 degrees
   xy_goal_tolerance: 0.05  # 5 cm
   latch_xy_goal_tolerance: false
   pdist_scale: 0.4
   gdist_scale: 0.8
   meter_scoring: true

   heading_lookahead: 0.325
   heading_scoring: false
   heading_scoring_timestep: 0.8
   occdist_scale: 0.05
   oscillation_reset_dist: 0.05
   publish_cost_grid_pc: false
   prune_plan: true

   sim_time: 1.0
   sim_granularity: 0.05
   angular_sim_granularity: 0.1
   vx_samples: 8
   vy_samples: 0  # zero for a differential drive robot
   vtheta_samples: 20
   dwa: true
   simple_attractor: false

该配置文件声明机器人本地规划采用Trajectory Rollout算法,并且设置算法中需要用到机器人速度、加速度等阈值信息。

创建launch文件启动move_base节点。mrobot_navigation/launch/move_base.launch


    
        
         
        
        
        
                   

然后再创建一个运行所有导航功能节点的顶层launch文件mrobot_navigation/launch/navigation.launch



    

    

    

    

    

fake_localization兼容虚拟定位,tf用来发布/odom和/map之间的静态坐标变换。

通过命令roslaunch mrobot_gazebo view_mrobot_with_laser_gazebo.launch

roslaunch mrobot_navigation navigation_demo.launch

运行结果如下所示。

搭建机器人模型进行slam过程记录_第22张图片

 

在rviz界面中点击 2D Nav Goal,即可看到机器人正在自动导航到相应的位置。

搭建机器人模型进行slam过程记录_第23张图片

搭建机器人进行slam完成。

你可能感兴趣的:(机器人,ubuntu)