開發者說丨ROS、Simulink、Carsim的互聯與規劃、控制算法的驗證

本文做者:Apollo開發者社區javascript

運動規劃,又稱運動插補,是在給定的路徑端點之間插入用於控制的中間點序列,從而實現沿給定的路徑平穩運動。java

 

運動規劃由路徑規劃(空間)和軌跡規劃(時間)組成,鏈接起點位置和終點位置的序列點或曲線稱之爲路徑,構成路徑的策略稱之爲路徑規劃。node

 

自動駕駛汽車又稱無人駕駛汽車、電腦駕駛汽車、輪式移動機器人,是一種經過電腦系統實現無人駕駛的智能汽車。linux

 

在MATLAB中,Simulink是用來建模、仿真和分析動態多維繫通的交通工具。Carsim是專門針對車輛動力學的仿真軟件,能夠方便靈活的定義試驗環境和試驗過程,詳細地定義整車各系統的特性參數和特性文件。ROS則是機器人學習和無人車學習最好linux平臺軟件,資源豐厚。git

 

本文由社區開發者—楊小育撰寫,對ROS、Simulink、Carsim的互聯與規劃、控制算法的驗證進行了詳細講解,但願感興趣的開發者能經過閱讀這篇文章有所收穫。github

 

如下,ENJOY  算法

 

 

在進行無人車的規劃控制算法調試時,直接在實車上進行不只危險且效率低下,一個好的運動學仿真平臺將會加速開發進度。Carsim很是適合進行車輛動力學仿真,可是隻能運行在Windows系統上,好在它能夠鏈接Simulink。而無人車的規劃控制算法一般運行在Linux系統上,各個模塊一般使用ROS進行鏈接。本篇文章提供一種方法,將ROS 、 Simulink、carsim進行互聯,完成規劃、控制算法的動力學仿真。bash

 

 

a、硬件基礎:PC1和PC2使用路由器鏈接同一局域網。工具

b、PC1爲Ubuntu系統,運行規劃、控制算法,各模塊使用ROS進行通訊。oop

c、PC2爲Windows系統,運行Simulink和Carsim。

 

 

創建兩個ROS節點,一個爲Talker負責發送車輛的轉向、油門、剎車指令,一個爲 Listener接收車輛的位姿信息,(此處msgs僅爲示例,需結合具體的工程項目創建相應的node和topic)。

 

見文末連接—1*《Talker節點》

 
1//talker.cpp
 2#include 
 3#include "ros/ros.h"
 4#include "geometry_msgs/Pose2D.h"
 5#include "std_msgs/Float64.h"
 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("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#include 
 3#include "ros/ros.h"
 4#include "geometry_msgs/Pose2D.h"
 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模型的搭建》參考資料

 

見文末連接—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】

原文連接地址:https://developer.baidu.com/topic/show/290449

相關文章
相關標籤/搜索