1#include "rclcpp/rclcpp.hpp"
5#include <condition_variable>
11#include "geometry_msgs/msg/transform_stamped.hpp"
12#include "rosgraph_msgs/msg/clock.h"
13#include <geometry_msgs/msg/twist_with_covariance_stamped.hpp>
14#include "custom_interfaces/msg/vehicle_state_vector.hpp"
15#include <sensor_msgs/msg/imu.hpp>
16#include <tf2/LinearMath/Quaternion.h>
17#include <tf2_ros/static_transform_broadcaster.h>
18#include <tf2_ros/transform_broadcaster.h>
22#include "sensor_msgs/msg/joint_state.hpp"
23#include "visualization_msgs/msg/marker_array.hpp"
35#include <rosgraph_msgs/msg/clock.hpp>
39#include "pacsim/msg/perception_detections.hpp"
40#include "pacsim/msg/stamped_scalar.hpp"
41#include "pacsim/msg/wheels.hpp"
42#include "pacsim/srv/clock_trigger_absolute.hpp"
43#include "pacsim/srv/clock_trigger_relative.hpp"
48#include "std_srvs/srv/empty.hpp"
60std::shared_ptr<rclcpp::executors::SingleThreadedExecutor>
executor;
61std::shared_ptr<IVehicleModel>
model;
64rclcpp::Publisher<rosgraph_msgs::msg::Clock>::SharedPtr
clockPub;
65rclcpp::Publisher<geometry_msgs::msg::TwistWithCovarianceStamped>::SharedPtr
velocity_pub;
66rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr
imu_pub;
67rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr
mapVizPub;
73rclcpp::Publisher<pacsim::msg::Wheels>::SharedPtr
torquesPub;
76rclcpp::Publisher<geometry_msgs::msg::TwistWithCovarianceStamped>::SharedPtr
pose_pub;
77rclcpp::Publisher<custom_interfaces::msg::VehicleStateVector>::SharedPtr
state_vector_pub;
87std::vector<rclcpp::Publisher<pacsim::msg::PerceptionDetections>::SharedPtr>
lms_pubs;
88std::map<std::shared_ptr<PerceptionSensor>, rclcpp::Publisher<pacsim::msg::PerceptionDetections>::SharedPtr>
91std::map<std::shared_ptr<PerceptionSensor>, rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr>
93std::map<std::shared_ptr<ImuSensor>, rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr>
imuPublisherMap;
94std::map<std::shared_ptr<GnssSensor>, rclcpp::Publisher<pacsim::msg::GNSS>::SharedPtr>
gnssPublisherMap;
117 = {
"FL_steer",
"FL_rotate",
"FR_steer",
"FR_rotate",
"RR_rotate",
"RL_rotate",
"steering" };
121std::vector<std::shared_ptr<ImuSensor>>
imus;
123std::shared_ptr<CompetitionLogic>
cl;
141 std::unique_ptr<tf2_ros::TransformBroadcaster> br = std::make_unique<tf2_ros::TransformBroadcaster>(node);
143 const double targetLoopPeriod = 1.0 / 1000.0;
144 double egoMotionSensorRate = 200.0;
145 double lastEgoMotionSensorSampleTime = 0.0;
146 std::string framePerception =
"perception";
147 std::string frameStateEstimation =
"cog_static";
149 Eigen::Vector3d start_position;
150 Eigen::Vector3d start_orientation;
153 model->setPosition(start_position);
154 model->setOrientation(start_orientation);
162 model->setPosition(Eigen::Vector3d::Zero());
163 model->setOrientation(Eigen::Vector3d::Zero());
165 start_position = Eigen::Vector3d::Zero();
166 start_orientation = Eigen::Vector3d::Zero();
185 double current_wheel_speed_angle = 0.0;
187 auto nextLoopTime = std::chrono::steady_clock::now();
188 auto lastLoopTime = nextLoopTime;
192 std::mutex mtxClockTrigger;
193 std::unique_lock<std::mutex> lockClockTrigger(mtxClockTrigger);
195 while (rclcpp::ok() && !(finish))
197 auto loopStartTime = std::chrono::steady_clock::now();
198 double realDt = std::chrono::duration<double>(loopStartTime - lastLoopTime).count();
199 lastLoopTime = loopStartTime;
202 rosgraph_msgs::msg::Clock clockMsg;
203 clockMsg.clock = rclcpp::Time(
static_cast<uint64_t
>(
simTime * 1e9));
205 auto wheelPositions =
model->getWheelPositions();
207 model->forwardIntegrate(dt);
208 auto t =
model->getPosition();
209 auto rEulerAngles =
model->getOrientation();
210 auto alpha =
model->getAngularAcceleration();
211 finish =
cl->performAllChecks(lms,
simTime, t, rEulerAngles);
213 geometry_msgs::msg::TransformStamped transformStamped
215 br->sendTransform(transformStamped);
216 geometry_msgs::msg::TwistWithCovarianceStamped poseStamped;
217 poseStamped.twist.twist.linear.x = t.x();
218 poseStamped.twist.twist.linear.y = t.y();
219 poseStamped.twist.twist.angular.z = rEulerAngles.z();
225 model->setSteeringSetpointFront(val);
230 model->setSteeringSetpointRear(val);
235 model->setTorques(val);
240 model->setRpmSetpoints(val);
245 model->setMaxTorques(val);
250 model->setMinTorques(val);
255 model->setThrottle(val);
260 model->setPowerGroundSetpoint(val);
263 if (
simTime >= (lastEgoMotionSensorSampleTime + 1 / egoMotionSensorRate))
265 lastEgoMotionSensorSampleTime += 1 / egoMotionSensorRate;
268 Eigen::Vector3d vel =
model->getVelocity();
269 Eigen::Vector3d rot =
model->getAngularVelocity();
274 custom_interfaces::msg::VehicleStateVector msg;
275 msg.velocity_x =
model->getVelocity().x();
276 msg.velocity_y =
model->getVelocity().y();
277 msg.yaw_rate =
model->getAngularVelocity().z();
278 msg.acceleration_x =
model->getAcceleration().x();
279 msg.acceleration_y =
model->getAcceleration().y();
281 msg.steering_angle = 0.5 * (
model->getSteeringAngles().FL +
model->getSteeringAngles().FR);
283 msg.fl_rpm =
model->getWheelspeeds().FL;
284 msg.fr_rpm =
model->getWheelspeeds().FR;
285 msg.rl_rpm =
model->getWheelspeeds().RL;
286 msg.rr_rpm =
model->getWheelspeeds().RR;
288 msg.header.stamp = rclcpp::Time(
static_cast<uint64_t
>(
simTime * 1e9));
294 ImuData imuDataCog {
model->getAcceleration(),
model->getAngularVelocity(), Eigen::Matrix3d::Zero(),
295 Eigen::Matrix3d::Zero(),
simTime,
"" };
306 double steeringWheelCurr =
model->getSteeringWheelAngle();
315 pacsim::msg::StampedScalar msg;
316 msg.value = steeringData.
data;
317 msg.stamp = rclcpp::Time(
static_cast<uint64_t
>(steeringData.
timestamp * 1e9));
324 pacsim::msg::StampedScalar msg;
325 msg.value = steeringData.
data;
326 msg.stamp = rclcpp::Time(
static_cast<uint64_t
>(steeringData.
timestamp * 1e9));
330 double voltageTsCurr =
model->getVoltageTS();
335 pacsim::msg::StampedScalar msg;
336 msg.value = voltageData.
data;
337 msg.stamp = rclcpp::Time(
static_cast<uint64_t
>(voltageData.
timestamp * 1e9));
341 double currentTsCurr =
model->getCurrentTS();
346 pacsim::msg::StampedScalar msg;
347 msg.value = currentData.
data;
348 msg.stamp = rclcpp::Time(
static_cast<uint64_t
>(currentData.
timestamp * 1e9));
358 auto gnssData = gnss->getOldest();
366 if (perceptionSensor->RunTick(trackAsLMList, t, rEulerAngles,
simTime))
371 visualization_msgs::msg::MarkerArray lmsMarkerMsg
379 pacsim::msg::PerceptionDetections lmsMsg
390 Wheels orientation =
model->getWheelOrientations();
394 pacsim::msg::Wheels wspdMsg;
395 wspdMsg.fl = wspd.
FL;
396 wspdMsg.fr = wspd.
FR;
397 wspdMsg.rl = wspd.
RL;
398 wspdMsg.rr = wspd.
RR;
399 wspdMsg.stamp = rclcpp::Time(
static_cast<uint64_t
>(wspd.
timestamp * 1e9));
405 pacsim::msg::Wheels torquesMsg;
406 torquesMsg.fl = torques.
FL;
407 torquesMsg.fr = torques.
FR;
408 torquesMsg.rl = torques.
RL;
409 torquesMsg.rr = torques.
RR;
410 torquesMsg.stamp = rclcpp::Time(
static_cast<uint64_t
>(torques.
timestamp * 1e9));
414 std::vector<double> jointMsg = { steeringCurr.
FL, orientation.
FL, steeringCurr.
FR, orientation.
FR,
415 orientation.
RR, orientation.
RL, -steeringWheelCurr };
424 nextLoopTime = std::chrono::steady_clock::now();
425 lastLoopTime = nextLoopTime;
427 nextLoopTime += std::chrono::microseconds((
int)((targetLoopPeriod /
realtimeRatio) * 1000000.0));
428 std::this_thread::sleep_until(nextLoopTime);
430 logger->logWarning(
"Ros status, 1 is OK, 0 is not OK: " + to_string(rclcpp::ok()));
431 logger->logWarning(
"Simulation finished, generating report");
436 logger->logWarning(
"Canceling executor!");
485 Wheels w { msg.fl, msg.fr, msg.rl, msg.rr };
496 std::shared_ptr<std_srvs::srv::Empty::Response> response)
502 std::shared_ptr<pacsim::srv::ClockTriggerAbsolute::Response> response)
511 std::shared_ptr<pacsim::srv::ClockTriggerRelative::Response> response)
515 response->stop_time = rclcpp::Time(
static_cast<uint64_t
>(
clockStopTime * 1e9));
520 std::vector<std::pair<std::string, std::string*>> params;
521 params.push_back({
"track_name", &
trackName });
523 params.push_back({
"track_frame", &
trackFrame });
529 params.push_back({
"discipline", &
discipline });
531 for (
auto p : params)
533 node->declare_parameter(std::string(p.first), rclcpp::PARAMETER_STRING);
534 (*p.second) = node->get_parameter(std::string(p.first)).as_string();
537 node->declare_parameter(
"realtime_ratio", rclcpp::PARAMETER_DOUBLE);
544 auto perceptionSensorsConfig = cfg.
getElement(
"perception_sensors");
545 std::vector<ConfigElement> sensors;
547 for (
auto& sensor : sensors)
549 std::shared_ptr<PerceptionSensor> perceptionSensor = std::make_shared<PerceptionSensor>();
550 perceptionSensor->readConfig(sensor);
561 Eigen::Vector3d vehicle_position =
model->getPosition();
562 Eigen::Vector3d vehicle_orientation =
model->getOrientation();
564 double yaw = vehicle_orientation.z();
567 Eigen::Matrix2d rotation_matrix;
568 rotation_matrix << cos(yaw), -sin(yaw),
572 const double epsilon = 2.5;
574 for (
const auto& detection : msg.detections)
577 Eigen::Vector2d local_point(detection.pose.pose.position.x, detection.pose.pose.position.y);
580 Eigen::Vector2d global_point = rotation_matrix * local_point;
581 global_point += vehicle_position.head<2>();
584 bool is_duplicate =
false;
587 double dist = std::hypot(global_point.x() - existing_cone.first.first,
588 global_point.y() - existing_cone.first.second);
599 double rounded_x = std::round(global_point.x() * 100.0) / 100.0;
600 double rounded_y = std::round(global_point.y() * 100.0) / 100.0;
602 std::pair<double, double> key = {rounded_x, rounded_y};
603 geometry_msgs::msg::Point point;
604 point.x = global_point.x();
605 point.y = global_point.y();
606 point.z = detection.pose.pose.position.z;
616 visualization_msgs::msg::MarkerArray marker_array;
621 visualization_msgs::msg::Marker marker;
622 marker.header.frame_id =
"map";
623 marker.header.stamp = rclcpp::Time(
simTime * 1e9);
624 marker.ns =
"seen_cones";
626 marker.type = visualization_msgs::msg::Marker::SPHERE;
627 marker.action = visualization_msgs::msg::Marker::ADD;
628 marker.pose.position = entry.second;
629 marker.pose.orientation.w = 1.0;
632 marker.scale.x = 0.2;
633 marker.scale.y = 0.2;
634 marker.scale.z = 0.2;
637 marker.color.a = 1.0;
638 marker.color.r = 1.0;
639 marker.color.g = 0.5;
640 marker.color.b = 0.0;
641 marker_array.markers.push_back(marker);
651 auto sensorsConfig = cfg.
getElement(
"sensors");
653 auto gnssConfigs = sensorsConfig.
getElement(
"gnssSensors");
654 std::vector<ConfigElement> gnssSensorConfigs;
656 for (
auto& sensor : gnssSensorConfigs)
658 std::shared_ptr<GnssSensor> gnssSensor = std::make_shared<GnssSensor>();
659 gnssSensor->readConfig(sensor);
663 auto imuConfigs = sensorsConfig.getElement(
"imus");
664 std::vector<ConfigElement> sensors;
665 imuConfigs.getElements(&sensors);
666 for (
auto& sensor : sensors)
668 std::shared_ptr<ImuSensor>
imuSensor = std::make_shared<ImuSensor>(200.0, 0.002);
673 auto frontSteeringConfig = sensorsConfig.getElement(
"steering_front");
676 auto rearSteeringConfig = sensorsConfig.getElement(
"steering_front");
678 auto wheelSpeedConfig = sensorsConfig.getElement(
"wheelspeeds");
683 auto voltageTSConfig = sensorsConfig.getElement(
"voltage_ts");
686 auto currentTSConfig = sensorsConfig.getElement(
"current_ts");
689 auto torquesConfig = sensorsConfig.getElement(
"wheelspeeds");
690 torquesSensor = std::make_shared<WheelsSensor>(200.0, 0.005);
727 geometry_msgs::msg::TransformStamped t;
729 t.header.stamp = rclcpp::Time(0, 0);
731 t.child_frame_id = sensor->getFrameId();
733 auto translation = sensor->getPosition();
734 auto orientation = sensor->getOrientation();
735 t.transform.translation.x = translation.x();
736 t.transform.translation.y = translation.y();
737 t.transform.translation.z = translation.z();
739 q.setRPY(orientation.x(), orientation.y(), orientation.z());
740 t.transform.rotation.x = q.x();
741 t.transform.rotation.y = q.y();
742 t.transform.rotation.z = q.z();
743 t.transform.rotation.w = q.w();
752 rclcpp::init(argc, argv);
753 auto node = std::make_shared<rclcpp::Node>(
"pacsim_node");
755 logger = std::make_shared<Logger>();
757 auto latsub = node->create_subscription<pacsim::msg::StampedScalar>(
"/pacsim/steering_setpoint", 1,
cbFuncLat);
763 auto throttleSub = node->create_subscription<pacsim::msg::Wheels>(
"/pacsim/throttle_setpoint", 1,
cbFuncLong);
764 RCLCPP_INFO_STREAM(rclcpp::get_logger(
"pacsim_logger"),
"Created subscription for throttle (Wheels)");
768 = node->create_subscription<pacsim::msg::Wheels>(
"/pacsim/wheelspeed_setpoints", 1,
cbWheelspeeds);
770 auto powerGroundSetpointSub
771 = node->create_subscription<pacsim::msg::StampedScalar>(
"/pacsim/powerground_setpoint", 1,
cbPowerGround);
773 velocity_pub = node->create_publisher<geometry_msgs::msg::TwistWithCovarianceStamped>(
"/pacsim/velocity", 3);
776 = node->create_publisher<custom_interfaces::msg::VehicleStateVector>(
"/pacsim/state_vector", 3);
778 pose_pub = node->create_publisher<geometry_msgs::msg::TwistWithCovarianceStamped>(
"/pacsim/pose", 3);
780 clockPub = node->create_publisher<rosgraph_msgs::msg::Clock>(
"/clock", 1);
782 mapVizPub = node->create_publisher<visualization_msgs::msg::MarkerArray>(
"/pacsim/map", 1);
784 simulatedSeVizPub = node->create_publisher<visualization_msgs::msg::MarkerArray>(
"/pacsim/state_estimation", 1);
786 auto finishSignalServer = node->create_service<std_srvs::srv::Empty>(
"/pacsim/finish_signal",
cbFinishSignal);
787 auto clockTriggerAbsoluteServer = node->create_service<pacsim::srv::ClockTriggerAbsolute>(
789 auto clockTriggerRelativeServer = node->create_service<pacsim::srv::ClockTriggerRelative>(
792 stateEstimationPub = node->create_publisher<visualization_msgs::msg::MarkerArray>(
"/pacsim/state_estimation", 1);
802 auto detectionsMarkersWrapper = std::make_shared<LandmarksMarkerWrapper>(0.8,
"pacsim/" + i->getName());
803 auto pub = node->create_publisher<pacsim::msg::PerceptionDetections>(
804 "/pacsim/perception/" + i->getName() +
"/landmarks", 1);
805 auto pubViz = node->create_publisher<visualization_msgs::msg::MarkerArray>(
806 "/pacsim/perception/" + i->getName() +
"/visualization", 1);
811 pubViz->publish(detectionsMarkersWrapper->deleteAllMsg(i->getFrameId()));
815 auto pub = node->create_publisher<sensor_msgs::msg::Imu>(
"/pacsim/imu/" + i->getName(), 3);
820 auto pub = node->create_publisher<pacsim::msg::GNSS>(
"/pacsim/gnss/" + i->getName(), 3);
824 steeringFrontPub = node->create_publisher<pacsim::msg::StampedScalar>(
"/pacsim/steeringFront", 1);
825 steeringRearPub = node->create_publisher<pacsim::msg::StampedScalar>(
"/pacsim/steeringRear", 1);
826 voltageSensorTSPub = node->create_publisher<pacsim::msg::StampedScalar>(
"/pacsim/ts/voltage", 1);
827 currentSensorTSPub = node->create_publisher<pacsim::msg::StampedScalar>(
"/pacsim/ts/current", 1);
829 wheelspeedPub = node->create_publisher<pacsim::msg::Wheels>(
"/pacsim/wheelspeeds", 1);
830 torquesPub = node->create_publisher<pacsim::msg::Wheels>(
"/pacsim/torques", 1);
832 jointStatePublisher = node->create_publisher<sensor_msgs::msg::JointState>(
"/joint_states", 3);
834 model = std::make_shared<VehicleModelBicycle>();
836 auto configVehicleModel = modelConfig.
getElement(
"vehicle_model");
837 model->readConfig(configVehicleModel);
840 logger->logInfo(
"Started pacsim");
841 executor = std::make_shared<rclcpp::executors::SingleThreadedExecutor>();
845 mainLoopThread.join();
846 logger->logWarning(
"Finished pacsim");
ConfigElement getElement(string elementName)
vector< ConfigElement > getElements()
visualization_msgs::msg::MarkerArray markerFromLMs(Track &in, std::string frame, double time)
Wheels getGripValues(std::array< Eigen::Vector3d, 4 > in)
void transformPoints(Eigen::Vector3d trans, Eigen::Vector3d rot)
void loadConfig(std::string path)
std::map< std::shared_ptr< PerceptionSensor >, std::shared_ptr< LandmarksMarkerWrapper > > perceptionSensorMarkersWrappersMap
void cbFuncLong(const pacsim::msg::Wheels &msg)
rclcpp::Publisher< pacsim::msg::Wheels >::SharedPtr wheelspeedPub
void cbFuncLat(const pacsim::msg::StampedScalar &msg)
void cbWheelspeeds(const pacsim::msg::Wheels &msg)
std::string perception_config_path
std::string report_file_dir
std::map< std::shared_ptr< GnssSensor >, rclcpp::Publisher< pacsim::msg::GNSS >::SharedPtr > gnssPublisherMap
void cbFuncTorquesInverterMin(const pacsim::msg::Wheels &msg)
std::shared_ptr< tf2_ros::StaticTransformBroadcaster > tf_static_broadcaster_
std::map< std::pair< double, double >, geometry_msgs::msg::Point > detected_cones_map
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr simulatedSeVizPub
std::shared_ptr< ScalarValueSensor > voltageSensorTS
DeadTime< double > deadTimeSteeringFront(0.0)
void handleTf2StaticTransforms()
std::shared_ptr< ScalarValueSensor > currentSensorTS
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr perceptionVizPub
DeadTime< Wheels > deadTimeMinTorques(0.0)
std::map< std::shared_ptr< PerceptionSensor >, rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr > perceptionSensorVizPublisherMap
DeadTime< double > deadTimeSteeringRear(0.0)
std::shared_ptr< WheelsSensor > wheelspeedSensor
std::vector< std::shared_ptr< GnssSensor > > gnssSensors
std::vector< std::string > jointNames
DeadTime< Wheels > deadTimeThrottle(0.0)
DeadTime< double > deadTimePowerGroundSetpoint(0.0)
rclcpp::Publisher< geometry_msgs::msg::TwistWithCovarianceStamped >::SharedPtr velocity_pub
rclcpp::Publisher< sensor_msgs::msg::Imu >::SharedPtr imu_pub
std::string grip_map_path
std::vector< rclcpp::Publisher< pacsim::msg::PerceptionDetections >::SharedPtr > lms_pubs
void publishStateEstimation()
std::shared_ptr< ImuSensor > imuSensor
void cbClockTriggerRelative(const std::shared_ptr< pacsim::srv::ClockTriggerRelative::Request > request, std::shared_ptr< pacsim::srv::ClockTriggerRelative::Response > response)
std::map< std::shared_ptr< ImuSensor >, rclcpp::Publisher< sensor_msgs::msg::Imu >::SharedPtr > imuPublisherMap
rclcpp::Publisher< geometry_msgs::msg::TwistWithCovarianceStamped >::SharedPtr pose_pub
std::condition_variable cvClockTrigger
std::string main_config_path
std::shared_ptr< ScalarValueSensor > steeringSensorRear
void cbFuncTorquesInverterMax(const pacsim::msg::Wheels &msg)
rclcpp::Publisher< pacsim::msg::StampedScalar >::SharedPtr currentSensorTSPub
std::vector< std::shared_ptr< ImuSensor > > imus
rclcpp::Publisher< custom_interfaces::msg::VehicleStateVector >::SharedPtr state_vector_pub
std::shared_ptr< Logger > logger
std::map< std::shared_ptr< PerceptionSensor >, rclcpp::Publisher< pacsim::msg::PerceptionDetections >::SharedPtr > perceptionSensorPublisherMap
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr stateEstimationPub
std::vector< std::shared_ptr< PerceptionSensor > > perceptionSensors
rclcpp::Publisher< pacsim::msg::Wheels >::SharedPtr torquesPub
void updateStateEstimation(const pacsim::msg::PerceptionDetections msg)
std::shared_ptr< CompetitionLogic > cl
rclcpp::Publisher< pacsim::msg::StampedScalar >::SharedPtr steeringRearPub
MainConfig fillMainConfig(std::string path)
std::shared_ptr< WheelsSensor > torquesSensor
DeadTime< Wheels > deadTimeMaxTorques(0.0)
std::shared_ptr< rclcpp::executors::SingleThreadedExecutor > executor
void cbFinishSignal(const std::shared_ptr< std_srvs::srv::Empty::Request > request, std::shared_ptr< std_srvs::srv::Empty::Response > response)
void getRos2Params(rclcpp::Node::SharedPtr &node)
void initPerceptionSensors()
rclcpp::Publisher< pacsim::msg::StampedScalar >::SharedPtr steeringFrontPub
int threadMainLoopFunc(std::shared_ptr< rclcpp::Node > node)
DeadTime< Wheels > deadTimeTorques(0.0)
rclcpp::Publisher< sensor_msgs::msg::JointState >::SharedPtr jointStatePublisher
rclcpp::Publisher< pacsim::msg::StampedScalar >::SharedPtr voltageSensorTSPub
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr mapVizPub
void cbClockTriggerAbsolute(const std::shared_ptr< pacsim::srv::ClockTriggerAbsolute::Request > request, std::shared_ptr< pacsim::srv::ClockTriggerAbsolute::Response > response)
std::string mapFilePrefix
void cbPowerGround(const pacsim::msg::StampedScalar &msg)
std::string sensors_config_path
DeadTime< Wheels > deadTimeWspdSetpoints(0.0)
std::shared_ptr< IVehicleModel > model
rclcpp::Publisher< rosgraph_msgs::msg::Clock >::SharedPtr clockPub
std::string vehicle_model_config_path
std::shared_ptr< ScalarValueSensor > steeringSensorFront
bool reportToFile(Report report, std::string dir)
geometry_msgs::msg::TwistWithCovarianceStamped createRosTwistMsg(const Eigen::Vector3d &vel, const Eigen::Vector3d &rot, const std::string &frame, double time)
pacsim::msg::PerceptionDetections LandmarkListToRosMessage(const LandmarkList &sensorLms, std::string frameId, double time)
sensor_msgs::msg::Imu createRosImuMsg(const ImuData &data)
sensor_msgs::msg::JointState createRosJointMsg(const std::vector< std::string > &joint_names, const std::vector< double > &joint_vals, double time)
geometry_msgs::msg::TransformStamped createRosTransformMsg(const Eigen::Vector3d &trans, const Eigen::Vector3d &rot, const std::string &frame, const std::string &child_frame, double time)
pacsim::msg::GNSS createRosGnssMessage(const GnssData &data)
double timeout_acceleration
bool broadcast_sensors_tf2
double timeout_trackdrive_first
double timeout_trackdrive_total
std::string cog_frame_id_pipeline
Eigen::Vector3d enuToTrackRotation
Eigen::Vector3d gnssOrigin
Track loadMap(std::string mapPath, Eigen::Vector3d &start_position, Eigen::Vector3d &start_orientation)
Discipline stringToDiscipline(const std::string &disciplineStr)
Track lmListToTrack(LandmarkList &in)
LandmarkList trackToLMList(Track &in)