拿到一个功能包,先运行一下(以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功能包查找
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)