开发者说丨ROS、Simulink、Carsim的互联与规划、控制算法的验证
运动规划,又称运动插补,是在给定的路径端点之间插入用于控制的中间点序列,从而实现沿给定的路径平稳运动。
运动规划由路径规划(空间)和轨迹规划(时间)组成,连接起点位置和终点位置的序列点或曲线称之为路径,构成路径的策略称之为路径规划。
自动驾驶汽车又称无人驾驶汽车、电脑驾驶汽车、轮式移动机器人,是一种通过电脑系统实现无人驾驶的智能汽车。
在MATLAB中,Simulink是用来建模、仿真和分析动态多维系通的交通工具。Carsim是专门针对车辆动力学的仿真软件,可以方便灵活的定义试验环境和试验过程,详细地定义整车各系统的特性参数和特性文件。ROS则是机器人学习和无人车学习最好linux平台软件,资源丰厚。
本文由社区开发者—杨小育撰写,对ROS、Simulink、Carsim的互联与规划、控制算法的验证进行了详细讲解,希望感兴趣的开发者能通过阅读这篇文章有所收获。
以下,ENJOY
在进行无人车的规划、控制算法调试时,直接在实车上进行不仅危险且效率低下,一个好的运动学仿真平台将会加速开发进度。Carsim非常适合进行车辆动力学仿真,但是只能运行在Windows系统上,好在它可以连接Simulink。而无人车的规划、控制算法通常运行在Linux系统上,各个模块通常使用ROS进行连接。本篇文章提供一种方法,将ROS 、 Simulink、carsim进行互联,完成规划、控制算法的动力学仿真。
a、硬件基础:PC1和PC2使用路由器连接同一局域网。
b、PC1为Ubuntu系统,运行规划、控制算法,各模块使用ROS进行通信。
c、PC2为Windows系统,运行Simulink和Carsim。
建立两个ROS节点,一个为Talker负责发送车辆的转向、油门、刹车指令,一个为 Listener接收车辆的位姿信息,(此处msgs仅为示例,需结合具体的工程项目建立相应的node和topic)。
见文末链接—1*《Talker节点》
1//talker.cpp
2
3
4
5
6
7int main(int argc,char **argv)
8{
9 ros::init(argc,argv,"talker1");
10 ros::NodeHandle n;
11 ros::Publisher chatter_pub = n.advertise<:pose2d>("control",10);
12 ros::Rate loop_rate(10);
13 float count = 0;
14 while(ros::ok())
15 {
16 geometry_msgs::Pose2D msg;
17 msg.x = count * 0.01; // 油门开度
18 msg.y = 0.5; //方向盘扭矩
19 msg.theta = 0; //刹车气缸的压强
20 ROS_INFO("%f",msg.x);
21 //printf("%f\n",msg.data);
22 chatter_pub.publish(msg);
23 ros::spinOnce();
24 loop_rate.sleep();
25 ++count;
26
27 if (msg.x > 1)
28 {
29 count = 0;
30 }
31 }
32 return 0;
33}
见文末链接—2*《Listener节点》
1//listenner.cpp
2
3
4
5void chatterCallback(const geometry_msgs::Pose2D& msg)
6{
7 //ROS_INFO("I heard:[%f]",msg );
8 ROS_INFO("I heard:",msg );
9 printf("%f\n",msg.x);
10 printf("%f\n",msg.y);
11 printf("%f\n",msg.theta);
12}
13int main(int argc,char **argv)
14{
15 ros::init(argc,argv,"listener1");
16 ros::NodeHandle n;
17 ros::Subscriber sub = n.subscribe("simulink_pose",1,chatterCallback);
18 ros::spin();
19 return 0;
20}
进入主文件夹,使用从Ctrl + H快捷键显示隐藏的文件。
双击 .bashrc文件,在末尾加入两行代码:
192.168.0.101为PC1的IP地址。
输入通道分别为油门开度、方向盘扭矩、刹车压力。
输出通道分别为X、Y、Yaw、速度、方向盘转角。
见文末链接—3*《PC2上的Simulink模型的搭建》参考资料
见文末链接—4*《该Simulink模型的下载链接》
进入Simulink Library Browser中的ROS工具箱,添加Subscribe工具箱,并双击,将弹出如下的窗口:
a、选择Topic的来源。
b、编辑Topic的名称,输入/control,与ROS的Talker节点里的Topic对应。
c、选择msg的类型,与Talker节点里的Topic的msg对应。
添加总线选择器模块Bus Selector,以Subscribe的msg引脚作为它的输入,并双击进行参数设置
使用Select按钮进行Bus Selector输出引脚的定义。
从Simulink Library Browser中的ROS工具箱添加空白消息模块Blank Message,该模块用于创建ROS消息,并双击进行参数设置。
Message类型与ROS中的Listener节点中的消息类型一致。
从Simulink Library Browser中添加Bus Assignment模块,并双击打开如下窗口,使用Select按钮进行输出通道设置。
从Simulink Library Browser中的ROS工具箱添加Publish模块,并双击进行参数设置。
Topic为/simulink_pose,与ROS中的Listener节点的话题名字对应 Message的类型与Listener节点的消息类型对应。
选择Simulink菜单栏中的Tools项,如下图所示进入到Configure Network Address项。
上述操作将弹出以下窗口:
红色圈为PC1的IP地址。
a、首先启动PC1上的ROS收发节点。
b、PC2:在MATLAB的命令窗口输入以下指令,启动Simulink中的节点。
其中192.168.0.101为PC1的IP地址,192.168.0.100为PC2的IP地址。
1*《Talker节点》
【https://github.com/xiaoyuyang0901/Simulation-platform/blob/master/ROS-Simulink-Carsim/listenner.cpp】
2*《Listener节点》
【https://github.com/xiaoyuyang0901/Simulation-platform/blob/master/ROS-Simulink-Carsim/listenner.cpp】
3*《PC2上的Simulink模型的搭建》参考资料
【https://github.com/xiaoyuyang0901/Simulation-platform/tree/master/ROS-Simulink-Carsim】
4*《该simulink模型的下载链接》
【https://github.com/xiaoyuyang0901/Simulation-platform/tree/master/ROS-Simulink-Carsim】
更多话题讨论、技术交流
可以添加『Apollo小哥哥』为好友
进开发者交流群
* 以上内容为开发者原创,不代表百度官方言论。
内容来自开发者知乎专栏:
https://zhuanlan.zhihu.com/p/62024133?utm_source=wechat_session&utm_medium=social&utm_oi=676862238183264256,欢迎大家收藏点赞。已获开发者授权,原文地址请戳阅读原文。