1. Test Package 생성
아래의 명령어를 입력하여 serial_test 패키지를 생성합니다.
catkin_create_pkg serial_test std_msgs roscpp
2. ROS Serial Package 다운로드
위의 사이트에 접속하면 다운로드 및 설치에 관한 안내가 있습니다. 참조하시기 바랍니다.
먼저 소스코드를 다운로드 합니다.
git clone https://github.com/wjwwood/serial.git
다운로드 한 소스를 컴파일합니다.
make
test 소스도 컴파일 합니다.
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로 인식됩니다. 각자의 장치에 적합한 이름을 사용하여 수정하시기 바랍니다.
노드 프로그램이 완성되었으면 catkin_make를 이용하여 컴파일을 수행합니다.
정상적으로 컴파일이 완료되면 roscore를 먼저 실행하고 노드를 실행하여 정상적인 동작을 확인합니다.