室外gps+imu小车系列(二)——双天线gps下用MPC控制松灵两轮差速车跑起来

补充:

1.关于双天线的航向精度,可以参照下这张图
在这里插入图片描述>文献来源《基于双天线 GNSS 的拖拉机自动导航关键技术研究及系统集成应用》

前言

公式部分自己随便找份文献或者博客都可以看下。我在做这部分时候发现都是前篇一律的各种公式介绍,或者拿个matlab跑下仿真,但在落地时候,这些资料意义不大。
让两轮差速车跑起来其实就是:实时姿态获取(位置,速度,航向)、路径规划、路径跟踪(mpc)。
参考博客:MPC路径跟踪原理推导

平台

某双天线设备、松灵公司的tracer_mini系列小车、一台装有vm虚拟机的电脑(配置的melodic版本的ros、matlab2022a,cmake version 3.22.0-rc1,Python 3.9.9,VS2019)各种串口线、PCAN(或者用松灵送的usb转can模块)

准备工作

写个脚本启动小车串口,小车地盘节点,gps话题发布

//为了方便后续使用,建议把启动脚本放在桌面:
//创建shell脚本
touch mini.sh 

打开脚本

sudo gedit mini.sh

在脚本输入下述代码,并保存。保存退出保存的文件

#!/bin/bash
#pcan init
sudo modprobe gs_usb
sudo ip link set can0 up type can bitrate 500000
#candump can0

#延时几秒
sleep 1


#开启小车节点
source /opt/ros/melodic/setup.sh 
source /home/hui/MINI_ws/devel/setup.bash
#启动小车控制节点和GPS话题发布节点
roslaunch control_car start.launch 
exit 0

其中start.launch中的内容为:

<launch>
    <!--启动小车节点-->
    <include file="$(find tracer_bringup)/launch/tracer_robot_base.launch" />
    <!-- 启动GPS话题发布-->
    <node pkg="pub_gps" type="pub_Android" name="pubGps"/> 
    <!--start MPC-->
    <node pkg="mpc_diff_new" type="mpc_diff_new" name=""/>
    <!--数据包记录-->
     <node pkg="rosbag" type="record" name="bag_record" args="-a -o /home/hui/Documents/car_data/1.bag"/>
</launch>

当启动后使用rqt或者rostopic list查看下发布的话题,确保cmd_vel和/GpsData话题发布成功。然后就可以进行下一步的路径跟踪了。
注意:建议按照本系列(一)中绑定下串口

MPC路径跟踪部分

一些碎碎嘴的话

MPC原理不加叙述,建议查看古月居中关于matlab和ros联合仿真的相关课程MATLAB+ROS开发MPC轨迹跟踪算法 • 董昊天和b站的视频:路径规划与轨迹跟踪系列算法学习_第13讲_模型预测控制(MPC)法。感谢课程老师的详细介绍和答疑。我做的其实是改了老师的模型和换了传感器。主要涉及到实际落地场景中一些经验和GPS双天线导航的基本知识。
双天线实时航向获取是通过本系列第一个里发布的话题,根据双天线安装位置的不同,可以分为双天线垂直于车辆前进方向(右边为主天线)、平行于前进方向两种。我这里的双天线是垂直于安装在小车前进方向的。
双天线设备输出的航向角根据不同厂家的定义可以采用不同的协议。我这里是以主天线指向从天线(右天线->左天线)的向量与y轴正方向的夹角,y轴正方向为起点,顺时针方向绕动[0°,360°)。但在实际计算目标路径的目标航向时候,由于要投影到本地坐标系下,目标航向角一般是以x轴正方向为起点,逆时针为正,顺时针为负,范围为[-pi,pi)的角度。这就导致了双天线输出的航向角并不能直接用于导航计算。这里我们可以画图说明下。
其中G1为主天线,G2为从天线,东北天坐标系下,y轴指向正北,x轴指向正东,yaw为设备输出航向角(度),框出来的为最终带入导航里的弧度制角度。注意区分车头方向,导航是以车头方向为追踪参考的:
在这里插入图片描述
车头方向反过来绕一圈同样满足上述结论的,即最终用于控制的角度大小以设备输出的180°分割点。
在这里插入图片描述
放一张测试航向时候现场图帮助理解,北方是用手机的指南针测量出来的。这时候设备输出的航向值为283°左右。

导航系统组成

导航系统主要包含:实时数据获取部分+路径规划部分+路径跟踪部分+数据分析部分
在这里插入图片描述

其中:
①init.m——在确保ros里roscore并连接网络后,通过ifconfig获取到ip,然后在init.m中改成自己的ip。
在这里插入图片描述
②generatePath.m——用于路径规划算法,这里我用函数一个个封装,自己写自己的路径规划算法后注意在这个文件的最上面按照我的格式进行添加下,否则其他界面没法调用这里的函数

