• 学习时长

    8周/建议每周6个小时

  • 答疑服务

    专属微信答疑群/讲师助教均参与

  • 作业批改

    每章节设计作业/及时批改评优

  • 任务1: 激光SLAM第三期助教分组结果.xlsx
  • 第1章: 激光SLAM简介
  • 第1节:  激光SLAM的定义和核心框架
  • 任务2-1: 【课件】第1章: 激光SLAM简介.pdf
  • 任务2-2: 【视频】激光SLAM的定义和核心框架 34:04
  • 第2节: 激光SLAM和基本数学基础
  • 任务3: 【视频】激光SLAM和基本数学基础
  • 第3节: 实践作业
  • 任务4: 【作业】第1章:激光SLAM简介
  • 第2章: 传感器数据处理I:里程计运动模型及标定
  • 第1节: 里程计运动学模型
  • 任务5-1: 【课件】第2章: 传感器数据处理I:里程计运动模型及标定.pdf
  • 任务5-2: 【视频】轮式里程计模型 31:24
  • 第2节: 里程计标定原理
  • 任务6: 【视频】轮式里程计标定 19:50
  • 第3节: 实践:里程计标定
  • 任务7-1: 【视频】轮式里程计标定代码实践 17:33
  • 任务7-2: 【作业】第2章
  • 第5章: 激光SLAM的前端配准方法 II
  • 第1节: 基于高斯牛顿的优化方法
  • 第2节: NDT方法(Normal Distribution Transformation)
  • 第3节: 相关方法 & 分支定界匹配方法
  • 第4节: 实践:实现基于优化方法进行点云配准
  • 第6章: 基于图优化的激光SLAM方法(Grid-based)
  • 第1节: Pose Graph的概念
  • 第2节: 非线性最小二乘原理
  • 第3节: 非线性最小二乘求解SLAM
  • 第4节: 经典开源算法(cartographer)基本流程
  • 第5节: 实践:一个简单的基于优化的SLAM算法
  • 第7章: 基于已知定位的建图
  • 第1节: 地图分类
  • 第2节: 基于占用概率的栅格地图构建
  • 第3节: 基于TSDF的栅格地图构建
  • 第4节: 实践:构建栅格地图

第二次作业

一.本次作业练习目标

巩固课程所学知识,理解基于直接线性法和基于模型的标定方法,并对下一节课激光雷达模型的内容做一些铺垫学习。

二.作业计分原则

满分为12分,10分为优秀,8分为良好,6分为及格。

三.作业提交说明

需提供完整的PDF报告及代码。公式推导题可以手写照相粘进PDF,也可以直接写进PDF

四.作业题目说明

1. 补充直接线性方法的里程计标定模块代码。(6)

2. 补充轮速计+角速度计标定模块代码。(2分)

3. 对于线性方程 Ax = b的求解,Eigen[1]提供了多种求解方法:

具体可参见

http://eigen.tuxfamily.org/dox/group__TopicLinearAlgebraDecompositions.html

https://www.cnblogs.com/wangxiaoyong/p/8977343.html

通过网络等各种渠道学习总结,对于最小二乘问题,都有哪几种求解方法,各优缺点有哪些,分别在什么条件下较常使用?(2分)

4. 阅读论文Precise indoor localization for mobile laserscanner前两章,回答问题。(2分)

(1)根据第二章内容,简述激光雷达测距原理;

(2)简要介绍一下右图的含义。 

第一题代码说明:

1. 本次的作业为用直接线性方法来对机器人的里程计进行校正。

2. 给出的文件中包含有本次作业使用的 bag 数据,路径为odom_ws/bag/odom.bag。

3. 本次的作业中,需要实现三个函数,分别为:

1. Main.cpp,第 340 行中的 cal_delta_distance()函数,该函数的功能为给定两个里程计位姿,计算这两个位姿之间的位姿差。

2. Odom_Calib.cpp,第 23 行 Add_Data()函数,该函数的功能为构建超定方程组

Ax=b,具体参考 PPT。

3. Odom_Calib.cpp,第 44 行 Solve()函数,该函数的功能为对 2 中构建的超定方程组进行求解。

