ROS專案開發實戰(一)——STM32與ROS串列埠通訊
阿新 • • 發佈:2019-02-16
序
本文主要釋出一些作者從零開始開發ROS的專案實戰經驗,包括一些經驗與本文遇到坑時的解決方案,ROS因為版本不同與開發環境不同在實際開發中會遇到各類問題,下面就細細道來。
一、環境搭建
本人開發環境 ——上位機:MAC主機+PD虛擬機器+Ubuntu12.04(64位)+Hydro,底層:STM32F407
先說下為什麼是PD虛擬機器,現在主流的電腦安裝Ubuntu容易出現沒有無線網絡卡驅動的問題(如果你的電腦有請忽略),虛擬機器不用擔心網絡卡問題,並且虛擬機器安裝Ubuntu更方便(如果你的電腦是UEFI,安裝Ubuntu將會遇到一些麻煩),相比之下虛擬機器其實用起來更方便一些(本人直觀感受)。
現在很多人用Ubuntu14.04+indigo,本人也建議用14.04,本文通訊程式碼在兩個版本下都可以順利執行。
二、STM32與ROS串列埠通訊
本人STM32串列埠通訊模組(當然用山外助手也是一樣可行的):
圖 1
在ROS下主要運用asio,本人找了許多方法,這種比較簡潔實用,接下來就是在ROS下設定與底層相匹配的通訊協議格式了,按照圖1相應的設定程式如下:
之後是ros主程式:#include <boost/asio.hpp> #include <boost/bind.hpp> //asio標頭檔案 #include <ros/ros.h> #include<stdio.h> #include <std_msgs/String.h> //ros標頭檔案 using namespace std; using namespace boost::asio; using namespace ros; io_service iosev; serial_port sp(iosev,"/dev/ttyUSB0"); //全域性定義主要是為了在ros回撥函式中使用,/dev/ttyUSB0根據自己實際情況修改
以上命令只是傳送一次,在ROS下最好建立cmd_pub與cmd_sub命令接收與釋出者,並在/STM32_cmd話題上進行資訊互動,即可完成命令的實時釋出與獲取,以下部分可自己編寫。(提示:在main中建立pub與sub,將date與write放在sub回撥函式中。)int main(int argc, char** argv) { ros::init(argc, argv, "boost"); // ros::NodeHandle n; // sp.set_option(serial_port::baud_rate(115200)); sp.set_option(serial_port::flow_control(serial_port::flow_control::none)); sp.set_option(serial_port::parity(serial_port::parity::none)); sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one)); sp.set_option(serial_port::character_size(8));//按照圖1進行通訊設定 ros::spin(); unsigned char date[6]={0x55,0x7a,0x01,0x07,0x00,0xd7}; //通訊命令,按照自己的實際情況修改,底層一般是16進位制按位校驗,位的宣告可為unsigned char write(sp, buffer(date, 6));//命令寫入 read(sp, buffer(buf,100));//接收底層反饋資訊,buf若顯示未定的可自行定義 iosev.run(); return 0; }