寫在最前
串口通信在嵌入式領域的重要性我也就不多說了, 這裏的ros與arduino串口通信的方案, 同樣適合於stm32, 51單片機等各種芯片. 這裏與rosserial有區別, rosserial是基於某種類型的板子開發的.
安裝serial庫
首先當然是需要安裝serial庫啦, ros官方是提供了一個編譯好的包給大家使用, 就不用大家去編譯了. 直接輸入下面的指令, 安裝即可.
sudo apt-get install ros-kinetic-serial #此處的kinetic請根據安裝的ros版本進行替換
編寫arduino串口通信程序
arduino的串口通信程序很簡單, 當arduino接受到數據之後, 原封不動的將數據進行返回, 也就不多解釋了, 看註釋就行:
#include <Arduino.h>
String readStr = "";
void setup()
{
Serial.begin(9600); //打開串口, 波特率9600
}
void loop()
{
while (Serial.available()) //等待串口接受到數據
{
readStr = readStr + char(Serial.read()); //將所有接受到的數據轉成字符串
delay(2); //等待串口讀取完成
}
if(readStr.length()>0) //如果讀到了數據
{
Serial.print(readStr); //將數據原封不懂返回
readStr = ""; //清空
}
delay(20); //延時一段時間
}
博主這裏使用的還是platformio, 使用arduino IDE也行.
編寫ros節點
在ros_test文件夾下新建serial_test.cpp
文件. 說明一下: 如果你是第一次看我的博客, 可能不知道ros_test文件夾是什麼, 這個是在ros工程下的自己創建的功能包, 具體請查看以往的文章.
#include <serial/serial.h>
#include <ros/ros.h>
#include <string>
int main(int argc, char **argv)
{
ros::init(argc, argv, "serial_test"); //創建節點
ros::NodeHandle nh;
serial::Serial ser;
setlocale(LC_ALL, ""); //中文支持
try
{
ser.setPort("/dev/ttyUSB0"); //設置端口號
ser.setBaudrate(9600); //設置波特率
serial::Timeout tout = serial::Timeout::simpleTimeout(1000);//設置延時等待 ms
ser.setTimeout(tout);
ser.open(); //打開串口
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("無法打開串口 ");
return -1;
}
if(ser.isOpen()) //成功打開串口
{
ROS_INFO_STREAM("串口初始化成功");
}
else
{
return -1;
}
while(ros::ok())
{
std::string result; //接受字符串
std::string msg = "hello"; //發送數據
ser.write(msg); //像單片機發送數據
sleep(1); //等待1s
while(ser.available()>0) //當串口接受到數據時
{
result = ser.read(ser.available());//讀取所有數據
std::cout<<result<<std::endl; //打印
}
}
return 0;
}
端口號配置
注意, 這個ros程序中, 設置的端口號, 根據你的arduino所在的端口進行配置, 查看方法:
1, 插入arduino.
2, 打開platformio的主頁, 方法在上一篇文章有說.
3, 點擊devices, 即可查看arduino所在的端口.
配置CMakeLists.txt文件
1, 修改find_package
, 新增serial包
find_package(catkin REQUIRED COMPONENTS
...
serial
)
2, 在文件的末尾, 加上:
add_executable(serial_test src/serial_test.cpp)
target_link_libraries(serial_test ${catkin_LIBRARIES})
add_dependencies(serial_test ${PROJECT_NAME}_generate_messages_cpp)
編譯整個ROS工程
點擊"終端"–>“新建終端”,在終端中輸入"catkin_make".
運行節點
1, 使用快捷鍵Ctrl + Shift + T 彈出系統終端,輸入roscore
,啓用整個ROS總節點。
2, 使用快捷鍵Ctrl + Shift + T 彈出系統終端,輸入rosrun ros_test serial_test
,啓用serial_test節點。
可以看到ros與arduino通信成功. 如果提示"無法打開串口", 請確認串口權限已經配置好, 且沒有被其他程序佔用.
後記
更多機器人ROS相關,公-衆-號搜索 ”機器人小站", 關注我們吧。