文章目录
实操01_话题发布
1.话题与消息获取
1.1话题获取
1.2消息获取
代码:
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
/*
需求:发布速度消息
话题:/turtle1/cmd_vel
消息:geometry_msgs/Twist
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建发布者对象
5.发布逻辑
6.spinOnce();
*/
int main(int argc, char *argv[])
{
//2.初始化ROS节点
ros::init(argc,argv,"my_control");
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建发布者对象
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
//5.发布逻辑
ros::Rate rate(9);//设置发布频率
//组织被发布的消息
geometry_msgs::Twist twist;
twist.linear.x = 1.0;
twist.linear.y = 0.0;
twist.linear.z = 0.0;
twist.angular.x = 0.0;
twist.angular.y = 0.0;
twist.angular.z = 0.5;
//循环发布
while(ros::ok())
{
pub.publish(twist);
//休眠
rate.sleep();
//回头
//6.spinOnce();
ros::spinOnce();
}
return 0;
}
实操02_话题订阅
1.话题与消息获取
2.实现订阅节点
代码:
#include "ros/ros.h"
#include "turtlesim/Pose.h"
/*
需求:订阅乌龟的位姿信息,并输出到控制台
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建订阅对象
5.处理订阅到的数据(回调函数)
6.spin()
*/
void doPose(const turtlesim::Pose::ConstPtr &pose)
{
ROS_INFO("乌龟的位姿信息:坐标(%.2f,%.2f),朝向(%.2f),线速度:%.2f,角速度:%.2f",
pose->x,pose->y,pose->theta,pose->linear_velocity,pose->angular_velocity);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化ROS节点
ros::init(argc,argv,"sub_pose");
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建订阅对象
ros::Subscriber sub=nh.subscribe("/turtle1/pose",100,doPose);
//5.处理订阅到的数据(回调函数)
//6.spin()
ros::spin();
return 0;
}
实操03_服务调用
1.服务名称与服务消息获取
2.服务客户端实现
3.运行
代码:
# include "ros/ros.h"
# include "turtlesim/Spawn.h"
/*
需求:发布速度消息
话题:/turtle1/cmd_vel
消息:geometry_msgs/Twist
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建客户端对象
5.组织数据并发送
6.处理响应
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
// 2.初始化ROS节点
ros::init(argc,argv,"service_call");
// 3.创建节点句柄
ros::NodeHandle nh;
// 4.创建客户端对象
ros::ServiceClient client=nh.serviceClient<turtlesim::Spawn>("/spawn");
// 5.组织数据并发送
// 5_1.组织数据并发送
turtlesim::Spawn spawn;
spawn.request.x=1.0;
spawn.request.y=4.0;
spawn.request.theta=1.57;
spawn.request.name="turtle2";
// 5_2.发送请求
//判断服务器状态
//ros::service::waitForService("/spawn");
client.waitForExistence();
bool flag = client.call(spawn);//flag接收响应状态,响应结果也会被设置进apwan对象
// 6.处理响应
if(flag)
{
ROS_INFO("乌龟生成成功,新乌龟叫:%s",spawn.response.name.c_str());
}
else
{
ROS_INFO("请求失败!!!");
}
return 0;
}
实操04_参数设置
1.参数名获取
2.参数修改
3.运行
4.其他设置方式
通信机制比较