环境:Ubuntu16.04+ROS Kinetic
ROS与底层串口通讯有两种方式:
- 底层作为ROS节点:https://blog.csdn.net/Kalenee/article/details/80644896
- 采用传统的串口通讯方式进行通讯:https://blog.csdn.net/Kalenee/article/details/82422196
一、简介
编写串口节点,通过ROS标准通讯格式完成ROS平台上的消息处理与接发,再通过串口下发数据。
二、配置
1、安装串口功能包
sudo apt-get install ros-kinetic-serial
api文档:http://wjwwood.io/serial/doc/1.1.0/classserial_1_1_serial.html
2、安装串口助手
sudo apt-get install cutecom
三、编写串口节点
#include <ros/ros.h>
#include <serial/serial.h>
//串口类
serial::Serial ser;
#define sBUFFERSIZE 1000 // send buffer size串口发送缓存长度
#define rBUFFERSIZE 1000 // receive buffer size 串口接收缓存长度
unsigned char s_buffer[sBUFFERSIZE]; //发送缓存
unsigned char r_buffer[rBUFFERSIZE]; //接收缓存
//下发数据函数
void data_redownload()
{
ser.write(s_buffer, sBUFFERSIZE);
}
int main(int argc, char **argv) {
ros::init(argc, argv, "serial_node");
ros::NodeHandle nh;
//打开串口
try {
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(115200);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
ser.open();
} catch (serial::IOException &e) {
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
if (ser.isOpen()) {
ROS_INFO_STREAM("Serial Port initialized");
} else {
return -1;
}
// 10hz频率执行
ros::Rate loop_rate(10);
while (ros::ok()) {
ros::spinOnce();
if (ser.available()) {
size_t bytes_read;
bytes_read = ser.read(r_buffer, ser.available());
//接收到数据后处理
}
loop_rate.sleep();
}
}
四、测试
1、连接设备并检查串口连接状态
dmesg | grep ttyS*
2、通过cutrcom串口助手检查串口设备是否能进行通讯,若因权限问题无法连接,运行以下命令给与用户权限,user_name为系统用户名字。
sudo usermod -a -G dialout user_name
3、运行节点进行通讯
参考