vscode開發ROS(19)-ros與arduino串口通信(c++)


寫在最前

串口通信在嵌入式領域的重要性我也就不多說了, 這裏的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相關,公-衆-號搜索 ”機器人小站", 關注我們吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章