1. Test Package 생성
catkin_create_pkg serial_test std_msgs roscpp

2. ROS Serial Package 다운로드
위의 사이트에 접속하면 다운로드 및 설치에 관한 안내가 있습니다. 참조하시기 바랍니다.

먼저 소스코드를 다운로드 합니다.
git clone https://github.com/wjwwood/serial.git

make


make test


make install

3. 다른 serial 예제 다운로드

위와 같은 파일이 있습니다. 위의 “src” 폴더의 cpp 파일 내용을 사용하여 노드를 작성하도록 합니다.
먼저 패키지를 생성한 “serial_test” 폴더로 이동합니다.

여기서 package.xml 파일과 다음과 같이 수정합니다.
<?xml version="1.0"?>
<package format="2">
<name>serial_test</name>
<version>0.1.0</version>
<description>The serial_test package</description>
<maintainer email="sjyong@humanoidsystem.com">Seo, Jae Yong</maintainer>
<license>BSD</license>
<author email="sjyong@humanoidsystem.com">Seo, Jae Yong</author> -->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>serial</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>serial</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>serial</exec_depend>
<exec_depend>std_msgs</exec_depend>
</package>
CMakeLists.txt 파일을 아래의 내용으로 수정합니다.
cmake_minimum_required(VERSION 2.8.3)
project(serial_test)
find_package(catkin REQUIRED COMPONENTS
roscpp
serial
std_msgs
)
catkin_package(
CATKIN_DEPENDS
roscpp
serial
std_msgs
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(serial_test_node src/serial_test_node.cpp)
target_link_libraries(serial_test_node
${catkin_LIBRARIES}
)
“src” 폴더에 serial_test_node.cpp 파일을 아래와 같이 작성합니다.
#include <ros/ros.h>
#include <serial/serial.h>
#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", 1000, write_callback);
ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000);
try
{
ser.setPort("/dev/ttyUSB0");
ser.setBaudrate(9600);
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");
std_msgs::String test_string;
test_string.data = "Send test string!!!";
ser.write(test_string.data);
}else{
return -1;
}
ros::Rate loop_rate(5);
while(ros::ok()){
ros::spinOnce();
if(ser.available()){
ROS_INFO_STREAM("Reading from serial port");
std_msgs::String result;
result.data = ser.read(ser.available());
ROS_INFO_STREAM("Read: " << result.data);
read_pub.publish(result);
}
loop_rate.sleep();
}
}
ser.setPort(“/dev/ttyUSB0”); 에서 USBtoSerial 케이블을 사용할 경우 장치는 ttyUSB0로 인식됩니다. 각자의 장치에 적합한 이름을 사용하여 수정하시기 바랍니다.
4. ros serial 설치
아래의 명령을 수행하여 ros serial를 설치한다.
sudo apt-get install ros-kinetic-serial

노드 프로그램이 완성되었으면 catkin_make를 이용하여 컴파일을 수행합니다.


정상적으로 컴파일이 완료되면 roscore를 먼저 실행하고 노드를 실행하여 정상적인 동작을 확인합니다.

