User Tools

Site Tools


neurali:ros_esempio_nodo_cpp

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

neurali:ros_esempio_nodo_cpp [2018/04/25 07:55]
neurali:ros_esempio_nodo_cpp [2020/06/08 22:20] (current)
Line 1: Line 1:
 +[[neurali:husky]]
  
 +esempio di nodo
 +
 +<code cpp>
 +#include <ros/ros.h>
 +#include <geometry_msgs/Velocity.h> //contiene tipi messaggi
 +#include <sensor_msgs/Joy.h>//contiene tipi messaggi
 +
 +
 +class TeleopTurtle  // contenitore di un oggetto nodo
 +{
 +public:
 +  TeleopTurtle(); //costruttore e inizializzatore campi dell'oggetto nodo!!
 +
 +private:
 +  void joyCallback(const sensor_msgs::Joy::ConstPtr& joy); //legge un joy e pubblica il msg
 +  
 +
 +  //ros::NodeHandle nh("my_namespace");
 +  ros::NodeHandle nh_; // oggetto nodo!!!!!!!!!!
 +
 +  int linear_, angular_; // inizializzati a 1 e 2
 +  double l_scale_, a_scale_;
 +  ros::Publisher vel_pub_; // conterra'
 +  ros::Subscriber joy_sub_;
 +  
 +};
 +
 +
 +TeleopTurtle::TeleopTurtle():
 +  linear_(1),
 +  angular_(2)
 +{
 +  // i param sono in un dizionario gestito nel server
 +  nh_.param("axis_linear", linear_, linear_); 
 +  // legge un param, ma se non lo trova mette un suo default
 +  nh_.param("axis_angular", angular_, angular_);
 +  nh_.param("scale_angular", a_scale_, a_scale_);
 +  nh_.param("scale_linear", l_scale_, l_scale_);
 +
 +  // comunica a master che ci sara' un topic con 1 valore
 +  // restituisce un Publisher necessario alla successiva pubblicazione
 +  vel_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1); 
 +
 +
 +   // segnala interesse a ricevere su un topic "joy"
 +   // ogni mess. ricevuto รจ passato a TeleopTurtle::joyCallback a cui e' passato 
 +   // l'oggetto nh_
 +
 +//This message should not be changed in place, as it is shared with any other subscriptions to this topic.
 +  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &TeleopTurtle::joyCallback, this);
 +  
 +   // ros::Rate loop_rate(10); // la frequenza di pubblicazione in Hz
 +}
 +
 +void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy) //ricez. vera e propria
 +{
 +  while (ros::ok())
 +  {
 +    geometry_msgs::Twist vel;
 +    vel.angular = a_scale_*joy->axes[angular_];
 +    vel.linear = l_scale_*joy->axes[linear_];
 +    vel_pub_.publish(vel);
 +
 +    // std_msgs::String msg; // per avere un testo come messaggio
 +    // msg.data = "hello world " + parole;
 +    // ROS_INFO("%s", msg.data.c_str()); // printf migliorato...
 +    // pubblicatore.publish(msg);
 +    
 +    loop_rate.sleep();
 +  }
 +}
 +
 +int main(int argc, char** argv)
 +{
 +  ros::init(argc, argv, "teleop_turtle");
 +
 +  TeleopTurtle teleop_turtle;
 +  
 +  ros::spin(); // senza questa la funzione joyCallback non verrebbe chiamata
 +
 +}
 +</code>