本次程序的运行过程为:

Step1: 实现上述的三个函数,并进行编译。

Step2: 在odom_ws下,进行 source,具体命令为: source devel/setup.bash

Step3: 运行launch文件:roslaunch calib_odom odomCalib.launch。执行本条指令的时候,必须保证没有任何 ros 节点在运行,roscore也要关闭。

Step4: 在 3 正常的情况下,运行 rviz, fix_frame 选择为odom。在 Add 选项卡中增加三条Path 消息。一条订阅的topic 为: odom_path_pub_;一条订阅的 topic 为:scan_path_pub_;最后一条为:calib_path_pub_。分别选择不同的颜色。

Step5: 进入到 odom_ws/bag 目录下,运行指令: rosbag play -–clock odom.bag。

Step6: 如果一切正常,则能看到运行矫正程序的终端会打印数据,并且 rviz 中可以看到两条路径。当打印的数据到达一个的数量之后,则可以开始矫正。

Step7: 矫正的命令为,在 calib_flag 的 topic 下发布一个数据:rostopic pub /calib_flag std_msgs/Empty "{}" 。

Step8: 程序矫正完毕会输出对应的矫正矩阵,并且会在 rviz 中显示出第三条路径,即calib_path。可以观察里程计路径 odom_path 和矫正路径_calib_path 区别来判断此次矫正的效果。

参考结果:绿色为odom、黄色为激光、红色为矫正后的轨迹,可以看到校正后的轨迹跟激光的轨迹接近了很多。

说明:以上结果为数据包开始到179s的2500个数据计算出来的,采集不同量数据得到的结果会有所不同,也并非采集时间越长结果越好,标定结果数据仅供参考,效果直接看轨迹图。

第二题代码说明:

在实际标定中,直接线性方法通用性强,但精度不如基于模型的方法。

在课程中我们得知,差速轮运动模型中,可以通过轮速差得到机器人底盘中心的线速度和角速度。但有时由于地面打滑或其它原因导致角速度计算不准。这里我们用角速度计来替代轮速计计算机器人的角速度w,而线速度v依旧通过轮速计计算。

机器人由于载重不同或轮胎气压大小不同,真实的速度v_real与v相差一个比例v_ratio, v_real = v * v_ratio + noise. 角速度计得到的角速度w与真实角速度w_real相差一个缓慢变化的bias, w_real = w + bias + noise. noise一般为0均值的高斯白噪声,bias在此次标定作业中假设变化不大。

本次作业中你需要通过一小段groundtruth.txt标定出v_ratio和noise的大小,之后生成标定后的航迹推算轨迹,利用DrawTrajectory.py比较标定前后的轨迹不同。

代码编译说明:

cd 你放置作业代码的目录/wheel_imu/

mkdir build

cd build

cmake ..

make

cd ..

./wheel_imu

之后可用命令python DrawTrajectory.py raw_poses.txt python DrawTrajectory.py corrected_poses.txt 查看标定前生成的轨迹和标定后生成的轨迹。

最后标定成功的轨迹大致为:

[1] http://eigen.tuxfamily.org/index.php?title=Main_Page

第二次作业

一.本次作业练习目标

巩固课程所学知识,理解基于直接线性法和基于模型的标定方法,并对下一节课激光雷达模型的内容做一些铺垫学习。

二.作业计分原则

满分为12分,10分为优秀,8分为良好,6分为及格。

三.作业提交说明

需提供完整的PDF报告及代码。公式推导题可以手写照相粘进PDF,也可以直接写进PDF

四.作业题目说明

1. 补充直接线性方法的里程计标定模块代码。(6)

2. 补充轮速计+角速度计标定模块代码。(2分)

3. 对于线性方程 Ax = b的求解,Eigen[1]提供了多种求解方法:

具体可参见

http://eigen.tuxfamily.org/dox/group__TopicLinearAlgebraDecompositions.html

https://www.cnblogs.com/wangxiaoyong/p/8977343.html

通过网络等各种渠道学习总结,对于最小二乘问题,都有哪几种求解方法,各优缺点有哪些,分别在什么条件下较常使用?(2分)

