本文做者: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】