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
posted @   DNGG  阅读(109)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示