有需要的小伙伴可以在评论区留言获取完整的工作空间代码包
环境:ubuntu18.04, ROS melodic
首先在工作空间目录下创建一个功能包,用来放置机器人模型,以及对机器人模型进行可视化操作
catkin_creating_pkg mrobot_description urdf xacro
该功能包需要 urdf 和 xacro 这两个依赖
进入 mrobot_description 文件夹并创建一个 urdf 文件夹,用来放置机器人的模型文件
下面进入对机器人的urdf文件的编写。URDF即 United Robot Description Format,统一机器人描述格式,这是ROS中重要的机器人模型描述格式。完整代码如下所示,对于重要的部分,我进行了注释。
完成了底盘urdf文件的编写之后,我们可以使用两个小工具对编写的正确性进行检验
通过命令check_urdf mrobot_chassis.urdf
可以check语法错误,编写正确的运行结果如下所示:
还可以通过命令urdf_to_graphiz mrobot_chassis.urdf
查看urdf文件的整体结构:
urdf文件编写没有问题的话,下面我们将机器人模型在rviz中进行可视化。
还在刚刚的 mrobot_desription文件夹下,创建一个 launch文件夹,编写一个 display_mrobot_chassis_urdf.launch文件
在工作空间下通过catkin_make
命令进行编译,在工作空间路径下执行以下命令
source ./devel/setup.bash
roslaunch mrobot_description display_mrobot_chassis_urdf.launch
可以看到机器人的模型成功展示出来了。
现在仅仅是将机器人的外形展示了出来,对于仿真是不足够的,还需要机器人的质量、惯性张量、碰撞体积等参数,下面以base_link 为例加入
需要强调的是惯性张量可以通过solidworks等三维建模软件进行计算得到,碰撞体积是对于外形的简化,以减少计算量,这里机器人本身的模型已经比较简单了,碰撞模型和本身模型进行了重叠。
xacro是另一种精简化、可复用、模块化的描述形式,可以建立宏定义,也支持一些可编程接口,比如常量、变量、数学公式、条件语句等。
下面是机器人底盘的xacro文件。
xacro 文件与URDF文件很相似,类似于
如需改变机器人某个link的尺寸,直接修改前面的常量即可,简洁了许多,这里xacro文件中直接定义了一个宏定义
下面来创建另一个xacro文件来引用 mrobot_body.urdf.xacro.
可以看到,这套代码相当简洁。
下面再编写一个launch文件对xacro文件的机器人模型在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编译
接下来进行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中运动。
首先在gazebo中建立一个仿真环境,通过命令
roscore
rosrun gazebo_ros gazebo
打开gazebo软件,如果出现如下所示的错误,一般是由于虚拟机的显卡加速设置导致的。
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
下面通过launch文件启动gazebo并生成实验环境。
在 mrobot_gazebo/launch下创建view_mrobot_gazebo.launch
这其中的大部分参数都很好理解,这里主要说两个参数,paused:在暂停状态打开gazebo;headless:gazebo的日志记录。
通过命令roslaunch mrobot_gazebo view_mrobot_gazebo.launch
,运行结果如下所示:
实验环境建立完毕,在gazebo中进行仿真,还进行对机器人模型的xacro文件的完善,将之前的完成的两个xacro文件粘贴到如下图所示的位置。
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都多了
(2)对于转动的joint添加了
(3)文件末尾对于整个机器人多了
修改view_mrobot_gazebo.launch文件,在gazeb中生成环境的同时生成机器人模型。
这个launch文件和之前的很类似,多了最后一个node,这个node就是在gazebo中生成机器人模型文件。
roslaunch mrobot_gazebo view_mrobot_gazebo.launch
运行结果如下所示。
再次启动键盘控制节点 rosrun teleop_twist_keyboard teleop_twist_keyboard.py
成功通过键盘控制机器人在gazebo仿真环境中移动。
进行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
其中比较重要的部分就是文件末尾的
下面再编写一个带有雷达的机器人模型的xacro文件。
该文件的内容主要就是包括了原有的机器人模型和雷达的模型,定义了雷达的相关参数以及确定了雷达相对于机器人的位置,即确定了rplidar_joint.然后我们再编写一个launch文件,在gazebo中启动带有雷达的机器人。
这个launch文件和之前在gazebo中启动机器人的launch非常相似,唯一不同的点就是包含的机器人模型不同。启动后的运行效果如下所示:
通过命令rostopic list
,可以看到/scan话题
再通过命令rosrun rviz rviz
启动rviz,添加LaserScan,话题选择/scan
可以看到激光雷达的点云信息都显示在了rviz界面中
下面通过开源的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中会同时建立相应地图,如下图所示。
在仿真环境中完整的跑一遍,建立完整的地图。
先安装一个地图管理的功能包sudo apt-get install ros-melodic-map-server
通过命令rosrun map_server map_saver
保存当前建立好的地图
完成建图之后,下面进行机器人的导航。首先安装相关依赖
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
运行结果如下所示。
在rviz界面中点击 2D Nav Goal,即可看到机器人正在自动导航到相应的位置。
搭建机器人进行slam完成。