mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-11 15:31:37 +08:00
PX4 ROS2 msg conformity and explicit topics
- .msg files are PascalCase - topics are still either per msg or explicitly listed in TOPICS - compatible structs are still generated (eg struct msg_s), but ROS2 style px4::msg::Msg is also available
This commit is contained in:
@@ -1,92 +0,0 @@
|
||||
@###############################################
|
||||
@#
|
||||
@# PX4 ROS compatible message source code
|
||||
@# generation for C++
|
||||
@#
|
||||
@# EmPy template for generating <msg>.h files
|
||||
@# Based on the original template for ROS
|
||||
@#
|
||||
@###############################################
|
||||
@# Start of Template
|
||||
@#
|
||||
@# Context:
|
||||
@# - file_name_in (String) Source file
|
||||
@# - spec (msggen.MsgSpec) Parsed specification of the .msg file
|
||||
@# - search_path (dict) search paths for genmsg
|
||||
@# - topics (List of String) multi-topic names
|
||||
@# - constrained_flash set to true if flash is constrained
|
||||
@###############################################
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013-2021 PX4 Development Team. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name PX4 nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* Auto-generated by genmsg_cpp from file @file_name_in */
|
||||
|
||||
@{
|
||||
import genmsg.msgs
|
||||
|
||||
from px_generate_uorb_topic_helper import * # this is in Tools/
|
||||
|
||||
uorb_struct = '%s_s'%spec.short_name
|
||||
topic_name = spec.short_name
|
||||
|
||||
sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
|
||||
struct_size, padding_end_size = add_padding_bytes(sorted_fields, search_path)
|
||||
topic_fields = ["%s %s" % (convert_type(field.type, True), field.name) for field in sorted_fields]
|
||||
}@
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <px4_platform_common/log.h>
|
||||
#include <px4_platform_common/defines.h>
|
||||
#include <uORB/topics/@(topic_name).h>
|
||||
#include <uORB/topics/uORBTopics.hpp>
|
||||
#include <drivers/drv_hrt.h>
|
||||
#include <lib/drivers/device/Device.hpp>
|
||||
#include <lib/matrix/matrix/math.hpp>
|
||||
#include <lib/mathlib/mathlib.h>
|
||||
|
||||
@# join all msg files in one line e.g: "float[3] position;float[3] velocity;bool armed"
|
||||
@# This is used for the logger
|
||||
constexpr char __orb_@(topic_name)_fields[] = "@( ";".join(topic_fields) );";
|
||||
|
||||
@[for multi_topic in topics]@
|
||||
ORB_DEFINE(@multi_topic, struct @uorb_struct, @(struct_size-padding_end_size), __orb_@(topic_name)_fields, static_cast<uint8_t>(ORB_ID::@multi_topic));
|
||||
@[end for]
|
||||
|
||||
void print_message(const orb_metadata *meta, const @uorb_struct& message)
|
||||
{
|
||||
if (sizeof(message) != meta->o_size) {
|
||||
printf("unexpected message size for %s: %zu != %i\n", meta->o_name, sizeof(message), meta->o_size);
|
||||
return;
|
||||
}
|
||||
orb_print_message_internal(meta, &message, true);
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
@# - file_name_in (String) Source file
|
||||
@# - spec (msggen.MsgSpec) Parsed specification of the .msg file
|
||||
@# - search_path (dict) search paths for genmsg
|
||||
@# - topics (List of String) multi-topic names
|
||||
@# - topics (List of String) topic names
|
||||
@###############################################
|
||||
/****************************************************************************
|
||||
*
|
||||
@@ -52,12 +52,17 @@
|
||||
|
||||
@{
|
||||
import genmsg.msgs
|
||||
import re
|
||||
|
||||
from px_generate_uorb_topic_helper import * # this is in Tools/
|
||||
|
||||
uorb_struct = '%s_s'%spec.short_name
|
||||
uorb_struct_upper = spec.short_name.upper()
|
||||
topic_name = spec.short_name
|
||||
px4_struct = '%s'%name_snake_case
|
||||
uorb_struct = '%s_s'%name_snake_case
|
||||
uorb_struct_upper = name_snake_case.upper()
|
||||
|
||||
sorted_fields = sorted(spec.parsed_fields(), key=sizeof_field_type, reverse=True)
|
||||
struct_size, padding_end_size = add_padding_bytes(sorted_fields, search_path)
|
||||
topic_fields = ["%s %s" % (convert_type(field.type, True), field.name) for field in sorted_fields]
|
||||
}@
|
||||
|
||||
#pragma once
|
||||
@@ -67,6 +72,7 @@ topic_name = spec.short_name
|
||||
@##############################
|
||||
|
||||
#include <uORB/uORB.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@##############################
|
||||
@# Includes for dependencies
|
||||
@@ -77,9 +83,16 @@ for field in spec.parsed_fields():
|
||||
if (not field.is_header):
|
||||
(package, name) = genmsg.names.package_resource_name(field.base_type)
|
||||
package = package or spec.package # convert '' to package
|
||||
|
||||
name = re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
|
||||
print('#include <uORB/topics/%s.h>'%(name))
|
||||
}@
|
||||
|
||||
|
||||
#ifdef __PX4_ROS2
|
||||
namespace px4_embedded {
|
||||
#endif // __PX4_ROS2
|
||||
|
||||
@# Constants c style
|
||||
#ifndef __cplusplus
|
||||
@[for constant in spec.constants]@
|
||||
@@ -124,14 +137,70 @@ for constant in spec.constants:
|
||||
|
||||
print('\tstatic constexpr %s %s = %s;'%(type_px4, constant.name, int(constant.val)))
|
||||
}
|
||||
|
||||
static constexpr char FIELDS[] = "@( ";".join(topic_fields) );";
|
||||
static constexpr size_t SIZE_NO_PADDING = @(struct_size-padding_end_size);
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
/* register this as object request broker structure */
|
||||
@[for multi_topic in topics]@
|
||||
ORB_DECLARE(@multi_topic);
|
||||
@[end for]
|
||||
|
||||
#if defined(__PX4_ROS2)
|
||||
} // namespace px4_embedded
|
||||
|
||||
#include "px4/msg/@(px4_struct).hpp"
|
||||
using @(uorb_struct) = px4::msg::@(spec.short_name);
|
||||
|
||||
inline px4::msg::@(spec.short_name) px4_embedded_to_ros2(const px4_embedded::@(uorb_struct)& msg_in)
|
||||
{
|
||||
px4::msg::@(spec.short_name) msg_out;
|
||||
@{
|
||||
for field in spec.parsed_fields():
|
||||
|
||||
#print(field, field.is_builtin, field.base_type, field.is_array, field.array_len)
|
||||
|
||||
if field.is_builtin and not field.is_array:
|
||||
print(" msg_out.%s = msg_in.%s;" % (field.name, field.name))
|
||||
elif field.is_builtin and field.is_array:
|
||||
print(" std::copy(std::begin(msg_in.%s), std::end(msg_in.%s), msg_out.%s.begin());" % (field.name, field.name, field.name))
|
||||
elif not field.is_builtin:
|
||||
#print(" msg_out.%s = px4_embedded_to_ros2(msg_in.%s);" % (field.name, field.name))
|
||||
print(" // %s.%s not printed" % (name_snake_case, field.name))
|
||||
else:
|
||||
print(" #error %s.%s not printed" % (name_snake_case, field.name))
|
||||
|
||||
}@
|
||||
|
||||
return msg_out;
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
|
||||
# ifdef __cplusplus
|
||||
namespace px4 {
|
||||
namespace msg {
|
||||
using @(spec.short_name) = @(uorb_struct);
|
||||
} // namespace msg
|
||||
} // namespace px4
|
||||
|
||||
namespace px4_embedded {
|
||||
using @(uorb_struct) = @(uorb_struct);
|
||||
}
|
||||
|
||||
# endif
|
||||
|
||||
#endif // PX4_ROS2
|
||||
|
||||
#ifdef __cplusplus
|
||||
void print_message(const orb_metadata *meta, const @uorb_struct& message);
|
||||
|
||||
inline void print_message(const orb_metadata *meta, const @uorb_struct& message)
|
||||
{
|
||||
if (sizeof(message) != meta->o_size) {
|
||||
printf("unexpected message size for %s: %zu != %i\n", meta->o_name, sizeof(message), meta->o_size);
|
||||
return;
|
||||
}
|
||||
orb_print_message_internal(meta, &message, true);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,18 +1,6 @@
|
||||
@###############################################
|
||||
@#
|
||||
@# EmPy template for generating uORBTopics.cpp file
|
||||
@# for logging purposes
|
||||
@#
|
||||
@###############################################
|
||||
@# Start of Template
|
||||
@#
|
||||
@# Context:
|
||||
@# - msgs (List) list of all msg files
|
||||
@# - multi_topics (List) list of all multi-topic names
|
||||
@###############################################
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2013-2021 PX4 Development Team. All rights reserved.
|
||||
* Copyright (C) 2021 PX4 Development Team. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -43,23 +31,23 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <uORB/topics/uORBTopics.hpp>
|
||||
#include <uORB/uORB.h>
|
||||
@{
|
||||
msg_names = [mn.replace(".msg", "") for mn in msgs]
|
||||
msgs_count = len(msg_names)
|
||||
msg_names_all = list(set(msg_names + multi_topics)) # set() filters duplicates
|
||||
msg_names_all.sort()
|
||||
msgs_count_all = len(msg_names_all)
|
||||
}@
|
||||
@[for msg_name in msg_names]@
|
||||
#include <uORB/topics/@(msg_name).h>
|
||||
@[end for]
|
||||
|
||||
#include "uORBTopics.hpp"
|
||||
|
||||
// ORB_DEFINE(action_request, px4::msg::ActionRequest, px4_embedded::action_request_s::SIZE_NO_PADDING, px4_embedded::action_request_s::FIELDS, static_cast<uint8_t>(ORB_ID::action_request));
|
||||
// ORB_DEFINE(actuator_armed, px4::msg::ActuatorArmed, px4_embedded::actuator_armed_s::SIZE_NO_PADDING, px4_embedded::actuator_armed_s::FIELDS, static_cast<uint8_t>(ORB_ID::actuator_armed));
|
||||
|
||||
//const constexpr struct orb_metadata *const uorb_topics_list[ORB_TOPICS_COUNT] = {
|
||||
// ORB_ID(action_request),
|
||||
// ORB_ID(actuator_armed),
|
||||
|
||||
|
||||
|
||||
@PX4_ORB_DEFINE_STR@
|
||||
|
||||
const constexpr struct orb_metadata *const uorb_topics_list[ORB_TOPICS_COUNT] = {
|
||||
@[for idx, msg_name in enumerate(msg_names_all, 1)]@
|
||||
ORB_ID(@(msg_name))@[if idx != msgs_count_all], @[end if]
|
||||
@[end for]
|
||||
@PX4_MSG_TOPIC_ORB_ID@
|
||||
};
|
||||
|
||||
const struct orb_metadata *const *orb_get_topics()
|
||||
|
||||
@@ -57,14 +57,32 @@ msgs_count_all = len(msg_names_all)
|
||||
|
||||
#include <uORB/uORB.h>
|
||||
|
||||
static constexpr size_t ORB_TOPICS_COUNT{@(msgs_count_all)};
|
||||
// TODO: ros2 friendly include paths
|
||||
//#include <uORB/topics/action_request.h>
|
||||
//#include <uORB/topics/actuator_armed.h>
|
||||
|
||||
|
||||
@PX4_ORB_HEADER_INCLUDE_STR@
|
||||
|
||||
static constexpr size_t ORB_TOPICS_COUNT{@PX4_ORB_TOPIC_COUNT@};
|
||||
static constexpr size_t orb_topics_count() { return ORB_TOPICS_COUNT; }
|
||||
|
||||
|
||||
// ORB_DECLARE(action_request);
|
||||
// ORB_DECLARE(actuator_armed);
|
||||
|
||||
@PX4_ORB_DECLARE_STR@
|
||||
|
||||
/*
|
||||
* Returns array of topics metadata
|
||||
*/
|
||||
extern const struct orb_metadata *const *orb_get_topics() __EXPORT;
|
||||
|
||||
|
||||
// enum class ORB_ID : uint8_t {
|
||||
// action_request,
|
||||
// actuator_armed,
|
||||
|
||||
enum class ORB_ID : uint8_t {
|
||||
@[for idx, msg_name in enumerate(msg_names_all)]@
|
||||
@(msg_name) = @(idx),
|
||||
@@ -73,3 +91,18 @@ enum class ORB_ID : uint8_t {
|
||||
};
|
||||
|
||||
const struct orb_metadata *get_orb_meta(ORB_ID id);
|
||||
|
||||
|
||||
static constexpr const char *get_topic_string(ORB_ID orb_id)
|
||||
{
|
||||
switch (orb_id) {
|
||||
//case ORB_ID::action_request: return "action_request";
|
||||
//case ORB_ID::actuator_armed: return "actuator_armed";
|
||||
|
||||
@[for idx, msg_name in enumerate(msg_names_all)]@
|
||||
case @(msg_name): return "@(msg_name)";
|
||||
@[end for]
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user