1. Arduino firmware
temp : 온도 센서 값 저장 변수
heartbeat : 심장박동 수 저장 변수
typedef union
{
float fval;
uint8_t cval[4];
} FloatByte;
FloatByte temp;
FloatByte heartbeat;
temp.fval = (float)GetTemperature(analogRead(PIN_TEMP));
send_buff[0] = temp.cval[0];
send_buff[1] = temp.cval[1];
send_buff[2] = temp.cval[2];
send_buff[3] = temp.cval[3];
heartbeat.fval = (float)value;
send_buff[4] = heartbeat.cval[0];
send_buff[5] = heartbeat.cval[1];
send_buff[6] = heartbeat.cval[2];
send_buff[7] = heartbeat.cval[3];
sendPacket(PKT_HEART_DATA, send_buff, 8);
2. ros2 serial 통신 노드
def bytes_to_float(self, data, index):
"""
little-endian float32 기준.
Arduino:
union { float fval; uint8_t b[4]; }
Python:
struct.unpack('<f', bytes)
"""
return struct.unpack('<f', data[index:index + 4])[0]
def parse_dist_data(self, sequence, payload):
"""
DISTDATA Payload 구조:
IR0 : 1 byte
IR1 : 1 byte
IR2 : 1 byte
IR3 : 1 byte
US0 : float, 4 bytes
US1 : float, 4 bytes
US2 : float, 4 bytes
US3 : float, 4 bytes
Total Payload = 20 bytes
"""
if len(payload) != 20:
return
ir_values = [
payload[0],
payload[1],
payload[2],
payload[3],
]
ultrasonic_values = [
self.bytes_to_float(payload, 4),
self.bytes_to_float(payload, 8),
self.bytes_to_float(payload, 12),
self.bytes_to_float(payload, 16),
]
ir_msg = UInt8MultiArray()
ir_msg.data = ir_values
self.dist_ir_pub.publish(ir_msg)
us_msg = Float32MultiArray()
us_msg.data = ultrasonic_values
self.dist_ultrasonic_pub.publish(us_msg)