当前位置 博文首页 > txr152111的博客:22th ROS通信机制实操01——话题(topic)(C++/
本节主要是通过ROS内置的turtlesim案例,结合已经介绍ROS命令获取节点、话题、话题消息、服务、服务消息与参数的信息,最终再以编码的方式实现乌龟运动的控制、乌龟位姿的订阅、乌龟生成与乌龟窗体背景颜色的修改。
需求描述:编码实现乌龟运动控制,让小乌龟做圆周运动。
实现分析:
实现流程:
最终效果:
先打开小海龟仿真器:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
然后同rqt_graph来获得话题:
获取消息有两种:
rostopic type /turtle1/cmd_vel
rostopic info /turtle1/cmd_vel
获取消息类型:
rosmsg show geometry_msgs/Twist
rosmsg info geometry_msgs/Twist
?
?在小乌龟案例中,只有x方向的移动和z方向的转动
新建功能包,包名为plumbing_test、依赖为rospy? roscpp? std_msgs?? geometry_msgs?
在src下新建一个文件,为test01_pub_twist.cpp
#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
/*
需求:发布速度消息
话题: /turtle1/cmd_vel
消息:geometry_msgs/Twist
操作:
1.包含头文件
2.节点初始化
3.创建句柄
4.创建发布对象
5.发布逻辑
6.spinOnce()
*/
int main(int argc, char *argv[])
{
ros::init(argc,argv,"HaiGui");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
ros::Rate rate(10); //设置发布频率
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 = 1.0;
while (ros::ok())
{
pub.publish(twist);
rate.sleep();
ros::spinOnce();
}
return 0;
}
?编译:Ctrl +? Shift + B
测试:
新建文件夹scripts,新建py文件。
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import rospy
from geometry_msgs.msg import Twist
"""
发布方:发布速度消息
话题: /turtle1/cmd_vel
消息:geometry_msgs/Twist
实现流程:
1.导包
2.初始化 ROS 节点
3.创建发布者对象
4.循环发布运动控制消息
"""
if __name__ =="__main__":
# 2.初始化 ROS 节点
rospy.init_node("control_circle_p")
# 3.创建发布者对象
pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
# 4.循环发布运动控制消息
rate = rospy.Rate(10)
msg = Twist()
msg.linear.x = 1.0
msg.linear.y = 0.0
msg.linear.z = 0.0
msg.angular.x = 0.0
msg.angular.y = 0.0
msg.angular.z = 0.5
while not rospy.is_shutdown():
pub.publish(msg)
rate.sleep()
添加可执行权限:
配置CMakeLists.txt文件:
?编译
测试:
cs