CARLA
 
载入中...
搜索中...
未找到
CarlaSubscriberListener.cpp
浏览该文件的文档.
1#define _GLIBCXX_USE_CXX11_ABI 0
2// 定义宏,指定使用 C++11 ABI 的版本为 0
3
5#include <iostream>
6// 包含头文件,用于输入输出流
7#include <fastdds/dds/subscriber/DataReader.hpp>
8// 包含 Fast DDS 的数据读取器头文件
9#include <fastdds/dds/subscriber/DataReaderListener.hpp>
10// 包含 Fast DDS 的数据读取器监听器头文件
11#include <fastdds/dds/core/status/SubscriptionMatchedStatus.hpp>
12// 包含 Fast DDS 的订阅匹配状态头文件
13#include <fastdds/dds/subscriber/SampleInfo.hpp>
14// 包含 Fast DDS 的样本信息头文件
16// 包含 Carla 和 ROS2 之间的自定义消息类型头文件,用于自动驾驶车辆控制
18// 包含 Carla 和 ROS2 的订阅者相关头文件
20// 包含 Carla 和 ROS2 的回调数据头文件
21
22namespace carla {
23namespace ros2 {
24
25 namespace efd = eprosima::fastdds::dds;
26 // 为 eprosima::fastdds::dds 命名空间定义别名 efd
27 using erc = eprosima::fastrtps::types::ReturnCode_t;
28 // 定义类型别名 erc,表示 eprosima::fastrtps 的返回码类型
29
31 public:
33 efd::DataReader* reader,
34 const efd::SubscriptionMatchedStatus& info);
35 // 声明订阅匹配时的回调函数
36 void on_data_available(efd::DataReader* reader);
37 // 声明数据可用时的回调函数
38
39 int _matched {0};
40 // 匹配的数量初始化为 0
41 bool _first_connected {false};
42 // 表示是否首次连接的标志初始化为 false
44 // 指向订阅者的指针初始化为 nullptr
46 // 用于存储接收到的消息
47 };
48
49 void CarlaSubscriberListenerImpl::on_subscription_matched(efd::DataReader* reader, const efd::SubscriptionMatchedStatus& info)
50 {
51 if (info.current_count_change == 1) {
52 _matched = info.total_count;
53 _first_connected = true;
54 // 如果当前匹配数量变化为 1,更新匹配数量并设置首次连接标志为 true
55 } else if (info.current_count_change == -1) {
56 _matched = info.total_count;
57 if (_matched == 0) {
59 // 如果当前匹配数量变化为 -1,更新匹配数量,若匹配数量为 0,则销毁订阅者
60 }
61 } else {
62 std::cerr << info.current_count_change
63 << " is not a valid value for PublicationMatchedStatus current count change" << std::endl;
64 // 如果当前匹配数量变化不是 1 或 -1,则输出错误信息
65 }
66 }
67
69 {
70 efd::SampleInfo info;
71 // 定义样本信息对象
72 eprosima::fastrtps::types::ReturnCode_t rcode = reader->take_next_sample(&_message, &info);
73 // 从数据读取器中获取下一个样本,并存储在消息对象和样本信息对象中
74
75 if (rcode == erc::ReturnCodeValue::RETCODE_OK) {
76 VehicleControl control;
77 control.throttle = _message.throttle();
78 control.steer = _message.steer();
79 control.brake = _message.brake();
80 control.hand_brake = _message.hand_brake();
81 control.reverse = _message.reverse();
82 control.gear = _message.gear();
84 _owner->ForwardMessage(control);
85 // 如果返回码为 RETCODE_OK,表示成功获取样本,将消息中的控制信息提取出来并转发给订阅者的所有者
86 }
87 if (rcode == erc::ReturnCodeValue::RETCODE_ERROR) {
88 std::cerr << "RETCODE_ERROR" << std::endl;
89 // 如果返回码为 RETCODE_ERROR,输出错误信息
90 }
91 if (rcode == erc::ReturnCodeValue::RETCODE_UNSUPPORTED) {
92 std::cerr << "RETCODE_UNSUPPORTED" << std::endl;
93 // 如果返回码为 RETCODE_UNSUPPORTED,输出错误信息
94 }
95 if (rcode == erc::ReturnCodeValue::RETCODE_BAD_PARAMETER) {
96 std::cerr << "RETCODE_BAD_PARAMETER" << std::endl;
97 // 如果返回码为 RETCODE_BAD_PARAMETER,输出错误信息
98 }
99 if (rcode == erc::ReturnCodeValue::RETCODE_PRECONDITION_NOT_MET) {
100 std::cerr << "RETCODE_PRECONDITION_NOT_MET" << std::endl;
101 // 如果返回码为 RETCODE_PRECONDITION_NOT_MET,输出错误信息
102 }
103 if (rcode == erc::ReturnCodeValue::RETCODE_OUT_OF_RESOURCES) {
104 std::cerr << "RETCODE_OUT_OF_RESOURCES" << std::endl;
105 // 如果返回码为 RETCODE_OUT_OF_RESOURCES,输出错误信息
106 }
107 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ENABLED) {
108 std::cerr << "RETCODE_NOT_ENABLED" << std::endl;
109 // 如果返回码为 RETCODE_NOT_ENABLED,输出错误信息
110 }
111 if (rcode == erc::ReturnCodeValue::RETCODE_IMMUTABLE_POLICY) {
112 std::cerr << "RETCODE_IMMUTABLE_POLICY" << std::endl;
113 // 如果返回码为 RETCODE_IMMUTABLE_POLICY,输出错误信息
114 }
115 if (rcode == erc::ReturnCodeValue::RETCODE_INCONSISTENT_POLICY) {
116 std::cerr << "RETCODE_INCONSISTENT_POLICY" << std::endl;
117 // 如果返回码为 RETCODE_INCONSISTENT_POLICY,输出错误信息
118 }
119 if (rcode == erc::ReturnCodeValue::RETCODE_ALREADY_DELETED) {
120 std::cerr << "RETCODE_ALREADY_DELETED" << std::endl;
121 // 如果返回码为 RETCODE_ALREADY_DELETED,输出错误信息
122 }
123 if (rcode == erc::ReturnCodeValue::RETCODE_TIMEOUT) {
124 std::cerr << "RETCODE_TIMEOUT" << std::endl;
125 // 如果返回码为 RETCODE_TIMEOUT,输出错误信息
126 }
127 if (rcode == erc::ReturnCodeValue::RETCODE_NO_DATA) {
128 std::cerr << "RETCODE_NO_DATA" << std::endl;
129 // 如果返回码为 RETCODE_NO_DATA,输出错误信息
130 }
131 if (rcode == erc::ReturnCodeValue::RETCODE_ILLEGAL_OPERATION) {
132 std::cerr << "RETCODE_ILLEGAL_OPERATION" << std::endl;
133 // 如果返回码为 RETCODE_ILLEGAL_OPERATION,输出错误信息
134 }
135 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ALLOWED_BY_SECURITY) {
136 std::cerr << "RETCODE_NOT_ALLOWED_BY_SECURITY" << std::endl;
137 // 如果返回码为 RETCODE_NOT_ALLOWED_BY_SECURITY,输出错误信息
138 }
139 }
140
142 _impl->_owner = owner;
143 // 设置监听器的所有者为给定的订阅者
144 }
145
147 _impl(std::make_unique<CarlaSubscriberListenerImpl>()) {
148 _impl->_owner = owner;
149 // 构造函数,创建监听器实现对象,并设置所有者为给定的订阅者
150 }
151
153 // 析构函数
154
155}}
CarlaEgoVehicleControlSubscriber类,用于订阅并处理来自ROS2的自动驾驶车辆控制消息
void ForwardMessage(VehicleControl control)
(内部使用)将控制消息转发给内部处理函数。
void DestroySubscriber()
销毁用户并释放相关资源。
CarlaSubscriberListener的内部实现类,用于隐藏实现细节。
CarlaEgoVehicleControlSubscriber * _owner
void on_subscription_matched(efd::DataReader *reader, const efd::SubscriptionMatchedStatus &info)
carla_msgs::msg::CarlaEgoVehicleControl _message
~CarlaSubscriberListener()
析构函数,清理资源并释放内部实现。
std::unique_ptr< CarlaSubscriberListenerImpl > _impl
指向内部实现类的指针。
void SetOwner(CarlaEgoVehicleControlSubscriber *owner)
设置此监听器的所有者。
CarlaSubscriberListener(CarlaEgoVehicleControlSubscriber *owner)
构造函数,初始化CarlaSubscriberListener并设置其所有者。
该类表示用户在 IDL 文件中定义的结构 CarlaEgoVehicleControl。 <>
eProsima_user_DllExport void reverse(bool _reverse)
该函数设置成员 reverse 的值。
eProsima_user_DllExport void hand_brake(bool _hand_brake)
该函数设置成员 hand_brake 的值。
eProsima_user_DllExport void brake(float _brake)
该函数设置成员 brake 的值。
eProsima_user_DllExport void throttle(float _throttle)
该函数设置成员 throttle 的值。
eProsima_user_DllExport void gear(int32_t _gear)
该函数设置成员 gear 的值。
eProsima_user_DllExport void manual_gear_shift(bool _manual_gear_shift)
该函数设置成员 manual_gear_shift 的值。
eProsima_user_DllExport void steer(float _steer)
该函数设置成员 steer 的值。
eprosima::fastrtps::types::ReturnCode_t erc
@using erc
CARLA模拟器的主命名空间。
Definition Carla.cpp:139