当前位置:   article > 正文

ROS入门一——Topic通讯方式实现_ros publish

ros publish

ROS入门学习

一、新建一个ROS工程的步骤

1、创建工作空间并初始化

  1. mkdir -p ros_ws/src //ros_ws名称可以变,src名称不可以变。
  2. cd ~/ros_ws/src/
  3. catkin_init_workspace

结果:

2、编译工作空间

  1. cd ~/ros_ws
  2. catkin_make

结果:

3、再执行

catkin_make install

结果:

 4、创建功能包

  1. cd ~/ros_ws/src
  2. catkin_create_pkg topic_talk std_msgs rospy roscpp

 结果:

 5、为了使功能包生效,回到工作空间进行编译:

 编译完成后,要运行功能包的某一个程序文件,先要设置一下工作空间的环境变量:

source devel/setup.bash

为了避免每次创建功能包,忘记执行环境变量的配置,可以将 source devel/setup.bash 命令复制添加到 .bashrc 的配置文件里面:.bashrc在根目录下:(CTRL+h 可以显示隐藏文件)

 二、话题发布&订阅代码

话题发布代码:

  1. #include<ros/ros.h>
  2. #include<std_msgs/String.h>
  3. const char* node_name = "topic_publisher";
  4. const char* topic_name = "test_topic";
  5. int main(int argc,char *argv[])
  6. {
  7. ros::init(argc,argv,node_name); //ROS节点初始化
  8. ros::NodeHandle n; //(注册)创建节点句柄,管理节点的资源
  9. ros::Publisher topic_publisher = n.advertise<std_mags::String>(topic_name,10);//(创建消息)创建一个Publisher,发布名为test_topic的topic,消息类型为std_mags::String,队列长度10
  10. ros::Rate loop_rate(10); //(发布消息)设置循环的频率
  11. ROS_INFO("%s start publishing msg",node_name);
  12. while(ros::ok()) //while循环主要就是封装数据、并发布数据、延时满足频率进入到下次循环
  13. {
  14. std_msgs::String test_msgs; //
  15. test_msgs.data = "this is msg publisher!";
  16. topic_publisher.publish(test_msgs); //发布消息
  17. loop_rate.sleep(); // 按照循环频率延时
  18. }
  19. return 0;
  20. }

话题订阅代码:

  1. #include<ros/ros.h>
  2. #include<std_msgs/String.h>
  3. const char* node_name = "topic_subscriber";
  4. const char* topic_name = "test_topic";
  5. void show_msg_callback(const std_msgs::String::ConstPtr& msg)//引用传递,这时存放的是由主调函数放进来的实参变量的地址
  6. //When messages are automatically generated into C++ code, there are several typedefs defined. One of them is ::Ptr, which is typedef-ed to be a boost::shared_ptr<MSG>, and another is ::ConstPtr which is boost::shared_ptr<MSG const>.
  7. //By passing a const pointer into the callback, we avoid doing a copy. While this might not make much difference for std_msgs::String, it can make a huge difference for sensor_msgs::PointCloud2.
  8. {
  9. ROS_INFO("get msg:[%s] from topic:[%s]",msg->data.c_str(),topic_name);
  10. }
  11. int main(int argc,char *argv[])
  12. {
  13. ros::init(argc,argv,node_name);
  14. ros::NodeHandle n;
  15. ros::Subscriber topic_subscriber = n.subscribe(topic_name,10,show_msg_callback);
  16. ros::spin(); //循环等待回调函数
  17. return 0;
  18. }

在该功能包的CmakeLists里配置话题发布者&订阅者代码的编译规则:

  1. add_executable(topic_publisher src/topic_publisher.cpp) //描述将哪一个程序文件(velocity_publisher. cpp),编译成哪一个可执行文件(velocity_publisher src)
  2. target_link_libraries(topic_publisher ${catkin_LIBRARIES}) //帮助将生成的可执行文件与ROS 的一些库建立连接(c++的库)

改写结果如下图所示,放在build位置:

 使用catkin_make命令编译工作空间中所有的功能包,最终生成对应的目标文件,在工作空间的根目录中执行以下命令:

catkin_make

三、自定义message消息类型

①在功能包文件夹下新建一个msg文件夹,在msg文件夹里创建一个person.msg文件:

  1. string name
  2. uint8 age
  3. uint8 score

②在package.xml文件的文件末尾添加如下语句,实现对应功能包的编译和运行的相关依赖:

  1. <build_depend>message_generation</build_depend> //这个名称不能改
  2. <exec_depend>message_runtime</exec_depend>

③在CMakeLists.txt文件中,进行如下修改:

第一块:修改find_package部分,确保编译时找到对应文件

  1. find_package(catkin REQUIRED COMPONENTS
  2. roscpp
  3. rospy
  4. std_msgs
  5. message_generation
  6. )

第二块:设置msg文件

  1. add_message_files(
  2. FILES
  3. person.msg
  4. )
  5. generate_messages(
  6. DEPENDENCIES
  7. std_msgs
  8. )

第三块:catkin依赖部分

如果我们编写的ros程序不打算给别人使用,这块就无所谓。

  1. catkin_package(
  2. ...
  3. CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
  4. ...
  5. )

在源文件中使用自定义的消息类型需要包含对应编译生成的头文件:

 这样就可以使用自定义的消息类型啦!

四、常用ros命令

  1. rosrun [package_name] [node_name] //运行ros节点
  2. rosmsg list //ros会输出工作空间中已经存在的所有类型消息
  3. rosmsg show std_msgs/Int8 //可以看到:int8 data,std_msgs/Int8实际上是由一个int8类型的对象data组成。
  4. rosservice call [service名称] [args] //调用某服务

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/657165
推荐阅读
相关标签
  

闽ICP备14008679号