ROS Topic (话题通信总结)

拿到一个功能包,先运行一下(以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.代码实现:

#include <ros/ros.h>
#include<geometry_msgs/Twist.h>

int main(int argc, char *argv[])
{
ros::init(argc, argv,"fabuzhe");
ros::NodeHandle nh;
ros::Publisher pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);
geometry_msgs::Twist yundong;

while(ros::ok())
{

yundong.linear.x=1;
yundong.angular.z=1;
pub.publish(yundong);


    
}
return 0;
}

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

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

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

#include<ros/ros.h>
#include<turtlesim/Pose.h>

void doROS(const turtlesim::Pose::ConstPtr& msg)
{
ROS_INFO("TURTLE POSE xpose: %0.4f,ypose: %0.4f",msg ->x,msg ->y);


}


int main(int argc,char *argv[])
{
ros::init(argc,argv,"dingyuezhe");
ros::NodeHandle nh;
ros::Subscriber sub =nh.subscribe<turtlesim::Pose>("/turtle1/pose",1,doROS);
ros::spin();

return 0;

}

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

#include<ros/ros.h>
#include<turtlesim/Pose.h>
#include<geometry_msgs/Twist.h>

double dt=0.1;
turtlesim::Pose hope_pose;
geometry_msgs::Twist sudu;
ros::Publisher pub;
void doROS(const turtlesim::Pose::ConstPtr& pose)
{
hope_pose.x=7;
hope_pose.y=7;

double dx,dy,ax,ay;
double kp=1;
dx=hope_pose.x-pose->x;
dy=hope_pose.y-pose->y;
sudu.linear.x=kp*dx;
sudu.linear.y=kp*dy;
pub.publish(sudu);

}


int main(int argc,char *argv[])
{
ros::init(argc,argv,"sum12");
ros::NodeHandle nh;
 pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);
ros::Subscriber sub =nh.subscribe<turtlesim::Pose>("/turtle1/pose",1,doROS);
ros::spin();

return 0;

}

自定义消息类型:

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功能包查找

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷茫的桔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值