导航基本流程
- 全局地图(前进时一边摸索一边绘制形成的地图)
- 自身定位(通过传感器感知到的环境信息,获取特征与地图匹配大致估计机器人的位姿信息)
- 路径规划(根据目标位置计算全局运动路线,并且在运动过程中,根据出现的障碍物调整运动路线,直至到达目的地。包括全局路径规划,本地路径规划)
- 运动规划(通过话题cmd_vel发布geometry_msgs/Twist类型的消息,传递运动命令)
- 环境感知(通过摄像头、激光雷达等等感知外界环境的深度信息,编码器可以感知电机的转速信息,进而可以获取到速度信息并生成里程计信息)
坐标系
里程计定位:实时收集机器人的速度信息计算并发布机器人坐标系与父级参考系的相对关系。(前进速度与时间进行估算)
传感器定位:利用传感器收集信息进行匹配,测距更为精准,但是存在跳变。
坐标系变换
机器人坐标的根坐标系一般为base_link
里程计坐标的父级坐标系一般为odom
传感器定位的父级坐标系一般为map
一般转换关系为map -> odom -> base_link -> 其他
导航实现
SLAM建图
- 先启动gazebo,即启动包含地图及机器人集合的launch文件;前提:下载了box_house.world文件,以及编写了机器人相关的xacro文件
<launch> <!-- 载入urdf --> <param name="robot_description" command="$(find xacro)/xacro $(find gazebo01)/urdf/whole_car.xacro"/> <!-- 启动Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find gazebo01)/worlds/box_house.world"/> </include> <!-- 添加机器人 --> <node pkg="gazebo_ros" type="spawn_model" name="spawn_model" args="-urdf -model car -param robot_description" /> </launch>
其中相关的xacro文件分别为:整合的whole_car.xacro
<robot name="car" xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 包含惯性矩阵文件 --> <xacro:include filename="head.xacro"/> <xacro:include filename="car.xacro"/> <xacro:include filename="camera.xacro"/> <xacro:include filename="laser.xacro"/> <xacro:include filename="gazebo/move.xacro"/> <xacro:include filename="gazebo/laser.xacro"/> <xacro:include filename="gazebo/camera.xacro"/> <xacro:include filename="gazebo/kinect.xacro"/> </robot>
head.xacro(关于惯性矩阵的计算方法)
<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro"> <!-- Macro for inertia matrix --> <xacro:macro name="sphere_inertial_matrix" params="m r"> <inertial> <mass value="${m}" /> <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0" iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /> </inertial> </xacro:macro> <xacro:macro name="cylinder_inertial_matrix" params="m r h"> <inertial> <mass value="${m}" /> <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0" iyy="${m*(3*r*r+h*h)/12}" iyz = "0" izz="${m*r*r/2}" /> </inertial> </xacro:macro> <xacro:macro name="Box_inertial_matrix" params="m l w h"> <inertial> <mass value="${m}" /> <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0" iyy="${m*(w*w + l*l)/12}" iyz= "0" izz="${m*(w*w + h*h)/12}" /> </inertial> </xacro:macro> </robot>
car.xacro(包含机器人地盘和车轮)
<robot name="car" xmlns:xacro="http://wiki.ros.org/xacro"> <xacro:property name="footlink_radius" value="0.001" /> <xacro:property name="baselink_radius" value="0.1" /> <xacro:property name="baselink_length" value="0.08" /> <xacro:property name="baselink_mass" value="2" /> <xacro:property name="lidi_length" value="0.015" /> <xacro:property name="baselink_z" value="${baselink_length/2 + lidi_length}" /> <!-- 添加base_footlink --> <link name="base_footlink"> <visual> <!-- 形状 --> <geometry> <!-- 立方体 --> <sphere radius="${footlink_radius}"/> </geometry> </visual> </link> <!-- 底盘link --> <link name="base_link"> <visual> <!-- 形状 --> <geometry> <!-- 立方体 --> <cylinder radius="${baselink_radius}" length="${baselink_length}"/> </geometry> <!-- 偏移与倾斜弧度 --> <origin xyz="0 0 0" rpy="0 0 0" /> <!-- 颜色 --> <material name="car_color"> <color rgba="0.2 0.5 0.7 0.5" />