簡介

在進行無人車的規劃、控制演算法調試時,直接在實車上進行不僅危險且效率低下,一個好的運動學模擬平台將會加速開發進度。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快捷鍵顯示隱藏的文件

雙擊 .bashrc文件,在末尾加入兩行代碼

192.168.0.101為PC1的IP地址

2、Carsim的通道設置

輸入通道分別為油門開度、方向盤扭矩、剎車壓力

輸出通道分別為X、Y、Yaw、速度、方向盤轉角

3、PC2上的Simulink模型的搭建

參考資料ww2.mathworks.cn/help/r

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節點的消息類型對應

4、PC2的IP設置

選擇Simulink菜單欄中的tools項,如下圖所示進入到Configure Network Address項

上述操作將彈出以下窗口

紅色圈為PC1的IP地址

5、啟動

a、首先啟動PC1上的ROS收發節點

b、PC2:在MATLAB的命令窗口輸入以下指令,啟動Simulink中的節點

其中192.168.0.101為PC1的IP地址,192.168.0.100為PC2的IP地址

推薦閱讀:

相关文章