ROS-常用snippet
ros 常用代码
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <geometry_msgs/TransformStamped.h>
int main(int argc, char **argv){
ros::init(argc, argv, "ros_node_name");
ros::NodeHandle n;
ros::Rate loop_rate(1);
while(n.ok()){
ROS_INFO_STREAM("print information");
loop_rate.sleep();
}
return 0;
}
01.publisher
int main(int argc,char *argv[])
{
ros::init(argc,argv,"talker");
ros::NodeHandle nh;
ros::Publisher pub =nh.advertise<std_msgs::String>("fang",10);//就是队列的长度,例如有12条信息的话就输出后面10条
std_msgs::String msg;
ros::Rate rate(10);
int count =0;
ros::Duration(3.0).sleep(); /
while(ros::ok())//ok()指只要该节点还活着,就循环
{ count++;
std::stringstream ss;
ss<<"hello --->"<<count;
msg.data =ss.str();
pub.publish(msg);
ROS_INFO("发布的数据是:%s",ss.str().c_str());
rate.sleep();//睡0.1秒,相当于10HZ
ros::spinOnce();//在有回调函数时才有用,在此函数无用(官方建议添加)
}
return 0;
}
02.Subscriber
void doMsg(const std_msgs::String::ConstPtr &msg)
{
//通过msg获取并操作订阅到的消息
ROS_INFO("listener订阅的数据:%s",msg->data.c_str());
}
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化ROS节点
// 参数1和参数2 后期为节点传值会使用
// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
ros::init(argc,argv,"listener");
//3.创建节点句柄
ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能
//4.创建订阅者对象;
ros::Subscriber sub =nh.subscribe("fang",10,doMsg);
//5.处理订阅到的数量
ros::spin();//循环读取接收的数据,并调用回调函数(doMsg)处理
return 0;
}
03.使用类来实现:在订阅中发布话题
class MySubscriber
{
public:
MySubscriber()
{
pub_ = n_.advertise<sensor_msgs::LaserScan>("scan_new", 10);
sub_ = n_.subscribe("subscriber_scan", 1000, &MySubscriber::chatterCallback, this);
// 回调函数
void chatterCallback(const sensor_msgs::LaserScan::ConstPtr &msg)
{
ROS_INFO("sub laserscan msgs.");
std::vector<float> scan_ranges = msg->ranges;
std::vector<float> scan_intensities = msg->intensities;
ROS_INFO_STREAM("ranges size: " << scan_ranges.size());
ROS_INFO_STREAM("intensities size: " << scan_intensities.size());
sensor_msgs::LaserScan msg_topub;
msg_topub = *msg;
msg_topub.header.frame_id = "new_frame_id";
pub_.publish(msg_topub);
ROS_INFO_STREAM("pub msg success");
std::cout << std::endl;
}
private:
ros::NodeHandle n_;
ros::Publisher pub_;
ros::Subscriber sub_;
};
int main(int argc, char **argv)
{
ros::init(argc, argv, "ros_node");
MySubscriber mynode;
ros::spin();
return 0;
}
03. callback回调函数
- 绑定普通回调函数
void callback(const std_msgs::StringConstPtr& str){...}
ros::Subscriber sub = nh.subscribe("my_topic", 1, callback);
- 绑定类对象中回调函数
注意这种方式的subscribe()中四个参数,
参数1:话题名称
参数2:一次处理的消息数量
参数3:&类名::回调函数
参数4:&类对象
void Foo::callback(const std_msgs::StringConstPtr& message){}
Foo foo_object;
ros::Subscriber sub = nh.subscribe("my_topic", 1, &Foo::callback, &foo_object);
- 使用boost::bind()绑定回调函数
// 回调函数的定义中,有三个形参
void callback02(const turtlesim::PoseConstPtr& msg, int x, int y){}
// subscriber
ros::Subscriber pose_sub = n.subscribe<turtlesim::Pose>("/turtle1/pose", 2, boost::bind(&callback02, _1, input_x, input_y));
04. ROS package CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
## Declare ROS messages and services
add_message_files(DIRECTORY msg FILES Num.msg)
add_service_files(DIRECTORY srv FILES AddTwoInts.srv)
## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)
## Declare a catkin package
catkin_package()
## 可执行文件添加
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
11.创建功能包
catkin_create_pkg package_nameXXXXXX roscpp rospy tf tf_ros tf2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现