1. 環境:
- 作業系統: Ubuntu 14.04
- ROS版本: ROS Indigo
2. 步驟:
2.1 下載下傳安裝ROS對應版本的工具包(此處為indigo版)
- 輸入以下指令安裝:
- 重新開機終端,輸入以下指令可以檢測到serial包的路徑說明已經安裝好:(路徑為 opt/ros/indigo/share/serial)
roscd serial
2.2 使用ros自帶的serial包,編寫節點
- 節點程式如下:
#include <ros/ros.h>
#include <serial/serial.h> //ROS已經内置了的序列槽包
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
serial::Serial ser; //聲明序列槽對象
//回調函數
void write_callback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM("Writing to serial port" <<msg->data);
ser.write(msg->data); //發送序列槽資料
}
int main (int argc, char** argv)
{
//初始化節點
ros::init(argc, argv, "serial_example_node");
//聲明節點句柄
ros::NodeHandle nh;
//訂閱主題,并配置回調函數
ros::Subscriber write_sub = nh.subscribe("write", , write_callback);
//釋出主題
ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", );
try
{
//設定序列槽屬性,并打開序列槽
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate();
serial::Timeout to = serial::Timeout::simpleTimeout();
ser.setTimeout(to);
ser.open();
}
catch (serial::IOException& e)
{
ROS_ERROR_STREAM("Unable to open port ");
return -;
}
//檢測序列槽是否已經打開,并給出提示資訊
if(ser.isOpen())
{
ROS_INFO_STREAM("Serial Port initialized");
}
else
{
return -;
}
//指定循環的頻率
ros::Rate loop_rate();
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);
read_pub.publish(result);
}
//處理ROS的資訊,比如訂閱消息,并調用回調函數
ros::spinOnce();
loop_rate.sleep();
}
}
3. 遇到問題
-如果出現如下錯誤,則是因為權限不夠引起的
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): open: Permission denied
Aborted (core dumped)
-通過改變權限就能解決這個問題:
sudo chmod /dev/ttyUSB0