topic_serial_node.cpp
// topic_serial_node.cpp
// serial API: http://wjwwood.io/serial/doc/1.1.0/index.html
// serial install: sudo apt install ros-melodic-serial
#include <ros/ros.h>
#include <serial/serial.h> //ROS已經內置了的串口包
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
serial::Serial ser; //聲明串口對象
//回調函數
void topic_read_callback(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO_STREAM("topic_serial_read:" << msg->data);
//ser.write(msg->data); //發送串口數據,有了控制檯,所以把串口打印關了
}
int main(int argc, char **argv)
{
//初始化節點
ros::init(argc, argv, "topic_serial_node");
//聲明節點句柄
ros::NodeHandle nh;
//訂閱主題,並配置回調函數
ros::Subscriber read_sub = nh.subscribe("topic_serial_read", 1000, topic_read_callback);
//發佈主題
ros::Publisher write_pub = nh.advertise<std_msgs::String>("topic_serial_write", 1000);
try
{
//設置串口屬性,並打開串口
ser.setPort("/dev/ttyUSB0"); // 此處要注串口設備權限,見下文
ser.setBaudrate(115200);
serial::Timeout to = serial::Timeout::simpleTimeout(1000);
ser.setTimeout(to);
ser.open();
}
catch (serial::IOException &e)
{
std::string err = e.what();
ROS_ERROR_STREAM(err);
ROS_ERROR_STREAM("Unable to open port ");
return -1;
}
//檢測串口是否已經打開,並給出提示信息
if (ser.isOpen())
{
ROS_INFO_STREAM("Serial Port initialized");
}
else
{
return -1;
}
//指定循環的頻率
ros::Rate loop_rate(50);
while (ros::ok())
{
if (ser.available())
{
//ROS_INFO_STREAM("Reading from serial port\n");
std_msgs::String result;
result.data = ser.read(ser.available());
ROS_INFO_STREAM("Read: " << result.data);
write_pub.publish(result);
}
//處理ROS的信息,比如訂閱消息,並調用回調函數
ros::spinOnce();
loop_rate.sleep();
}
}
launch:
<launch>
<node pkg="topic_serial" type="topic_serial_node" name="topic_serial_node" output="screen"/>
</launch>
CMakefile.txt
cmake_minimum_required(VERSION 2.8.3)
project(topic_serial)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## 這是進行catkin構建時所需的組件包。
## 依賴包是message_generation、 std_msgs和roscpp。如果這些包不存在,在構建過程中會發生錯誤。
find_package(catkin REQUIRED
COMPONENTS
message_generation
std_msgs
roscpp
serial
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
###################################
## catkin specific configuration ##
###################################
catkin_package(
#INCLUDE_DIRS include
LIBRARIES
CATKIN_DEPENDS
std_msgs
roscpp
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(topic_serial_node
src/topic_serial_node.cpp
)
add_dependencies(topic_serial_node
${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS}
serial
)
target_link_libraries(topic_serial_node
${catkin_LIBRARIES}
)
Linux/ROS——獲取串口權限
此處參考:https://blog.csdn.net/weixin_30258027/article/details/97362051
創建ttyUSB權限規則文件etc/udev/rules.d/70-ttyUSB.rules
$ sudo nano -p /etc/udev/rules.d/70-ttyUSB.rules
在70-ttyUSB.rules
文件中寫入下列代碼:
KERNEL=="ttyUSB*", OWNER="root", GROUP="root", MODE="0666"
保存即可,重啓或註銷用戶在登錄後生效