当前位置:   article > 正文

ROS Topic (话题通信总结)_rostopic

rostopic

拿到一个功能包,先运行一下(以turtlesim为例子):

rusrun turtlesim turtlesim_node

然后使用 rqt_graph 和rostopic list 大致了解有哪些话题和节点:

可以看到 主要有/turtle1/cmd_vel等三个话题,接着使用 rostopic list -v 继续研究:

可以看消息的类型和订阅者发布者,比如说/turtle1/cmd_vel是乌龟的速度话题,但是没有人发布这个话题,于是我们尝试去驱动乌龟去运动

(若话题比较少,rostopic list -v非常好用,如果较多,可以使话题单个查看指令 rostopic info 和rostopic type)

首先要去获取消息的数据形式,如果是对方是发布者可以使用rostopic echo [话题名],如果对方是订阅者,则:

直接发布话题

使用 rostopic pub [话题名] [消息类型名] [参数改变]

看似复杂,其实只有 rostopic pub [话题名] ,剩下的狂按Tab补齐就行了

然后你自己去修改参数就好了,不过乌龟只动一次,若想循环运动

rostopic pub -r 3 /turtle1/cmd_vel........(Tab自动补齐)

-r是循环发布,3是发布频率

rostopic echo -n  1 /turtle2/pose

可以实现话题单次查看

2.代码实现:

  1. #include <ros/ros.h>
  2. #include<geometry_msgs/Twist.h>
  3. int main(int argc, char *argv[])
  4. {
  5. ros::init(argc, argv,"fabuzhe");
  6. ros::NodeHandle nh;
  7. ros::Publisher pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);
  8. geometry_msgs::Twist yundong;
  9. while(ros::ok())
  10. {
  11. yundong.linear.x=1;
  12. yundong.angular.z=1;
  13. pub.publish(yundong);
  14. }
  15. return 0;
  16. }

效果和方法1是相同的,比较简单,随便找一个publisher的代码,把消息类型一改就行了。

结果展示为:小乌龟在绕圈

同理,也可以写出订阅乌龟位姿的代码(/turtle1/pose):

  1. #include<ros/ros.h>
  2. #include<turtlesim/Pose.h>
  3. void doROS(const turtlesim::Pose::ConstPtr& msg)
  4. {
  5. ROS_INFO("TURTLE POSE xpose: %0.4f,ypose: %0.4f",msg ->x,msg ->y);
  6. }
  7. int main(int argc,char *argv[])
  8. {
  9. ros::init(argc,argv,"dingyuezhe");
  10. ros::NodeHandle nh;
  11. ros::Subscriber sub =nh.subscribe<turtlesim::Pose>("/turtle1/pose",1,doROS);
  12. ros::spin();
  13. return 0;
  14. }

接着写一个全向轮小乌龟(不太符合逻辑)使用PID控制到达位置:

  1. #include<ros/ros.h>
  2. #include<turtlesim/Pose.h>
  3. #include<geometry_msgs/Twist.h>
  4. double dt=0.1;
  5. turtlesim::Pose hope_pose;
  6. geometry_msgs::Twist sudu;
  7. ros::Publisher pub;
  8. void doROS(const turtlesim::Pose::ConstPtr& pose)
  9. {
  10. hope_pose.x=7;
  11. hope_pose.y=7;
  12. double dx,dy,ax,ay;
  13. double kp=1;
  14. dx=hope_pose.x-pose->x;
  15. dy=hope_pose.y-pose->y;
  16. sudu.linear.x=kp*dx;
  17. sudu.linear.y=kp*dy;
  18. pub.publish(sudu);
  19. }
  20. int main(int argc,char *argv[])
  21. {
  22. ros::init(argc,argv,"sum12");
  23. ros::NodeHandle nh;
  24. pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);
  25. ros::Subscriber sub =nh.subscribe<turtlesim::Pose>("/turtle1/pose",1,doROS);
  26. ros::spin();
  27. return 0;
  28. }

自定义消息类型:

1在功能包下创建msg文件夹

2msg文件夹下创建xx.msg文件(比如Person.msg)

3配置编译文件,参考连接:

2.1.4 话题通信自定义msg · GitBook

4然后在工作空间的devel/include下就可以找到头文件了

然后在你的cpp文件里面就可以使用

#include "study_turtle/Person.h"

服务通信

服务的使用方法大同小异,详细看博客:

ROSservice 通信方式_-CSDN博客

ROS功能包查找

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号