4. 阅读论文Precise indoor localization for mobile laserscanner前两章,回答问题。(2分)

(1)根据第二章内容,简述激光雷达测距原理;

(2)简要介绍一下右图的含义。 

第一题代码说明:

1. 本次的作业为用直接线性方法来对机器人的里程计进行校正。

2. 给出的文件中包含有本次作业使用的 bag 数据,路径为odom_ws/bag/odom.bag。

3. 本次的作业中,需要实现三个函数,分别为:

1. Main.cpp,第 340 行中的 cal_delta_distance()函数,该函数的功能为给定两个里程计位姿,计算这两个位姿之间的位姿差。

2. Odom_Calib.cpp,第 23 行 Add_Data()函数,该函数的功能为构建超定方程组

Ax=b,具体参考 PPT。

3. Odom_Calib.cpp,第 44 行 Solve()函数,该函数的功能为对 2 中构建的超定方程组进行求解。

本次程序的运行过程为:

Step1: 实现上述的三个函数,并进行编译。

Step2: 在odom_ws下,进行 source,具体命令为: source devel/setup.bash

Step3: 运行launch文件:roslaunch calib_odom odomCalib.launch。执行本条指令的时候,必须保证没有任何 ros 节点在运行,roscore也要关闭。

Step4: 在 3 正常的情况下,运行 rviz, fix_frame 选择为odom。在 Add 选项卡中增加三条Path 消息。一条订阅的topic 为: odom_path_pub_;一条订阅的 topic 为:scan_path_pub_;最后一条为:calib_path_pub_。分别选择不同的颜色。

Step5: 进入到 odom_ws/bag 目录下,运行指令: rosbag play -–clock odom.bag。

Step6: 如果一切正常,则能看到运行矫正程序的终端会打印数据,并且 rviz 中可以看到两条路径。当打印的数据到达一个的数量之后,则可以开始矫正。

Step7: 矫正的命令为,在 calib_flag 的 topic 下发布一个数据:rostopic pub /calib_flag std_msgs/Empty "{}" 。

Step8: 程序矫正完毕会输出对应的矫正矩阵,并且会在 rviz 中显示出第三条路径,即calib_path。可以观察里程计路径 odom_path 和矫正路径_calib_path 区别来判断此次矫正的效果。

参考结果:绿色为odom、黄色为激光、红色为矫正后的轨迹,可以看到校正后的轨迹跟激光的轨迹接近了很多。

说明:以上结果为数据包开始到179s的2500个数据计算出来的,采集不同量数据得到的结果会有所不同,也并非采集时间越长结果越好,标定结果数据仅供参考,效果直接看轨迹图。

第二题代码说明:

在实际标定中,直接线性方法通用性强,但精度不如基于模型的方法。

在课程中我们得知,差速轮运动模型中,可以通过轮速差得到机器人底盘中心的线速度和角速度。但有时由于地面打滑或其它原因导致角速度计算不准。这里我们用角速度计来替代轮速计计算机器人的角速度w,而线速度v依旧通过轮速计计算。

机器人由于载重不同或轮胎气压大小不同,真实的速度v_real与v相差一个比例v_ratio, v_real = v * v_ratio + noise. 角速度计得到的角速度w与真实角速度w_real相差一个缓慢变化的bias, w_real = w + bias + noise. noise一般为0均值的高斯白噪声,bias在此次标定作业中假设变化不大。

本次作业中你需要通过一小段groundtruth.txt标定出v_ratio和noise的大小,之后生成标定后的航迹推算轨迹,利用DrawTrajectory.py比较标定前后的轨迹不同。

代码编译说明:

cd 你放置作业代码的目录/wheel_imu/

mkdir build

cd build

cmake ..

make

cd ..

./wheel_imu

之后可用命令python DrawTrajectory.py raw_poses.txt python DrawTrajectory.py corrected_poses.txt 查看标定前生成的轨迹和标定后生成的轨迹。

最后标定成功的轨迹大致为:

[1] http://eigen.tuxfamily.org/index.php?title=Main_Page