This commit is contained in:
2025-09-24 10:53:28 +08:00
commit f8e4df77fb
856 changed files with 140098 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
#include <unitree/robot/channel/channel_publisher.hpp>
#include <unitree/common/time/time_tool.hpp>
#include "msg/ArmString_.hpp"
#define TOPIC "rt/arm_Command"
using namespace unitree::robot;
using namespace unitree::common;
int main()
{
ChannelFactory::Instance()->Init(0);
ChannelPublisher<unitree_arm::msg::dds_::ArmString_> publisher(TOPIC);
publisher.InitChannel();
unitree_arm::msg::dds_::ArmString_ msg{};
msg.data_() = "{\"seq\":4,\"address\":1,\"funcode\":7}";
publisher.Write(msg);
return 0;
}

View File

@@ -0,0 +1,41 @@
#include <unitree/robot/channel/channel_subscriber.hpp>
#include <unitree/common/time/time_tool.hpp>
#include "msg/PubServoInfo_.hpp"
#include "msg/ArmString_.hpp"
#define TOPIC "current_servo_angle"
#define TOPIC1 "rt/arm_Feedback"
using namespace unitree::robot;
using namespace unitree::common;
void Handler(const void* msg)
{
const unitree_arm::msg::dds_::PubServoInfo_* pm = (const unitree_arm::msg::dds_::PubServoInfo_*)msg;
std::cout << "servo0_data:" << pm->servo0_data_() << ", servo1_data:" << pm->servo1_data_() << ", servo2_data:" << pm->servo2_data_()<< ", servo3_data:" << pm->servo3_data_()<< ", servo4_data:" << pm->servo4_data_()<< ", servo5_data:" << pm->servo5_data_()<< ", servo6_data:" << pm->servo6_data_() << std::endl;
}
void Handler1(const void* msg)
{
const unitree_arm::msg::dds_::ArmString_* pm = (const unitree_arm::msg::dds_::ArmString_*)msg;
std::cout << "armFeedback_data:" << pm->data_() << std::endl;
}
int main()
{
ChannelFactory::Instance()->Init(0);
ChannelSubscriber<unitree_arm::msg::dds_::PubServoInfo_> subscriber(TOPIC);
subscriber.InitChannel(Handler);
ChannelSubscriber<unitree_arm::msg::dds_::ArmString_> subscriber1(TOPIC1);
subscriber1.InitChannel(Handler1);
while (true)
{
sleep(10);
}
return 0;
}

View File

@@ -0,0 +1,21 @@
#include <unitree/robot/channel/channel_publisher.hpp>
#include <unitree/common/time/time_tool.hpp>
#include "msg/ArmString_.hpp"
#define TOPIC "rt/arm_Command"
using namespace unitree::robot;
using namespace unitree::common;
int main()
{
ChannelFactory::Instance()->Init(0);
ChannelPublisher<unitree_arm::msg::dds_::ArmString_> publisher(TOPIC);
publisher.InitChannel();
unitree_arm::msg::dds_::ArmString_ msg{};
msg.data_() = "{\"seq\":4,\"address\":1,\"funcode\":1,\"data\":{\"id\":5,\"angle\":60,\"delay_ms\":0}}";
publisher.Write(msg);
return 0;
}

View File

@@ -0,0 +1,21 @@
#include <unitree/robot/channel/channel_publisher.hpp>
#include <unitree/common/time/time_tool.hpp>
#include "msg/ArmString_.hpp"
#define TOPIC "rt/arm_Command"
using namespace unitree::robot;
using namespace unitree::common;
int main()
{
ChannelFactory::Instance()->Init(0);
ChannelPublisher<unitree_arm::msg::dds_::ArmString_> publisher(TOPIC);
publisher.InitChannel();
unitree_arm::msg::dds_::ArmString_ msg{};
msg.data_() = "{\"seq\":4,\"address\":1,\"funcode\":5,\"data\":{\"mode\":0}}";
publisher.Write(msg);
return 0;
}

View File

