21 #include <rosgraph_msgs/Clock.h> 22 #include <geometry_msgs/TransformStamped.h> 23 #include <std_msgs/Time.h> 30 int main(
int argc,
char **argv){
31 ros::init(argc, argv,
"uav_dynamics_node");
38 if(uav_dynamics_node.
init() == -1){
52 _rviz_visualizator(_node),
53 _scenarioManager(_node, _actuators, _sensors),
54 _logger(_actuators, _sensors, info){
80 const std::string SIM_PARAMS_PATH =
"/uav/sim_params/";
85 ROS_ERROR(
"Dynamics: There is no at least one of required simulator parameters.");
92 const char DYNAMICS_NAME_FLIGHTGOGGLES[] =
"flightgoggles_multicopter";
93 const char DYNAMICS_NAME_INNO_VTOL[] =
"inno_vtol";
94 const char VEHICLE_NAME_INNOPOLIS_VTOL[] =
"innopolis_vtol";
95 const char VEHICLE_NAME_IRIS[] =
"iris";
114 ROS_ERROR(
"Wrong vehicle. It should be 'innopolis_vtol' or 'iris'");
119 ROS_ERROR(
"Can't init uav dynamics sim. Shutdown.");
125 initAttitude.normalize();
147 rosgraph_msgs::Clock clock_time;
180 rosgraph_msgs::Clock clock_time;
192 auto crnt_time = std::chrono::system_clock::now();
193 auto sleed_period = std::chrono::seconds(
int(periodSec *
clockScale_));
195 std::stringstream logStream;
204 std::this_thread::sleep_until(crnt_time + sleed_period);
221 auto crnt_time = std::chrono::system_clock::now();
222 auto sleed_period = std::chrono::milliseconds(
int(1000 * periodSec *
clockScale_));
223 auto time_point = crnt_time + sleed_period;
229 static auto crnt_time = std::chrono::system_clock::now();
230 auto prev_time = crnt_time;
231 crnt_time = std::chrono::system_clock::now();
232 auto time_dif_sec =
static_cast<double>((crnt_time - prev_time).count()) * 1e-9;
235 const double MAX_TIME_DIFF_SEC = 10 * periodSec;
236 if (time_dif_sec > MAX_TIME_DIFF_SEC) {
238 time_dif_sec = MAX_TIME_DIFF_SEC;
248 std::this_thread::sleep_until(time_point);
254 auto crnt_time = std::chrono::system_clock::now();
255 auto sleed_period = std::chrono::microseconds(
int(1000000 * period *
clockScale_));
256 auto time_point = crnt_time + sleed_period;
261 static auto next_time = std::chrono::system_clock::now();
262 if(crnt_time > next_time){
266 next_time += std::chrono::milliseconds(
int(50));
269 std::this_thread::sleep_until(time_point);
274 if(
calibrationType_ != static_cast<UavDynamicsSimBase::SimMode_t>(msg.data)){
void simulationLoopTimerCallback(const ros::WallTimerEvent &event)
Main Simulator loop.
void calibrationCallback(std_msgs::UInt8 msg)
void proceedDynamics(double period)
#define ROS_ERROR_STREAM_THROTTLE(period, args)
ros::WallTimer simulationLoopTimer_
int8_t initDynamicsSimulator()
ROSCONSOLE_DECL void notifyLoggerLevelsChanged()
#define ROS_INFO_STREAM_THROTTLE(period, args)
const float ROS_PUB_PERIOD_SEC
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
int main(int argc, char **argv)
void init(ros::NodeHandle &node)
int8_t init(const std::shared_ptr< UavDynamicsSimBase > &uavDynamicsSim)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void performLogging(double period)
uint64_t dynamicsCounter_
UavDynamicsSimBase::SimMode_t calibrationType_
int8_t getParamsFromRos()
void publishStateToCommunicator(uint8_t dynamicsNotation)
std::thread publishToRosTask
WallTimer createWallTimer(WallDuration period, void(T::*callback)(const WallTimerEvent &), T *obj, bool oneshot=false, bool autostart=true) const
void publish(uint8_t dynamicsNotation)
void publishToRos(double period)
void publish(const boost::shared_ptr< M > &message) const
ros::Subscriber calibrationSub_
DynamicsNotation_t notation
std::thread diagnosticTask
ROSCPP_DECL bool get(const std::string &key, std::string &s)
bool getParam(const std::string &key, std::string &s) const
std::vector< double > initPose_
UAV Dynamics class used for dynamics, IMU, and angular rate control simulation node.
std::thread proceedDynamicsTask
RvizVisualizator _rviz_visualizator
Uav_Dynamics(ros::NodeHandle nh)
std::vector< double > _actuators
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
std::shared_ptr< UavDynamicsSimBase > uavDynamicsSim_
void init(double clockScale, double dt_secs)
void createStringStream(std::stringstream &logStream, const Eigen::Vector3d &pose, double dynamicsCounter, double rosPubCounter, double periodSec)
ScenarioManager _scenarioManager
#define ROS_INFO_STREAM(args)
void publishTf(uint8_t dynamicsNotation)
Perform TF transform between GLOBAL_FRAME -> UAV_FRAME in ROS (enu/flu) format.
ROSCPP_DECL void shutdown()
DynamicsType dynamicsType
int8_t init(const std::shared_ptr< UavDynamicsSimBase > &uavDynamicsSim_)
ROSCONSOLE_DECL bool set_logger_level(const std::string &name, levels::Level level)
int8_t startClockAndThreads()
#define ROSCONSOLE_DEFAULT_NAME