Skip to content

Commit 3db9f26

Browse files
authored
Merge pull request #213 from andreschreiber/latch-and-magnetic-field
Add latched topics and magnetic field
2 parents c0e876a + 353062c commit 3db9f26

File tree

7 files changed

+108
-11
lines changed

7 files changed

+108
-11
lines changed

Source/ROSIntegration/Classes/RI/Topic.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ROSINTEGRATION_API UTopic: public UObject
5252

5353
void BeginDestroy() override;
5454

55-
void Init(UROSIntegrationCore *Ric, FString Topic, FString MessageType, int32 QueueSize = 10);
55+
void Init(UROSIntegrationCore *Ric, FString Topic, FString MessageType, int32 QueueSize = 10, bool Latch = false);
5656

5757
FString GetROSBridgeHost() const;
5858

@@ -133,7 +133,7 @@ class ROSINTEGRATION_API UTopic: public UObject
133133

134134

135135
UFUNCTION(BlueprintCallable, Category = "ROS|Topic")
136-
void Init(const FString& TopicName, EMessageType MessageType, int32 QueueSize = 1);
136+
void Init(const FString& TopicName, EMessageType MessageType, int32 QueueSize = 1, bool Latch = false);
137137

138138
/**
139139
* Subscribe to the given topic

Source/ROSIntegration/Private/Conversion/Messages/sensor_msgs/SensorMsgsImuConverter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class ROSINTEGRATION_API USensorMsgsImuConverter : public UBaseMessageConverter
5959
UGeometryMsgsQuaternionConverter::_bson_append_child_quaternion(b, "orientation", &msg->orientation);
6060
_bson_append_double_tarray(b, "orientation_covariance", msg->orientation_covariance);
6161
UGeometryMsgsVector3Converter::_bson_append_child_vector3(b, "angular_velocity", &msg->angular_velocity);
62-
_bson_append_double_tarray(b, "angular_velocity_covariance", msg->orientation_covariance);
62+
_bson_append_double_tarray(b, "angular_velocity_covariance", msg->angular_velocity_covariance);
6363
UGeometryMsgsVector3Converter::_bson_append_child_vector3(b, "linear_acceleration", &msg->linear_acceleration);
6464
_bson_append_double_tarray(b, "linear_acceleration_covariance", msg->linear_acceleration_covariance);
6565
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "Conversion/Messages/sensor_msgs/SensorMsgsMagneticFieldConverter.h"
2+
3+
USensorMsgsMagneticFieldConverter::USensorMsgsMagneticFieldConverter()
4+
{
5+
_MessageType = "sensor_msgs/MagneticField";
6+
}
7+
8+
bool USensorMsgsMagneticFieldConverter::ConvertIncomingMessage(const ROSBridgePublishMsg* message, TSharedPtr<FROSBaseMsg>& BaseMsg)
9+
{
10+
auto msg = new ROSMessages::sensor_msgs::MagneticField();
11+
BaseMsg = TSharedPtr<FROSBaseMsg>(msg);
12+
return _bson_extract_child_magnetic_field(message->full_msg_bson_, "msg", msg);
13+
}
14+
15+
bool USensorMsgsMagneticFieldConverter::ConvertOutgoingMessage(TSharedPtr<FROSBaseMsg> BaseMsg, bson_t** message)
16+
{
17+
auto CastMsg = StaticCastSharedPtr<ROSMessages::sensor_msgs::MagneticField>(BaseMsg);
18+
*message = bson_new();
19+
_bson_append_magnetic_field(*message, CastMsg.Get());
20+
return true;
21+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#pragma once
2+
3+
#include "CoreMinimal.h"
4+
#include "Conversion/Messages/BaseMessageConverter.h"
5+
#include "Conversion/Messages/std_msgs/StdMsgsHeaderConverter.h"
6+
#include "Conversion/Messages/geometry_msgs/GeometryMsgsVector3Converter.h"
7+
#include "sensor_msgs/MagneticField.h"
8+
#include "SensorMsgsMagneticFieldConverter.generated.h"
9+
10+
11+
UCLASS()
12+
class ROSINTEGRATION_API USensorMsgsMagneticFieldConverter : public UBaseMessageConverter
13+
{
14+
GENERATED_BODY()
15+
16+
public:
17+
USensorMsgsMagneticFieldConverter();
18+
virtual bool ConvertIncomingMessage(const ROSBridgePublishMsg* message, TSharedPtr<FROSBaseMsg>& BaseMsg);
19+
virtual bool ConvertOutgoingMessage(TSharedPtr<FROSBaseMsg> BaseMsg, bson_t** message);
20+
21+
static bool _bson_extract_child_magnetic_field(bson_t* b, FString key, ROSMessages::sensor_msgs::MagneticField* msg, bool LogOnErrors = true)
22+
{
23+
bool KeyFound = false;
24+
25+
if (!UStdMsgsHeaderConverter::_bson_extract_child_header(b, key + ".header", &msg->header)) return false;
26+
27+
if (!UGeometryMsgsVector3Converter::_bson_extract_child_vector3(b, key + ".magnetic_field", &msg->magnetic_field)) return false;
28+
msg->magnetic_field_covariance = GetDoubleTArrayFromBSON(key + ".magnetic_field_covariance", b, KeyFound);
29+
if (!KeyFound || msg->magnetic_field_covariance.Num() != 9) // Size of covariance, 3x3 -> array of 9 see ROS magnetic field msg definition at above link
30+
return false;
31+
32+
return true;
33+
}
34+
35+
static void _bson_append_child_magnetic_field(bson_t* b, const char* key, const ROSMessages::sensor_msgs::MagneticField* msg)
36+
{
37+
bson_t child;
38+
BSON_APPEND_DOCUMENT_BEGIN(b, key, &child);
39+
_bson_append_magnetic_field(&child, msg);
40+
bson_append_document_end(b, &child);
41+
}
42+
43+
static void _bson_append_magnetic_field(bson_t* b, const ROSMessages::sensor_msgs::MagneticField* msg)
44+
{
45+
UStdMsgsHeaderConverter::_bson_append_child_header(b, "header", &msg->header);
46+
UGeometryMsgsVector3Converter::_bson_append_child_vector3(b, "magnetic_field", &msg->magnetic_field);
47+
_bson_append_double_tarray(b, "magnetic_field_covariance", msg->magnetic_field_covariance);
48+
}
49+
};

Source/ROSIntegration/Private/Topic.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class UTopic::Impl {
4040
FString _Topic;
4141
FString _MessageType;
4242
int32 _QueueSize;
43+
bool _Latch;
4344
rosbridge2cpp::ROSTopic* _ROSTopic = nullptr;
4445
UBaseMessageConverter* _Converter;
4546
rosbridge2cpp::ROSCallbackHandle<rosbridge2cpp::FunVrROSPublishMsg> _CallbackHandle;
@@ -116,7 +117,7 @@ class UTopic::Impl {
116117
}
117118
}
118119

119-
void Init(UROSIntegrationCore *Ric, const FString& Topic, const FString& MessageType, int32 QueueSize)
120+
void Init(UROSIntegrationCore *Ric, const FString& Topic, const FString& MessageType, int32 QueueSize, bool Latch)
120121
{
121122
// Construct static ConverterMap
122123
if (TypeConverterMap.Num() == 0)
@@ -138,6 +139,7 @@ class UTopic::Impl {
138139
_Topic = Topic;
139140
_MessageType = MessageType;
140141
_QueueSize = QueueSize;
142+
_Latch = Latch;
141143

142144
UBaseMessageConverter** Converter = TypeConverterMap.Find(MessageType);
143145
if (!Converter)
@@ -152,7 +154,7 @@ class UTopic::Impl {
152154
}
153155
_Converter = *Converter;
154156

155-
_ROSTopic = new rosbridge2cpp::ROSTopic(Ric->_Implementation->Get()->GetBridge(), TCHAR_TO_UTF8(*Topic), TCHAR_TO_UTF8(*MessageType), QueueSize);
157+
_ROSTopic = new rosbridge2cpp::ROSTopic(Ric->_Implementation->Get()->GetBridge(), TCHAR_TO_UTF8(*Topic), TCHAR_TO_UTF8(*MessageType), QueueSize, Latch);
156158
}
157159

158160
void MessageCallback(const ROSBridgePublishMsg &message)
@@ -252,14 +254,14 @@ bool UTopic::Publish(TSharedPtr<FROSBaseMsg> msg)
252254
return _State.Connected && _Implementation->Publish(msg);
253255
}
254256

255-
void UTopic::Init(UROSIntegrationCore *Ric, FString Topic, FString MessageType, int32 QueueSize)
257+
void UTopic::Init(UROSIntegrationCore *Ric, FString Topic, FString MessageType, int32 QueueSize, bool Latch)
256258
{
257259
_ROSIntegrationCore = Ric;
258260
_ROSBridgeHost = Ric->GetROSBridgeHost();
259261
_ROSBridgePort = Ric->GetROSBridgePort();
260262
_Topic = Topic;
261263
_MessageType = MessageType;
262-
_Implementation->Init(Ric, Topic, MessageType, QueueSize);
264+
_Implementation->Init(Ric, Topic, MessageType, QueueSize, Latch);
263265
}
264266

265267
FString UTopic::GetROSBridgeHost() const
@@ -296,7 +298,7 @@ bool UTopic::Reconnect(UROSIntegrationCore* ROSIntegrationCore)
296298

297299
Impl* oldImplementation = _Implementation;
298300
_Implementation = new UTopic::Impl();
299-
_Implementation->Init(ROSIntegrationCore, oldImplementation->_Topic, oldImplementation->_MessageType, oldImplementation->_QueueSize);
301+
_Implementation->Init(ROSIntegrationCore, oldImplementation->_Topic, oldImplementation->_MessageType, oldImplementation->_QueueSize, oldImplementation->_Latch);
300302

301303
_State.Connected = true;
302304
if (_State.Subscribed)
@@ -327,7 +329,7 @@ FString UTopic::GetDetailedInfoInternal() const
327329
return _Implementation->_Topic;
328330
}
329331

330-
void UTopic::Init(const FString& TopicName, EMessageType MessageType, int32 QueueSize)
332+
void UTopic::Init(const FString& TopicName, EMessageType MessageType, int32 QueueSize, bool Latch)
331333
{
332334
_State.Blueprint = true;
333335
_State.BlueprintMessageType = MessageType;
@@ -337,7 +339,7 @@ void UTopic::Init(const FString& TopicName, EMessageType MessageType, int32 Queu
337339
{
338340
if (ROSInstance->bConnectToROS && _State.Connected)
339341
{
340-
Init(ROSInstance->ROSIntegrationCore, TopicName, SupportedMessageTypes[MessageType], QueueSize);
342+
Init(ROSInstance->ROSIntegrationCore, TopicName, SupportedMessageTypes[MessageType], QueueSize, Latch);
341343
}
342344
}
343345
else

Source/ROSIntegration/Private/rosbridge2cpp/ros_topic.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ namespace rosbridge2cpp{
1919

2020
class ROSTopic {
2121
public:
22-
ROSTopic(ROSBridge &ros, std::string topic_name, std::string message_type, int queue_size = 10)
22+
ROSTopic(ROSBridge &ros, std::string topic_name, std::string message_type, int queue_size = 10, bool latch = false)
2323
: ros_(ros)
2424
, topic_name_(topic_name)
2525
, message_type_(message_type)
26+
, latch_(latch)
2627
, queue_size_(queue_size)
2728
{
2829
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
#include "ROSBaseMsg.h"
4+
#include "std_msgs/Header.h"
5+
#include "geometry_msgs/Vector3.h"
6+
7+
// https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/MagneticField.html
8+
namespace ROSMessages {
9+
namespace sensor_msgs {
10+
class MagneticField : public FROSBaseMsg {
11+
public:
12+
MagneticField() {
13+
_MessageType = "sensor_msgs/MagneticField";
14+
}
15+
16+
// Header header
17+
std_msgs::Header header;
18+
19+
geometry_msgs::Vector3 magnetic_field;
20+
TArray<double> magnetic_field_covariance;
21+
22+
};
23+
}
24+
}

0 commit comments

Comments
 (0)