Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2017 Fraunhofer ESK
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Karsten Roscher <karsten.roscher@esk.fraunhofer.de>
*/
#ifndef TRACI_VEHICLE_H
#define TRACI_VEHICLE_H
#include <tuple>
#include <ns3/node.h>
#include <ns3/simple-ref-count.h>
#include <ns3/vector.h>
#include <ns3/assert.h>
#include "traci.h"
#include "traci-types.h"
#include "traci-cached-variable.h"
namespace ns3
{
namespace traci
{
/*!
* @brief Class representing a single vehicle on the TraCI host.
*
* This class will cache all values to reduce the network traffic if
* values are required multiple times at different places.
*/
class Vehicle : public SimpleRefCount<Vehicle>
{
public:
/*!
* @brief Create a new vehicle with the provided id.
* @param traci Link to the TraCI host
* @param id Id of the object on the TraCI host
*/
Vehicle (Ptr<TraCi> traci, std::string id);
/*!
* @brief Get the id of the object
* @return Id of the object
*/
std::string
GetId () const;
/*!
* @brief Get the assigned traci instance
* @return Traci instance used
*/
Ptr<TraCi>
GetTraCi () const;
/*!
* @brief Set the node this vehicle is attached to
* @param node Node the vehicle is attached to
*/
void
SetNode (Ptr<Node> node);
/*!
* @brief Get the node this vehicle is attached to (if any)
* @return Pointer to the node this vehicle is attached to, null if not attached
*/
Ptr<Node>
GetNode () const;
/*
* Specific value getters
*/
/*!
* @brief Get the position of the object (center of front bumper)
* @param forceReload Force reload from the TraCI host if true
* @return Position of the object
*/
Vector
GetPosition (bool forceReload = false) const;
//! Get the 2D position of the object (center of front bumper)
Vector2D
GetPosition2d (bool forceReload = false) const;
/*!
* @brief Get the position of the vehicle center
*
* The center will be calculated in x/y dimensions, the z coordinate
* is left untouched
*
* @param forceReload Force reload from TraCI host if true
* @return Position of the vehicle center
*/
Vector
GetCenterPosition (bool forceReload = false) const;
//! Get length in meters
double
GetLength (bool forceReload = false) const;
//! Get width in meters
double
GetWidth (bool forceReload = false) const;
//! Get height in meters
double
GetHeight (bool forceReload = false) const;
//! Get speed in m/s
double
GetSpeed (bool forceReload = false) const;
//! Get max speed in m/s
double
GetMaxSpeed (bool forceReload = false) const;
//! Get lateral speed in m/s
double
GetSpeedLateral (bool forceReload = false) const;
//! Get current heading
Heading
GetHeading (bool forceReload = false) const;
//! Get velocity vector
Vector
GetVelocity (bool forceReload = false) const;
//! Get current acceleration
double
GetAcceleration (bool forceReload = false) const;
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
Color
GetColor (bool forceReload = false) const;
/*
* Specific value setters
*/
void
SetColor (const Color& color);
/*
* Generic get/set
*/
/*!
* @brief Get the value of a vehicle variable from the TraCI host.
*
* This is a fallback method if no specific Get* method is available.
*
* @param variable Variable code for the request.
* @tparam Expected return type.
*
* @return Requested variable value.
*
* @throw ...
*/
template<typename ResultType>
ResultType
GetVariable (int variable);
/*!
* @brief Set the value of a vehicle variable with the TraCI host.
*
* This is a fallback method if no specific Set* method is available.
*
* @param variable Variable code for the request
* @param value Variable content for the request
* @param type Identifier of the data type (optional, if omitted default for template type is used)
* @tparam Type of the variable
*
* @throw ...
*/
template<typename VariableType>
void
SetVariable (int variable, VariableType value);
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/*!
* @brief change lane of the specified vehicle over given duration.
*
* Parameters:
* - ID of the lange to change to
* - duration for the change
*/
void
changeLane (int laneID, double duration);
/*!
* @brief set speed of the specified vehicle.
*
* Parameters:
* - new speed to set
*/
void
setSpeed (double speed);
/*!
* @brief gradually change the speed over given duration.
*
* Parameters:
* - new speed to set
* - duration for the change
*/
void
slowDown (double speed, double duration);
/*!
* @brief set new position for vehicle.
*
* Parameters:
* - ID of the road
* - ID of the lange to change to
* - x coordinate
* - y coordinate
* - angle (if default value, then use the angle of the edge)
*/
void
moveToXY (std::string edgeID, int laneID, double x, double y, double angle=-1000000.0);
private:
Ptr<TraCi> m_traci; // link to the traci instance
std::string m_id; // id of the object
Ptr<Node> m_node; // node this vehicle is attached to
// Cached variables
CachedVariable<Position3D, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_POSITION3D> m_position;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_LENGTH, true> m_length;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_WIDTH, true> m_width;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_HEIGHT, true> m_height;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_SPEED> m_speed;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_SPEED_LAT> m_speed_lateral;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_MAXSPEED> m_maxSpeed;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_ANGLE> m_heading;
CachedVariable<double, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_ACCELERATION> m_acceleration;
CachedVariable<Color, libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_COLOR> m_color;
};
/*
* Implementation of the template based methods
*/
template<typename ResultType>
ResultType
Vehicle::GetVariable (int variable)
{
NS_ASSERT (m_traci);
return m_traci->GetVariable<ResultType>(libsumo::CMD_GET_VEHICLE_VARIABLE, variable, m_id);
}
template<typename VariableType>
void
Vehicle::SetVariable (int variable, VariableType value)
{
NS_ASSERT (m_traci);
m_traci->SetVariable<VariableType>(libsumo::CMD_SET_VEHICLE_VARIABLE, variable, value, m_id);