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相关,公-众-号搜索 ”机器人小站", 关注我们吧。

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