아듀이노 호환 보드에서 ros message를 publish하는 방법을 정리
여기서는 esp32보드 esp32doit-devkit-v1 에서 진행한 과정을 정리하였음
필요한 라이브러리
아듀이노 소스코드 main.c
#include <ros.h>
#include <ros/time.h>
#include <geometry_msgs/Point.h>
다음과 같이 메세지와 퍼블리셔와 기타 변수들을 초기화해준다.
ros::NodeHandle nh;
geometry_msgs::Point pose_msg;
ros::Publisher pub_pose("point_data", &pose_msg);
unsigned long ros_msg_timer = 0;
setup()에서 노드 핸들러를 초기화해준다.
setup(){
...
Serial.begin(57600);
nh.initNode();
nh.advertise(pub_pose);
...
}
loop()에서 메세지를 보내는 부분
주의: 여기서 메세지를 보낸 후에 반드시 nh.spinOnce()를 호출해주어야 제대로 동작한다.
void loop() {
...
if((millis() - ros_msg_timer) > 49) {
pose_msg.x = 0.0;
pose_msg.y = 0.0;
pose_msg.z = 0.0;
pub_pose.publish(&pose_msg);
nh.spinOnce();
ros_msg_timer = millis();
}
...
}
이제 프로그램을 업로드하고 PC에서 roscore를 띄운 다음
터미널에 다음과 같이 입력하여 rosserial node를 띄운다.
_port 에는 해당 디바이스의 시리얼 포트 경로를 설정한다.
PC설정에 따라 /dev/ttyACM0 등으로 바뀔 수 있음.
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
실행 결과
[INFO] [1636011571.635618]: ROS Serial Python Node
[INFO] [1636011571.645163]: Connecting to /dev/ttyUSB0 at 57600 baud
[INFO] [1636011573.755570]: Requesting topics...
[INFO] [1636011573.855179]: Note: publish buffer size is 512 bytes
[INFO] [1636011573.855843]: Setup publisher on point_data [geometry_msgs/Point]
rostopic echo 명령으로 메세지를 확인할 수 있다.