任务描述:
1.ROS小车识别ar标志
2.ROS小车移动到ar标志前
3.ROS小车巡线
制作原理:
ROS小车识别ar标志:
调用ROS小车自带的jubot_ar_track.launch文件对ar标志进行识别
从上图可知,小车原地自转去识别ar标志相当于ar标志绕y轴旋转。
ROS小车移动到ar标志前
通过subscribe /visualization_marker这个topic我们可以得到ar标志在camera_link下的位姿信息。但是我们需要得标志在小车坐标系下的位姿信息,所以需要进行tf坐标变换。
我们新建了一个静态坐标系base_link1,位于world坐标系上方0.5,姿态和world相同和camera_link坐标系在同一个高度。
我们将ar_marker_7y轴反向旋转90°,z轴正向旋转180°,那么经上图推算它的姿态会和world,base_link1大致相同。
假设在没有误差的情况下,如果我们将ar标志和小车正对,那么经过tf坐标变换后ar_marker_7的姿态所表示的欧拉角在base_link1的坐标系下表示为0。
那么在小车自传识别ar标志时相当于绕y轴旋转,我们可以通过pitch角的正负,判断小车在标志的左边还是右边。
最后通过标志的姿态信息,让小车先移动y在移动x逼近标志。
由于存在误差,小车在沿着y轴移动时不会在标志的正前方停下,这个时候我们采用逼近策略,线速度为0.2distance,角速度为0.2atan(y,x)逼近 标志。
巡线
首先对图像进行掩膜处理。然后将RGB图像转化为HSV图像,再读取launch文件中设置的HSV的最大值和最小值,二值化图像。最后对每一层的像素进行筛选,如果像素不为0的长度大于10,那么证明找到黑线,对不为0的像素的x位置坐标求平均值,并和图像位置的中间值比较,来判断向左移动还是向右移动。
调参
使用dynamic_reconfigure.server动态调参
图像中找一点读取HSV值进行调参
其他的一些操作
多线程操作:
由于python中没有spinonce函数所以开辟一个子线程来运行spin函数
c++中调用execlp(“roslaunch”, “roslaunch”, “ROS_project”,“line_following.launch”, NULL);命令运行launch文件。
巡线部分学习自https://www.bilibili.com/video/BV1b5411g7hr?p=44