ROS通信机制实操案例

ROS通信机制实操案例:

demo 01 控制小乌龟做圆周运动

1、正常启动键盘控制乌龟节点:

roscore——rosrun turtlesim turtlesim_node——rosrun turtlesim turtle_teleop_key

2、用ros命令查看当前话题名和消息类型,方便下一步自行编码完成控制乌龟运动

(1)rostopic list查看当前话题名称,rqt_graph查看计算图的结构,可以看到话题名

在这里插入图片描述

看到当前两个节点通信的话题是/turtle1/cmd_vel

(2)获取话题的消息类型

rostopic info

rostopic type

在这里插入图片描述

(3)获取消息格式

rosmsg show/info

在这里插入图片描述

线速度角速度的含义也讲了

(4)控制乌龟运动完全类似话题发布方程序的编写

#! /usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

"""
发布方:
需要获取话题名和消息类型
话题:/turtle1/cmd_vel
消息类型:geometry/Twist

"""
if __name__=="__main__":
    rospy.init_node("control")
    #创建发布者对象
    pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
    #组织并发布数据
    #设置发布频率
    rate = rospy.Rate(10)
    #创建速度消息
    twist = Twist()
    twist.angular.z = 1
    twist.angular.x = 0
    twist.angular.y = 0
    twist.linear.x = 1
    twist.linear.y = 0
    twist.linear.z = 0
    #循环发布数据
    while not rospy.is_shutdown():
        pub.publish(twist)
        rate.sleep()

demo 02 订阅乌龟的位姿

完全类似话题订阅方程序的编写

#! /usr/bin/env python
import rospy
from turtlesim.msg import Pose
"""
需求:订阅输出乌龟位资
1、导包
2、初始化ros节点
3、创建订阅对象
4、使用回调函数处理订阅到的消息
5、spin
"""
def sub_pose(pose):
    rospy.loginfo("乌龟位姿信息:坐标(%.2f,%.2f),朝向:%.2f,线速度:%.2f,角速度:%.2f。",pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)

if __name__=="__main__":
    rospy.init_node("subpose")
    sub = rospy.Subscriber("/turtle1/pose",Pose,sub_pose,queue_size = 100)
    rospy.spin()

在这里编写程序有一个误区,误以为这个是和动作发布方直接通信的,所以话题一开始采用/turtle1/cmd_vel时一直报错,后来发现这个是订阅了/turtle1/pose话题,输出rqt图就可以非常清晰的看到这些节点之间的关系。
在这里插入图片描述

demo 03 通过服务通信实现在指定位置生成一只乌龟

(1)使用rosservice list命令获取当前存在的服务列表,/spawn是生成乌龟的服务

(2)使用rosservice info spawn可以看到该服务的一些细节信息

在这里插入图片描述

可以看到①/turtlesim节点提供了该服务②URI③服务的消息类型(重要)④服务的参数(xy坐标位置,角度,名字)

(3)调用rossrv info/show 消息类型名,查看该消息类型的具体信息格式

在这里插入图片描述

(4)通过命令的方式调用服务并生成一只乌龟

rosservice call 服务名字 tab键补齐会显示需要输入服务请求参数

rosservice call /spawn

(5)通过编码方式调用服务生成一只乌龟

#! /usr/bin/env python
import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse
"""
需求:向服务器发送请求,生成一只小乌龟
话题:spawn
消息类型:/turtlesim/Spawn

"""
#编写主入口
if __name__=="__main__":
    #初始化ros节点
    rospy.init_node("generate_turtle")
    #创建请求对象
    client_gene = rospy.ServiceProxy("/spawn",Spawn)
    #组织数据并发送请求
    request = SpawnRequest()
    request.x = 3.0
    request.y = 9.0
    request.theta = 0.9
    request.name = "littleturtle2"
    #判断服务端是否开启,未开启则挂起等待
    client_gene.wait_for_service()
    try:
        reponse = client_gene.call(request)
        #处理响应结果
        rospy.loginfo("生成乌龟的名字叫:%s",reponse.name)
    except:
        rospy.logerr("请求失败!重复执行或其他异常")

demo 04 修改背景参数

(1)通过ros命令的方式修改

rosparam list

rosparam get

rosparam set

(2)通过编码方式实现

#! /usr/bin/env python
import rospy
"""
需求:修改乌龟gui背景色
1、初始化ros节点
2、设置参数
"""
if __name__=="__main__":
    rospy.init_node("set_param")
    rospy.set_param("/turtlesim/background_r",10)
    rospy.set_param("/turtlesim/backgroung_g",200)
    rospy.set_param("/turtlesim/background_b",40)

猜你喜欢

转载自blog.csdn.net/weixin_45205599/article/details/129070758
今日推荐