19#define DEBUG_PRINT_TM 0
20#define IP_DATA_BUFFER_SIZE 80
23namespace traffic_manager {
26using namespace constants::SpeedThreshold;
27using namespace constants::PID;
52 std::lock_guard<std::mutex> lock(
_mutex);
63 std::lock_guard<std::mutex> lock(
_mutex);
71 std::lock_guard<std::mutex> lock(
_mutex);
73 tm.second->SynchronousTick();
80 std::lock_guard<std::mutex> lock(
_mutex);
85 if(tm_ptr !=
nullptr) {
97 auto GetLocalIP = [=](
const uint16_t sport)-> std::pair<std::string, uint16_t> {
98 std::pair<std::string, uint16_t> localIP;
99 int sock = socket(AF_INET, SOCK_DGRAM, 0);
102 std::cout <<
"Error number 1: " << errno << std::endl;
103 std::cout <<
"Error message: " << strerror(errno) << std::endl;
107 sockaddr_in loopback;
108 std::memset(&loopback, 0,
sizeof(loopback));
109 loopback.sin_family = AF_INET;
110 loopback.sin_addr.s_addr = INADDR_LOOPBACK;
111 loopback.sin_port = htons(9);
112 err = connect(sock,
reinterpret_cast<sockaddr*
>(&loopback),
sizeof(loopback));
115 std::cout <<
"Error number 2: " << errno << std::endl;
116 std::cout <<
"Error message: " << strerror(errno) << std::endl;
119 socklen_t addrlen =
sizeof(loopback);
120 err = getsockname(sock,
reinterpret_cast<struct sockaddr*
> (&loopback), &addrlen);
123 std::cout <<
"Error number 3: " << errno << std::endl;
124 std::cout <<
"Error message: " << strerror(errno) << std::endl;
130 localIP = std::pair<std::string, uint16_t>(std::string(buffer), sport);
133 std::cout <<
"Error number 4: " << errno << std::endl;
134 std::cout <<
"Error message: " << strerror(errno) << std::endl;
155 std::pair<std::string, uint16_t> serverTM;
160 longitudinal_highway_param,
162 lateral_highway_param,
163 perc_difference_from_limit,
168 serverTM = GetLocalIP(port);
171 episode_proxy.
Lock()->AddTrafficManagerRunning(serverTM);
175 std::cout <<
"NEW@: Registered TM at "
176 << serverTM.first <<
":"
177 << serverTM.second <<
" ..... SUCCESS."
182 _tm_map.insert(std::make_pair(port, tm_ptr));
192 if(episode_proxy.
Lock()->IsTrafficManagerRunning(port)) {
195 std::pair<std::string, uint16_t> serverTM =
196 episode_proxy.
Lock()->GetTrafficManagerRunning(port);
206 if(tm_ptr !=
nullptr) {
210 std::cout <<
"OLD@: Registered TM at "
211 << serverTM.first <<
":"
212 << serverTM.second <<
" ..... TRY "
219 _tm_map.insert(std::make_pair(port, tm_ptr));
233 std::cout <<
"OLD@: Registered TM at "
234 << serverTM.first <<
":"
235 << serverTM.second <<
" ..... FAILED "
#define SOCK_INVALID_INDEX
#define IP_DATA_BUFFER_SIZE
SharedPtrType Lock() const
与 TryLock 相同,但永远不会返回 nullptr。
virtual void ShutDown()=0
关闭系统。
交通管理器本地类,通过消息传递机制整合交通管理器的各个阶段。 @inherits TrafficManagerBase
远程交通管理器类,通过消息传递机制整合交通管理的各个阶段。
void HealthCheckRemoteTM()
检查服务器是否存活。
static std::map< uint16_t, TrafficManagerBase * > _tm_map
存储交通管理器实例的静态映射表。
void ShutDown()
关闭交通管理器服务或客户端。
static std::mutex _mutex
用于保护_tm_map的静态互斥锁。
TrafficManagerBase * GetTM(uint16_t port) const
根据端口号获取交通管理器实例。
TrafficManager()
默认构造函数,不执行任何操作。
static void Tick()
执行TrafficManager的Tick操作,通常用于周期性地更新状态
static void Release()
释放TrafficManager对象,用于单例模式的清理工作
void CreateTrafficManagerServer(carla::client::detail::EpisodeProxy episode_proxy, uint16_t port)
创建交通管理器服务器。
bool CreateTrafficManagerClient(carla::client::detail::EpisodeProxy episode_proxy, uint16_t port)
创建交通管理器客户端。
static void Reset()
重置TrafficManager对象,用于单例模式的重置操作
uint16_t _port
当前交通管理器实例使用的端口号。
static const std::vector< float > LATERAL_HIGHWAY_PARAM
static const std::vector< float > LONGITUDIAL_PARAM
static const std::vector< float > LONGITUDIAL_HIGHWAY_PARAM
static const std::vector< float > LATERAL_PARAM
static const float INITIAL_PERCENTAGE_SPEED_DIFFERENCE