赞
踩
拿到一个功能包,先运行一下(以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配置编译文件,参考连接:
4然后在工作空间的devel/include下就可以找到头文件了
然后在你的cpp文件里面就可以使用
#include "study_turtle/Person.h"
服务的使用方法大同小异,详细看博客:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。