아듀이노 호환 보드에서 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 명령으로 메세지를 확인할 수 있다.