ROS、Simulink、Carsim的互聯與規劃、控制演算法的驗證
簡介
在進行無人車的規劃、控制演算法調試時,直接在實車上進行不僅危險且效率低下,一個好的運動學模擬平台將會加速開發進度。Carsim非常適合進行車輛動力學模擬,但是只能運行在Windows系統上,好在它可以連接Simulink。而無人車的規劃、控制演算法通常運行在Linux系統上,各個模塊通常使用ROS進行連接。本篇文章提供一種方法,將ROS 、 Simulink、carsim進行互聯,完成規劃、控制演算法的動力學模擬。
準備工作
a、硬體基礎:PC1和PC2使用路由器連接同一區域網
b、PC1為Ubuntu系統,運行規劃、控制演算法,各模塊使用ROS進行通信
c、PC2為Windows系統,運行Simulink和Carsim
1、PC1上的ROS節點建立
建立兩個ROS節點,一個為 Talker 負責發送車輛的轉向、油門、剎車指令,一個為 Listener接收車輛的位姿信息,(此處msgs僅為示例,需結合具體的工程項目建立相應的node和topic)
Talker節點
//talker.cpp
#include <stdio.h>
#include "ros/ros.h"
#include "geometry_msgs/Pose2D.h"
#include "std_msgs/Float64.h"
int main(int argc,char **argv)
{
ros::init(argc,argv,"talker1");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<geometry_msgs::Pose2D>("control",10);
ros::Rate loop_rate(10);
float count = 0;
while(ros::ok())
{
geometry_msgs::Pose2D msg;
msg.x = count * 0.01; // 油門開度
msg.y = 0.5; //方向盤扭矩
msg.theta = 0; //剎車氣缸的壓強
ROS_INFO("%f",msg.x);
//printf("%f
",msg.data);
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
if (msg.x > 1)
{
count = 0;
}
}
return 0;
}
Listener節點
//listenner.cpp
#include <stdio.h>
#include "ros/ros.h"
#include "geometry_msgs/Pose2D.h"
void chatterCallback(const geometry_msgs::Pose2D& msg)
{
//ROS_INFO("I heard:[%f]",msg );
ROS_INFO("I heard:",msg );
printf("%f
",msg.x);
printf("%f
",msg.y);
printf("%f
",msg.theta);
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"listener1");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("simulink_pose",1,chatterCallback);
ros::spin();
return 0;
}
進入主文件夾,使用從Ctrl + H快捷鍵顯示隱藏的文件