③main.m——用于路径规划算法的调用,用于生成参考路径和仿真用,同时生成下述的mat文件用于后续的simulink调用x.mat,y.mat,theta.mat在这里插入图片描述
在这里插入图片描述
④analyseData.m——是配合后面ros实时跑的时候录制的rosbag包,用于分析结果用。
⑤adrc.slx——一个网上找的adrc模块,准备用于控制纵向速度的,但这里我没加。
⑥mpc_diff_new.slx——主程序,整个导航系统都在这里。
在这里插入图片描述
整天框架如图所示。
其中前面main.m中生成的mat文件在MPC路径跟踪中直接由file from模块导入
在这里插入图片描述
写这个导航系统的目的,是为了能够仿真+实物操作能够很好的结合,结构清晰,针对一个大团队,有人负责的融合定位,位姿估计,有人负责路径规划,有人负责路径追踪。但彼此之间交流是最没效率的事,能用文本搞定的就用文本搞定,能自己搞定就自己搞定。同时自己负责部分的东西可以随时落地,仿真测试。对于新手或者老手都比较适合。

仿真

仿真包含两部分:matlab仿真+ros(小乌龟/gazebo)仿真。纯matlab仿真有时候看不出来啥问题,只有实际上机才会发现算法合不合适,利用ros的仿真功能,我在gazebo里也添加了小车模型和小乌龟。用于仿真验证,可以极大的减少实机调试的时间
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里是用的里程计作为传感器,后续再慢慢添加双天线gps插件,主要没有现成得,我要自己写,不会机械
这里用了里程计作为传感器,后续再慢慢添加双天线gps插件进行仿真,主要没有现成的,我又不会机械,不会画。

实物

放一小段跑直线的视频,参数没咋调好,但起码完成了走个直线的功能:给定起始点经纬度,让它距离起点一定距离上线跑到终点停下来
(放在我这个csdn账号的视频栏里,由于写到这里时候还没给我审核通过,我就懒得等到审核通过放链接了)
在这里插入图片描述

具体的代码,我准备暂时放实验室内部使用,等改进差不多,后续再添加自己做的课题,组合导航部分,再进行开源。期待它能够被喜欢和被使用。算作我第一个开源项目。

后续的计划

准备把西工大严老师那套组合导航移植一点到这套导航系统里。用自己笔记本电脑就可以控制车跑严老师那套岂不是美哉?再后续就是加点纵向控制?再把自己单天线导航系统移植进去?反正基础框架搭建好了,后面就是填充就成了。但愿在自己学生生涯结束前(但愿能申请到心仪的学校的博士),把这套系统弄成国内最好的一套教学导航系统。集合matlab仿真+ros仿真+实车,那我再封装成虚拟机镜像,然后直接安装,岂不是美滋滋。做一个快乐的技术人。

最近进度:

1.前期用这个玩意发了个专利
2.写了个gui,实验室又新进了一台履带式和阿克曼,想做个类似严老师那种开源的工具箱,囊括常见的车型,路径跟踪,路径规划(基于组合导航/纯双天线导航)。这样做组合导航或者路径规划,路径追踪的兄弟就可以直接利用这个工具箱快速搭建场景,把精力放在自己算法上了,自己在这一途上吃了太多实验室没积累的亏。也有点想找人一起做,但下半年事很多,论文改来改去,然后试验做的也不顺,还要找申博的导师,又怕一起合作自己经常没时间耽搁别人的事……
在这里插入图片描述

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
GPSIMU组合导航的例程和代码可以使用许多不同的编程语言来实现。下面是一些可能有用的信息: 1. 例程和代码可以根据不同的硬件平台和传感器选择而有所不同。例如,你可以使用Arduino和MPU-6050 IMU和NEO-6M GPS模块。 2. 在许多情况下,需要将IMU数据进行滤波和校准,以提高其准确性。这可以通过使用滤波算法(如卡尔曼滤波器)和校准程序来实现。 3. 一般而言,GPS提供的位置信息不够精确,因此需要使用IMU提供的姿态信息来改进估计。常用的方法是使用扩展卡尔曼滤波器(EKF)来将GPSIMU数据进行融合。 4. 对于代码实现,可能需要使用一些库或者工具,如Matlab,Python,C++和ROS等,这些库可以大大简化代码的实现和测试过程。 以下是一个简单的Arduino和MPU-6050 IMU和NEO-6M GPS模块的组合导航代码的例程: ```arduino #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BNO055.h> #include <Adafruit_GPS.h> #include <SoftwareSerial.h> #include <EEPROM.h> Adafruit_BNO055 bno = Adafruit_BNO055(); SoftwareSerial mySerial(3, 2); // RX, TX Adafruit_GPS GPS(&mySerial); // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console // Set to 'true' if you want to see the data in the Serial console #define GPSECHO true // this keeps track of whether we're using the interrupt // off by default! boolean usingInterrupt = false; void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy void setup() { Serial.begin(115200); Wire.begin(); bno.begin(); mySerial.begin(9600); EEPROM.write(0, 'h'); EEPROM.write(1, 'i'); // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); // uncomment this line to turn on only the "minimum recommended" data //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since // the parser doesn't care about other sentences at this time // Set the update rate GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate // For the parsing code to work nicely and have time to sort thru the data, and // print it out we don't suggest using anything higher than 1 Hz // Request updates on antenna status, comment out to keep quiet GPS.sendCommand(PGCMD_ANTENNA); // the nice thing about this code is you can have a timer0 interrupt go off // every 1 millisecond,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值