Newer
Older
/* -*- 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>
*/
#include "traci-vehicle.h"
#include "ns3/log.h"
NS_LOG_COMPONENT_DEFINE("TraCiVehicle");
namespace ns3 {
namespace traci {
Vehicle::Vehicle (Ptr<TraCi> traci, std::string id)
: m_traci (traci), m_id (id),
m_position (m_traci, id),
m_length (m_traci, id), m_width (m_traci, id), m_height (m_traci, id),
m_speed (m_traci, id), m_speed_lateral (m_traci, id), m_maxSpeed (m_traci, id),
m_heading (m_traci, id), m_acceleration (m_traci, id),
m_lane_idx (m_traci, id), m_road_id (m_traci, id), m_color (m_traci, id)
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
{
}
std::string
Vehicle::GetId () const
{
return m_id;
}
Ptr<TraCi>
Vehicle::GetTraCi () const
{
return m_traci;
}
void
Vehicle::SetNode (Ptr<Node> node)
{
m_node = node;
}
Ptr<Node>
Vehicle::GetNode () const
{
return m_node;
}
Vector
Vehicle::GetPosition (bool forceReload) const
{
// Note: This is ok for now since Position3D is just a typedef for Vector.
// If it changes some day, the compiler should complain.
return m_position.GetValue (forceReload);
}
Vector2D
Vehicle::GetPosition2d (bool forceReload) const
{
// we reuse the 3D position here
Vector pos = GetPosition (forceReload);
return Vector2D (pos.x, pos.y);
}
Vector
Vehicle::GetCenterPosition (bool forceReload) const
{
return ShiftPosition (
GetPosition (forceReload),
GetHeading (forceReload),
-GetLength (forceReload) / 2.0);
}
double
Vehicle::GetLength (bool forceReload) const
{
return m_length.GetValue (forceReload);
}
double
Vehicle::GetWidth (bool forceReload) const
{
return m_width.GetValue (forceReload);
}
double
Vehicle::GetHeight (bool forceReload) const
{
return m_height.GetValue (forceReload);
}
double
Vehicle::GetSpeed (bool forceReload) const
{
return m_speed.GetValue (forceReload);
}
double
Vehicle::GetMaxSpeed (bool forceReload) const
{
return m_maxSpeed.GetValue (forceReload);
}
double
Vehicle::GetSpeedLateral (bool forceReload) const
{
return m_speed_lateral.GetValue (forceReload);
}
Heading
Vehicle::GetHeading (bool forceReload) const
{
return Heading (m_heading.GetValue (forceReload));
}
Vector
Vehicle::GetVelocity (bool forceReload) const
{
double speed = GetSpeed (forceReload);
Heading heading = GetHeading (forceReload);
return VelocityFromSpeedHeading (speed, heading);
}
double
Vehicle::GetAcceleration (bool forceReload) const
{
return m_acceleration.GetValue (forceReload);
}
int
Vehicle::GetLaneIndex (bool forceReload) const
{
return m_lane_idx.GetValue (forceReload);
}
std::string
Vehicle::GetRoadID (bool forceReload) const
{
return m_road_id.GetValue (forceReload);
}
Color
Vehicle::GetColor (bool forceReload) const
{
return m_color.GetValue (forceReload);
}
void
Vehicle::SetColor (const Color& color)
{
SetVariable (libsumo::VAR_COLOR, color);
void
Vehicle::changeLane (int laneID,
double duration)
{
NS_LOG_INFO("TraCiVehicle: Sending ChangeLane to vehicle "+m_id+" : lane = "+std::to_string(laneID)+" duration = "+std::to_string(duration));
traci::Byte lane = (traci::Byte)laneID;
traci::command::ChangeLane my_command(m_id, lane, duration);
traci::result::NoResult my_result;
m_traci->ExecuteCommand (my_command, my_result);
}
void
Vehicle::setSpeed (double speed)
{
NS_LOG_INFO("TraCiVehicle: Sending SetSpeed to vehicle "+m_id+" : speed = "+std::to_string(speed));
traci::command::SetSpeed my_command(m_id, speed);
traci::result::NoResult my_result;
m_traci->ExecuteCommand (my_command, my_result);
}
void
Vehicle::setMaxSpeedLateral (double max_speed)
{
NS_LOG_INFO("TraCiVehicle: Sending SetMaxSpeedLateral to vehicle "+m_id+" : max_speed = "+std::to_string(max_speed));
traci::command::SetMaxSpeedLateral my_command(m_id, max_speed);
traci::result::NoResult my_result;
m_traci->ExecuteCommand (my_command, my_result);
}
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
void
Vehicle::slowDown (double speed, double duration)
{
NS_LOG_INFO("TraCiVehicle: Sending SlowDown to vehicle "+m_id+" : speed = "+std::to_string(speed)+" duration = "+std::to_string(duration));
traci::command::SlowDown my_command(m_id, speed, duration);
traci::result::NoResult my_result;
m_traci->ExecuteCommand (my_command, my_result);
}
void
Vehicle::moveToXY (std::string edgeID, int laneID, double x, double y, double angle)
{
if (angle < -360.0)
{
angle = libsumo::INVALID_DOUBLE_VALUE;
NS_LOG_INFO("TraCiVehicle: Sending MoveToXY to vehicle "+m_id+" : edge = "+edgeID+" lane = "+std::to_string(laneID)+" x = "+std::to_string(x)+" y = "+std::to_string(y));
}
else
{
if (angle < 0) angle += 360.0;
NS_LOG_INFO("TraCiVehicle: Sending MoveToXY to vehicle "+m_id+" : edge = "+edgeID+" lane = "+std::to_string(laneID)+" x = "+std::to_string(x)+" y = "+std::to_string(y)+" angle = "+std::to_string(angle));
}
traci::command::MoveToXY my_command(m_id, edgeID, laneID, x, y, angle);
traci::result::NoResult my_result;
m_traci->ExecuteCommand (my_command, my_result);
}