@@ -0,0 +1,53 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: ArmString_.idl
Source: ArmString_.cpp
Cyclone DDS: v0.10.2
*****************************************************************/
#include "ArmString_.hpp"
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::ArmString_>() {
static thread_local std::mutex mtx;
static thread_local propvec props;
static thread_local entity_properties_t *props_end = nullptr;
static thread_local std::atomic_bool initialized {false};
key_endpoint keylist;
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
std::lock_guard<std::mutex> lock(mtx);
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
props.clear();
props.push_back(entity_properties_t(0, 0, false, bb_unset, extensibility::ext_final)); //root
props.push_back(entity_properties_t(1, 0, false, bb_unset, extensibility::ext_final, false)); //::data_
entity_properties_t::finish(props, keylist);
props_end = props.data() + props.size();
initialized.store(true, std::memory_order_release);
return props;
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org

232
arm/src/msg/ArmString_.hpp Normal file
View File

@@ -0,0 +1,232 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: ArmString_.idl
Source: ArmString_.hpp
Cyclone DDS: v0.10.2
*****************************************************************/
#ifndef DDSCXX_ARMSTRING__HPP
#define DDSCXX_ARMSTRING__HPP
#include <string>
namespace unitree_arm
{
namespace msg
{
namespace dds_
{
class ArmString_
{
private:
std::string data__;
public:
ArmString_() = default;
explicit ArmString_(
const std::string& data_) :
data__(data_) { }
const std::string& data_() const { return this->data__; }
std::string& data_() { return this->data__; }
void data_(const std::string& _val_) { this->data__ = _val_; }
void data_(std::string&& _val_) { this->data__ = _val_; }
bool operator==(const ArmString_& _other) const
{
(void) _other;
return data__ == _other.data__;
}
bool operator!=(const ArmString_& _other) const
{
return !(*this == _other);
}
};
}
}
}
#include "dds/topic/TopicTraits.hpp"
#include "org/eclipse/cyclonedds/topic/datatopic.hpp"
namespace org {
namespace eclipse {
namespace cyclonedds {
namespace topic {
template <> constexpr const char* TopicTraits<::unitree_arm::msg::dds_::ArmString_>::getTypeName()
{
return "unitree_arm::msg::dds_::ArmString_";
}
template <> constexpr bool TopicTraits<::unitree_arm::msg::dds_::ArmString_>::isSelfContained()
{
return false;
}
template <> constexpr bool TopicTraits<::unitree_arm::msg::dds_::ArmString_>::isKeyless()
{
return true;
}
} //namespace topic
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
namespace dds {
namespace topic {
template <>
struct topic_type_name<::unitree_arm::msg::dds_::ArmString_>
{
static std::string value()
{
return org::eclipse::cyclonedds::topic::TopicTraits<::unitree_arm::msg::dds_::ArmString_>::getTypeName();
}
};
}
}
REGISTER_TOPIC_TYPE(::unitree_arm::msg::dds_::ArmString_)
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::ArmString_>();
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool write(T& streamer, const ::unitree_arm::msg::dds_::ArmString_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!write_string(streamer, instance.data_(), 0))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool write(S& str, const ::unitree_arm::msg::dds_::ArmString_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::ArmString_>();
str.set_mode(cdr_stream::stream_mode::write, as_key);
return write(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool read(T& streamer, ::unitree_arm::msg::dds_::ArmString_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!read_string(streamer, instance.data_(), 0))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool read(S& str, ::unitree_arm::msg::dds_::ArmString_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::ArmString_>();
str.set_mode(cdr_stream::stream_mode::read, as_key);
return read(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool move(T& streamer, const ::unitree_arm::msg::dds_::ArmString_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!move_string(streamer, instance.data_(), 0))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool move(S& str, const ::unitree_arm::msg::dds_::ArmString_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::ArmString_>();
str.set_mode(cdr_stream::stream_mode::move, as_key);
return move(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool max(T& streamer, const ::unitree_arm::msg::dds_::ArmString_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!max_string(streamer, instance.data_(), 0))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool max(S& str, const ::unitree_arm::msg::dds_::ArmString_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::ArmString_>();
str.set_mode(cdr_stream::stream_mode::max, as_key);
return max(str, instance, props.data());
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
#endif // DDSCXX_ARMSTRING__HPP

View File

@@ -0,0 +1,59 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: PubServoInfo_.idl
Source: PubServoInfo_.cpp
Cyclone DDS: v0.10.2
*****************************************************************/
#include "PubServoInfo_.hpp"
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>() {
static thread_local std::mutex mtx;
static thread_local propvec props;
static thread_local entity_properties_t *props_end = nullptr;
static thread_local std::atomic_bool initialized {false};
key_endpoint keylist;
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
std::lock_guard<std::mutex> lock(mtx);
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
props.clear();
props.push_back(entity_properties_t(0, 0, false, bb_unset, extensibility::ext_final)); //root
props.push_back(entity_properties_t(1, 0, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo0_data_
props.push_back(entity_properties_t(1, 1, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo1_data_
props.push_back(entity_properties_t(1, 2, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo2_data_
props.push_back(entity_properties_t(1, 3, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo3_data_
props.push_back(entity_properties_t(1, 4, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo4_data_
props.push_back(entity_properties_t(1, 5, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo5_data_
props.push_back(entity_properties_t(1, 6, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::servo6_data_
entity_properties_t::finish(props, keylist);
props_end = props.data() + props.size();
initialized.store(true, std::memory_order_release);
return props;
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org

View File

@@ -0,0 +1,459 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: PubServoInfo_.idl
Source: PubServoInfo_.hpp
Cyclone DDS: v0.10.2
*****************************************************************/
#ifndef DDSCXX_PUBSERVOINFO__HPP
#define DDSCXX_PUBSERVOINFO__HPP
namespace unitree_arm
{
namespace msg
{
namespace dds_
{
class PubServoInfo_
{
private:
float servo0_data__ = 0.0f;
float servo1_data__ = 0.0f;
float servo2_data__ = 0.0f;
float servo3_data__ = 0.0f;
float servo4_data__ = 0.0f;
float servo5_data__ = 0.0f;
float servo6_data__ = 0.0f;
public:
PubServoInfo_() = default;
explicit PubServoInfo_(
float servo0_data_,
float servo1_data_,
float servo2_data_,
float servo3_data_,
float servo4_data_,
float servo5_data_,
float servo6_data_) :
servo0_data__(servo0_data_),
servo1_data__(servo1_data_),
servo2_data__(servo2_data_),
servo3_data__(servo3_data_),
servo4_data__(servo4_data_),
servo5_data__(servo5_data_),
servo6_data__(servo6_data_) { }
float servo0_data_() const { return this->servo0_data__; }
float& servo0_data_() { return this->servo0_data__; }
void servo0_data_(float _val_) { this->servo0_data__ = _val_; }
float servo1_data_() const { return this->servo1_data__; }
float& servo1_data_() { return this->servo1_data__; }
void servo1_data_(float _val_) { this->servo1_data__ = _val_; }
float servo2_data_() const { return this->servo2_data__; }
float& servo2_data_() { return this->servo2_data__; }
void servo2_data_(float _val_) { this->servo2_data__ = _val_; }
float servo3_data_() const { return this->servo3_data__; }
float& servo3_data_() { return this->servo3_data__; }
void servo3_data_(float _val_) { this->servo3_data__ = _val_; }
float servo4_data_() const { return this->servo4_data__; }
float& servo4_data_() { return this->servo4_data__; }
void servo4_data_(float _val_) { this->servo4_data__ = _val_; }
float servo5_data_() const { return this->servo5_data__; }
float& servo5_data_() { return this->servo5_data__; }
void servo5_data_(float _val_) { this->servo5_data__ = _val_; }
float servo6_data_() const { return this->servo6_data__; }
float& servo6_data_() { return this->servo6_data__; }
void servo6_data_(float _val_) { this->servo6_data__ = _val_; }
bool operator==(const PubServoInfo_& _other) const
{
(void) _other;
return servo0_data__ == _other.servo0_data__ &&
servo1_data__ == _other.servo1_data__ &&
servo2_data__ == _other.servo2_data__ &&
servo3_data__ == _other.servo3_data__ &&
servo4_data__ == _other.servo4_data__ &&
servo5_data__ == _other.servo5_data__ &&
servo6_data__ == _other.servo6_data__;
}
bool operator!=(const PubServoInfo_& _other) const
{
return !(*this == _other);
}
};
}
}
}
#include "dds/topic/TopicTraits.hpp"
#include "org/eclipse/cyclonedds/topic/datatopic.hpp"
namespace org {
namespace eclipse {
namespace cyclonedds {
namespace topic {
template <> constexpr const char* TopicTraits<::unitree_arm::msg::dds_::PubServoInfo_>::getTypeName()
{
return "unitree_arm::msg::dds_::PubServoInfo_";
}
template <> constexpr bool TopicTraits<::unitree_arm::msg::dds_::PubServoInfo_>::isKeyless()
{
return true;
}
} //namespace topic
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
namespace dds {
namespace topic {
template <>
struct topic_type_name<::unitree_arm::msg::dds_::PubServoInfo_>
{
static std::string value()
{
return org::eclipse::cyclonedds::topic::TopicTraits<::unitree_arm::msg::dds_::PubServoInfo_>::getTypeName();
}
};
}
}
REGISTER_TOPIC_TYPE(::unitree_arm::msg::dds_::PubServoInfo_)
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>();
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool write(T& streamer, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo0_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo1_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo2_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo3_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 4:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo4_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 5:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo5_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 6:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.servo6_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool write(S& str, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>();
str.set_mode(cdr_stream::stream_mode::write, as_key);
return write(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool read(T& streamer, ::unitree_arm::msg::dds_::PubServoInfo_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo0_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo1_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo2_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo3_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 4:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo4_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 5:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo5_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 6:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.servo6_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool read(S& str, ::unitree_arm::msg::dds_::PubServoInfo_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>();
str.set_mode(cdr_stream::stream_mode::read, as_key);
return read(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool move(T& streamer, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo0_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo1_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo2_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo3_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 4:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo4_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 5:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo5_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 6:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.servo6_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool move(S& str, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>();
str.set_mode(cdr_stream::stream_mode::move, as_key);
return move(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool max(T& streamer, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo0_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo1_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo2_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo3_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 4:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo4_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 5:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo5_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 6:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.servo6_data_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool max(S& str, const ::unitree_arm::msg::dds_::PubServoInfo_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::PubServoInfo_>();
str.set_mode(cdr_stream::stream_mode::max, as_key);
return max(str, instance, props.data());
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
#endif // DDSCXX_PUBSERVOINFO__HPP

View File

@@ -0,0 +1,56 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: SetServoAngle_.idl
Source: SetServoAngle_.cpp
Cyclone DDS: v0.10.2
*****************************************************************/
#include "SetServoAngle_.hpp"
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>() {
static thread_local std::mutex mtx;
static thread_local propvec props;
static thread_local entity_properties_t *props_end = nullptr;
static thread_local std::atomic_bool initialized {false};
key_endpoint keylist;
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
std::lock_guard<std::mutex> lock(mtx);
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
props.clear();
props.push_back(entity_properties_t(0, 0, false, bb_unset, extensibility::ext_final)); //root
props.push_back(entity_properties_t(1, 0, false, get_bit_bound<int32_t>(), extensibility::ext_final, false)); //::seq_
props.push_back(entity_properties_t(1, 1, false, get_bit_bound<uint8_t>(), extensibility::ext_final, false)); //::id_
props.push_back(entity_properties_t(1, 2, false, get_bit_bound<float>(), extensibility::ext_final, false)); //::angle_
props.push_back(entity_properties_t(1, 3, false, get_bit_bound<int16_t>(), extensibility::ext_final, false)); //::delay_ms_
entity_properties_t::finish(props, keylist);
props_end = props.data() + props.size();
initialized.store(true, std::memory_order_release);
return props;
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org

View File

@@ -0,0 +1,343 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: SetServoAngle_.idl
Source: SetServoAngle_.hpp
Cyclone DDS: v0.10.2
*****************************************************************/
#ifndef DDSCXX_SETSERVOANGLE__HPP
#define DDSCXX_SETSERVOANGLE__HPP
#include <cstdint>
namespace unitree_arm
{
namespace msg
{
namespace dds_
{
class SetServoAngle_
{
private:
int32_t seq__ = 0;
uint8_t id__ = 0;
float angle__ = 0.0f;
int16_t delay_ms__ = 0;
public:
SetServoAngle_() = default;
explicit SetServoAngle_(
int32_t seq_,
uint8_t id_,
float angle_,
int16_t delay_ms_) :
seq__(seq_),
id__(id_),
angle__(angle_),
delay_ms__(delay_ms_) { }
int32_t seq_() const { return this->seq__; }
int32_t& seq_() { return this->seq__; }
void seq_(int32_t _val_) { this->seq__ = _val_; }
uint8_t id_() const { return this->id__; }
uint8_t& id_() { return this->id__; }
void id_(uint8_t _val_) { this->id__ = _val_; }
float angle_() const { return this->angle__; }
float& angle_() { return this->angle__; }
void angle_(float _val_) { this->angle__ = _val_; }
int16_t delay_ms_() const { return this->delay_ms__; }
int16_t& delay_ms_() { return this->delay_ms__; }
void delay_ms_(int16_t _val_) { this->delay_ms__ = _val_; }
bool operator==(const SetServoAngle_& _other) const
{
(void) _other;
return seq__ == _other.seq__ &&
id__ == _other.id__ &&
angle__ == _other.angle__ &&
delay_ms__ == _other.delay_ms__;
}
bool operator!=(const SetServoAngle_& _other) const
{
return !(*this == _other);
}
};
}
}
}
#include "dds/topic/TopicTraits.hpp"
#include "org/eclipse/cyclonedds/topic/datatopic.hpp"
namespace org {
namespace eclipse {
namespace cyclonedds {
namespace topic {
template <> constexpr const char* TopicTraits<::unitree_arm::msg::dds_::SetServoAngle_>::getTypeName()
{
return "unitree_arm::msg::dds_::SetServoAngle_";
}
template <> constexpr bool TopicTraits<::unitree_arm::msg::dds_::SetServoAngle_>::isKeyless()
{
return true;
}
} //namespace topic
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
namespace dds {
namespace topic {
template <>
struct topic_type_name<::unitree_arm::msg::dds_::SetServoAngle_>
{
static std::string value()
{
return org::eclipse::cyclonedds::topic::TopicTraits<::unitree_arm::msg::dds_::SetServoAngle_>::getTypeName();
}
};
}
}
REGISTER_TOPIC_TYPE(::unitree_arm::msg::dds_::SetServoAngle_)
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>();
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool write(T& streamer, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.angle_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.delay_ms_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool write(S& str, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>();
str.set_mode(cdr_stream::stream_mode::write, as_key);
return write(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool read(T& streamer, ::unitree_arm::msg::dds_::SetServoAngle_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.angle_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.delay_ms_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool read(S& str, ::unitree_arm::msg::dds_::SetServoAngle_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>();
str.set_mode(cdr_stream::stream_mode::read, as_key);
return read(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool move(T& streamer, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.angle_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.delay_ms_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool move(S& str, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>();
str.set_mode(cdr_stream::stream_mode::move, as_key);
return move(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool max(T& streamer, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.angle_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 3:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.delay_ms_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool max(S& str, const ::unitree_arm::msg::dds_::SetServoAngle_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoAngle_>();
str.set_mode(cdr_stream::stream_mode::max, as_key);
return max(str, instance, props.data());
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
#endif // DDSCXX_SETSERVOANGLE__HPP

View File

@@ -0,0 +1,55 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: SetServoDumping_.idl
Source: SetServoDumping_.cpp
Cyclone DDS: v0.10.2
*****************************************************************/
#include "SetServoDumping_.hpp"
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>() {
static thread_local std::mutex mtx;
static thread_local propvec props;
static thread_local entity_properties_t *props_end = nullptr;
static thread_local std::atomic_bool initialized {false};
key_endpoint keylist;
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
std::lock_guard<std::mutex> lock(mtx);
if (initialized.load(std::memory_order_relaxed)) {
auto ptr = props.data();
while (ptr < props_end)
(ptr++)->is_present = false;
return props;
}
props.clear();
props.push_back(entity_properties_t(0, 0, false, bb_unset, extensibility::ext_final)); //root
props.push_back(entity_properties_t(1, 0, false, get_bit_bound<int32_t>(), extensibility::ext_final, false)); //::seq_
props.push_back(entity_properties_t(1, 1, false, get_bit_bound<uint8_t>(), extensibility::ext_final, false)); //::id_
props.push_back(entity_properties_t(1, 2, false, get_bit_bound<uint16_t>(), extensibility::ext_final, false)); //::power_
entity_properties_t::finish(props, keylist);
props_end = props.data() + props.size();
initialized.store(true, std::memory_order_release);
return props;
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org

View File

@@ -0,0 +1,304 @@
/****************************************************************
Generated by Eclipse Cyclone DDS IDL to CXX Translator
File name: SetServoDumping_.idl
Source: SetServoDumping_.hpp
Cyclone DDS: v0.10.2
*****************************************************************/
#ifndef DDSCXX_SETSERVODUMPING__HPP
#define DDSCXX_SETSERVODUMPING__HPP
#include <cstdint>
namespace unitree_arm
{
namespace msg
{
namespace dds_
{
class SetServoDumping_
{
private:
int32_t seq__ = 0;
uint8_t id__ = 0;
uint16_t power__ = 0;
public:
SetServoDumping_() = default;
explicit SetServoDumping_(
int32_t seq_,
uint8_t id_,
uint16_t power_) :
seq__(seq_),
id__(id_),
power__(power_) { }
int32_t seq_() const { return this->seq__; }
int32_t& seq_() { return this->seq__; }
void seq_(int32_t _val_) { this->seq__ = _val_; }
uint8_t id_() const { return this->id__; }
uint8_t& id_() { return this->id__; }
void id_(uint8_t _val_) { this->id__ = _val_; }
uint16_t power_() const { return this->power__; }
uint16_t& power_() { return this->power__; }
void power_(uint16_t _val_) { this->power__ = _val_; }
bool operator==(const SetServoDumping_& _other) const
{
(void) _other;
return seq__ == _other.seq__ &&
id__ == _other.id__ &&
power__ == _other.power__;
}
bool operator!=(const SetServoDumping_& _other) const
{
return !(*this == _other);
}
};
}
}
}
#include "dds/topic/TopicTraits.hpp"
#include "org/eclipse/cyclonedds/topic/datatopic.hpp"
namespace org {
namespace eclipse {
namespace cyclonedds {
namespace topic {
template <> constexpr const char* TopicTraits<::unitree_arm::msg::dds_::SetServoDumping_>::getTypeName()
{
return "unitree_arm::msg::dds_::SetServoDumping_";
}
template <> constexpr bool TopicTraits<::unitree_arm::msg::dds_::SetServoDumping_>::isKeyless()
{
return true;
}
} //namespace topic
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
namespace dds {
namespace topic {
template <>
struct topic_type_name<::unitree_arm::msg::dds_::SetServoDumping_>
{
static std::string value()
{
return org::eclipse::cyclonedds::topic::TopicTraits<::unitree_arm::msg::dds_::SetServoDumping_>::getTypeName();
}
};
}
}
REGISTER_TOPIC_TYPE(::unitree_arm::msg::dds_::SetServoDumping_)
namespace org{
namespace eclipse{
namespace cyclonedds{
namespace core{
namespace cdr{
template<>
propvec &get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>();
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool write(T& streamer, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!write(streamer, instance.power_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool write(S& str, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>();
str.set_mode(cdr_stream::stream_mode::write, as_key);
return write(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool read(T& streamer, ::unitree_arm::msg::dds_::SetServoDumping_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!read(streamer, instance.power_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool read(S& str, ::unitree_arm::msg::dds_::SetServoDumping_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>();
str.set_mode(cdr_stream::stream_mode::read, as_key);
return read(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool move(T& streamer, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!move(streamer, instance.power_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool move(S& str, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>();
str.set_mode(cdr_stream::stream_mode::move, as_key);
return move(str, instance, props.data());
}
template<typename T, std::enable_if_t<std::is_base_of<cdr_stream, T>::value, bool> = true >
bool max(T& streamer, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, entity_properties_t *props) {
(void)instance;
if (!streamer.start_struct(*props))
return false;
auto prop = streamer.first_entity(props);
while (prop) {
switch (prop->m_id) {
case 0:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.seq_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 1:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.id_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
case 2:
if (!streamer.start_member(*prop))
return false;
if (!max(streamer, instance.power_()))
return false;
if (!streamer.finish_member(*prop))
return false;
break;
}
prop = streamer.next_entity(prop);
}
return streamer.finish_struct(*props);
}
template<typename S, std::enable_if_t<std::is_base_of<cdr_stream, S>::value, bool> = true >
bool max(S& str, const ::unitree_arm::msg::dds_::SetServoDumping_& instance, bool as_key) {
auto &props = get_type_props<::unitree_arm::msg::dds_::SetServoDumping_>();
str.set_mode(cdr_stream::stream_mode::max, as_key);
return max(str, instance, props.data());
}
} //namespace cdr
} //namespace core
} //namespace cyclonedds
} //namespace eclipse
} //namespace org
#endif // DDSCXX_SETSERVODUMPING__HPP

View File

@@ -0,0 +1,21 @@
#include <unitree/robot/channel/channel_publisher.hpp>
#include <unitree/common/time/time_tool.hpp>
#include "msg/ArmString_.hpp"
#define TOPIC "rt/arm_Command"
using namespace unitree::robot;
using namespace unitree::common;
int main()
{
ChannelFactory::Instance()->Init(0);
ChannelPublisher<unitree_arm::msg::dds_::ArmString_> publisher(TOPIC);
publisher.InitChannel();
unitree_arm::msg::dds_::ArmString_ msg{};
msg.data_() = "{\"seq\":4,\"address\":1,\"funcode\":2,\"data\":{\"mode\":1,\"angle0\":0,\"angle1\":-60,\"angle2\":60,\"angle3\":0,\"angle4\":30,\"angle5\":0,\"angle6\":0}}";
publisher.Write(msg);
return 0;
}