按照官方教程,寫一個簡單的ROS接收/發送是很容易的。但是C++倡導對象化,把ROS節點註冊、topic接收/發送寫到類裏,還是一個很好的做法。一方面工程大了之後,方便管理;另一方面個人看起來也更舒服。
1、C++ class
class_demo.cpp
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <nav_msgs/Odometry.h>
class RobotMove {
public:
RobotMove();
private:
geometry_msgs::Twist cmd;
nav_msgs::Odometry odom;
ros::NodeHandle nh; // declare nodehandle
ros::Subscriber sub; // declare sub
ros::Publisher pub; // declare pub
void odomCallback(const nav_msgs::Odometry& msg); // declare callback_func
void loopCtl(void);
};
// difine sub&pub
RobotMove::RobotMove() {
sub = nh.subscribe("odom", 1000, &RobotMove::odomCallback, this); //
pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 50);
loopCtl();
}
// difine callback_func
void RobotMove::odomCallback(const nav_msgs::Odometry& msg) { odom = msg; }
// loop
void RobotMove::loopCtl() {
ros::Rate rate(30);
while (ros::ok()) {
pub.publish(cmd); // loop cmd
ros::spinOnce();
rate.sleep();
}
}
int main(int argc, char** argv) {
ros::init(argc, argv, "robotmove");
RobotMove robotobj;
ros::spin();
return 0;
}
2、normal
normal_demo.cpp
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <nav_msgs/Odometry.h>
geometry_msgs::Twist cmd;
nav_msgs::Odometry odom;
void odomCallback(const nav_msgs::Odometry& msg) { odom = msg; }
int main(int argc, char** argv) {
ros::init(argc, argv, "robotmove");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("odom", 1000, odomCallback);
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 50);
ros::Rate r(30);
while (ros::ok()) {
pub.publish(cmd);
ros::spinOnce();
r.sleep();
}
return 0;
}
常規寫法代碼量比class寫法更少,但是class寫法更符合對象化思維吧。
other 帶 private_nh寫法
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <nav_msgs/Odometry.h>
#include <iostream>
class RobotMove {
public:
RobotMove();
private:
geometry_msgs::Twist cmd;
nav_msgs::Odometry odom;
ros::NodeHandle nh; // declare nodehandle
ros::Subscriber sub; // declare sub
ros::Publisher pub; // declare pub
std::string odom_topic, cmd_vel_topic;
void odomCallback(const nav_msgs::Odometry& msg); // declare callback_func
void loopCtl(void);
};
// difine sub&pub
RobotMove::RobotMove() {
ros::NodeHandle private_nh("~"); // declare private nodehandle
private_nh.param("odom_topic", odom_topic, std::string("odom"));
private_nh.param("cmd_vel_topic", cmd_vel_topic, std::string("cmd_vel"));
sub = nh.subscribe(odom_topic, 1000, &RobotMove::odomCallback, this); //
pub = nh.advertise<geometry_msgs::Twist>(cmd_vel_topic, 50);
loopCtl();
}
// difine callback_func
void RobotMove::odomCallback(const nav_msgs::Odometry& msg) { odom = msg; }
// loop
void RobotMove::loopCtl() {
ros::Rate rate(30);
while (ros::ok()) {
pub.publish(cmd); // loop cmd
ros::spinOnce();
rate.sleep();
}
}
int main(int argc, char** argv) {
ros::init(argc, argv, "robotmove");
RobotMove robotobj;
ros::spin();
return 0;
}