写在最前
串口通信在嵌入式领域的重要性我也就不多说了, 这里的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通信成功. 如果提示"无法打开串口", 请确认串口权限已经配置好, 且没有被其他程序占用.