JetRacer ROS AI Kit 教程七、机器人里程计校准

来自Waveshare Wiki
跳转至: 导航搜索

JetRacer ROS AI Kit 初级教程目录

前言

  • 机器人可以输出里程计信息,判断机器人行走的路程有多远,以及机器人转动了多少角度。但是程序默认输出的里程计和实际信息有可能会有误差,我们可以通过调节参数校准里程计信息,得到更高精度。
  • 初次使用精度要求不高可以只校准直线行驶,其他步骤可跳过,不校准也影响不大,可以正常实现后面功能。

步骤1、直线行驶校准

  • SSH连接机器人打开终端,输入以下命令启动机器人底盘节点
  • 【注意:机器人底盘节点不能重复启动,否则出错。如果之前的底盘节点没有关闭则不需要再次启动】
roslaunch  jetracer jetracer.launch     #启动机器人底盘节点  
JetRacer ROS 20.png
  • 在Ubuntu虚拟机端按“Ctrl+Alt+t”打开新的终端,并输入以下命令开启键盘控制话题节点
 roslaunch jetracer keyboard.launch     
Jetbot image19.png
  • 按下键盘“I”键控制机器人向前运动,观察机器人是否直线运动,如果机器人偏向一边可以通过下面方式校准。
  • 再次打开新的终端,运行如下命令启动rqt_reconfig工具
rosrun rqt_reconfigure rqt_reconfigure 
JetRacer ROS 3.png
  • 调节servo_bias的值,修改舵机初始偏移,直到机器人可以直线运动。
  • 动态参数调节只会影响此次的运行效果,参数不会保存到参数文件中,不影响下次启动。需要将参数保存到jetracer_ros/cfg/jetracer.cfg文件中。
vi ~/catkin_ws/src/jetracer_ros/cfg/jetracer.cfg

修改servo_bias 一行,将第五个参数修改为刚才设置的值并保存。

JetRacer ROS 26.png

步骤2、线速度校准

  • 线性校准启动程序默认已经启动机器人底盘节点,请先关闭前面启动的机器人底盘节点,保持“机器人主节点”运行即可,否则运行命令后提示出错。
  • 在jetson nano 中重新打开一个终端,运行如下命令,启动线速度校准程序
roslaunch jetracer calibrate_linear.launch
JetRacer ROS 29.png
  • 开启后不要关闭,否则在虚拟机命令框中看不到校准选项
  • 在虚拟机端运行如下命令,启动动态参数调节图形界面 ,若上述线速度校准程序正常运行,则可以看到 calibrate_linear 选项
rosrun rqt_reconfigure rqt_reconfigure
JetRacer ROS 32.png
  • 其中:
    • test_distance 为测试距离,默认为1m.
    • speed 为机器人线速度
    • tolerance 为到达目标的误差。误差太小,会在目标位置抖动,反之,到达目标点的误差就很大
    • odom_linear_scale_correction 为里程计缩放比例,最后修正的值即为线速度校准参数。
    • start_test 开始机器人校准
  • 将机器人放在地上,并标记机器人位置,勾选start_test,机器人开始运动,等待机器人停止后,测量机器人运动距离。记录运动距离除以目标距离的比值,将odom_linear_scale_correction乘以这个比作为新的参数。重复测试,直到实际运动距离为1m。
  • 例如设置运动1m,实际运行1.2m,则比值为1.2,odom_linear_scale_correction更新为1x1.2即1.2再次启动测试,若效果满意则线性校准参数为1.2,若实际运动为1.1m,则odom_linear_scale_correction更新为1.2*1.1即1.32。如此反复直到效果满意。
Jetbot image28.png
  • 在jetson nano中输入以下命令,打开catkin_ws/src/jetracer_ros/launch/jetracer.launch文件,将linear_correction的值修改为刚才校准得到odom_linear_scale_correction校准参数。再次启动校准程序即可实际行走1m距离。
vi ~/catkin_ws/src/jetracer_ros/launch/jetracer.launch     #修改校准参数
JetRacer ROS 30.png

步骤3、舵机转向标定

  • 由于舵机转动角度不等于轮胎转向角度,因此我们需要采集不同舵机角度下轮胎的转向角度,然后通过多项式拟合两者关系。
  • 舵机校准过程较为复杂,要求不高的情况下可以跳过此步骤不在重新标定。
  • 程序中采用如下三项式拟合,其中x表示轮胎转向角,y表示舵机转动角度,servo_bias为直线校准参数,正常情况下,此项应该为0。a,b,c,d为拟合参数。
y = a*x^3 + b*x^2 + c*x + d + servo_bias。
  • 标定前,需要先将电机线拔掉,让电机处于自由状态。同时,需要修改参数让舵机直接控制舵机转向,即y = x。故a,b,d,servo_bias均设置为0,c设置为1。
  • 打开jetracer_ros/cfg/jetracer.cfg文件,将servo_bias设置为0。修改servo_bias 一行,将第五个参数修改为0并保存。
vi ~/catkin_ws/src/jetracer_ros/cfg/jetracer.cfg
JetRacer ROS 26.png
  • 打开jetracer_ros/launch/jetracer.launc文件,将coefficient_a,coefficient_b,coefficient_d设置为0,coefficient_a设置为1。
vi ~/catkin_ws/src/jetracer_ros/launch/jetracer.launch
JetRacer ROS 33.png
  • SSH连接机器人打开终端,输入以下命令启动机器人底盘节点
  • 【注意:机器人底盘节点不能重复启动,否则出错。如果之前的底盘节点没有关闭则不需要再次启动】
roslaunch  jetracer jetracer.launch     #启动机器人底盘节点  
  • 在虚拟机端打开rqt_publisher话题发布功能,选择/cmd_vel话题并添加话题信息。
rosrun rqt_publisher rqt_publisher
JetRacer ROS 34.png
  • 将/cmd_vel.augular.z的值设置改为-1并发布,舵机将转动到最左的位置,然后用手慢慢推小车运动,测试一下小车的转弯直径并记录。
  • 将/cmd_vel.augular.z依次设置为[-1, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],并测量记录不同值下小车的转弯直径。
  • 在虚拟机中打开程序,将不同角度下的转弯直径替换为刚才得到的实际数据,其中R数组为实际转弯直径,对应的舵机角度为y数组。
vi ~/catkin_ws/src/jetracer_ros/scripts/servo_calibratin.py
JetRacer ROS 37.png
  • 运行如下命令运行舵机校准程序
python ~/catkin_ws/src/jetracer_ros/scripts/servo_calibratin.py    
  • 程序运行后拟合曲线如下图所示,红线为拟合的结果,绿线为采集的数据。
JetRacer ROS 36.png
  • 程序运行后输出结果如下图所示;
JetRacer ROS 35.png
  • 最后一行为拟合参数,分别对应参数a,b,c,d。
  • 将参数保存到启动文件中
vi ~/catkin_ws/src/jetracer_ros/launch/jetracer.launch
  • 注意:程序中输出的为科学计数法,需要转换为浮点数在保存到文件中。
JetRacer ROS 31.png
  • 正常校准后,小车应该是可以直线行驶的,servo-bias直接为0不需修改。如果小车直线行驶偏移,可以稍微调节servo-bias参数或者直接调节d参数也可。