2.1ROS通信机制-案例


通过ROS内置turtlesim案例,结合ROS命令获取节点话题、话题消息、服务、服务消息与参数的信息,最终再以编码的方式实现乌龟的控制、乌龟位姿的订阅、乌龟生成和乌龟窗体背景颜色的修改

1.话题发布

实现分析:

  • 关键节点有两个,一个是乌龟运动显示节点turtlesim_node,另一个是控制节点,两者是通过订阅模式实现通信的,而之前- 运动控制节点是通过turtle_teltop_key键盘控制,现在需要自定义控制节点;
  • 控制节点自定义,需要了解控制节点与显示节点通信使用的话题消息
  • 通过cpp或py编写运动控制节点,通过指定的话题,按照一定的逻辑发布消息即可

实现流程:

  • 获取topic、data、type
  • 自定义pub编写控制节点
  • 启动roscore、turtlesim_node以及自定义的控制节点,查看运行结果

启动完TurtleSim窗口后,另开cmd,键入rostopic list获取当前话题topic,然后键入rqt_graph打开计算图,获知两个话题之间的topic,再者rostopic info <topic>确定消息类型Type—>msg,然后rosmsg info <Type>获取消息格式
可获得Topic为/turtle1/cmd_vel;Type为 geometry_msgs/Twist;以及消息格式为:
消息格式
其中linear为线速度(m/s),angular为角速度(rad/s);我们需要关注的是linear-float64 xangular-float64 z
以此为基础angular:x-翻滚角,y-俯仰角,z-偏航角
可调用rostopic echo /turtle1/cmd_vel查看topic打印信息,验证消息格式

使用rostopic pub命令,可发布简单控制命令
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear: x, y, z angular: x, y, z"

python实现turtle圆周运动

<package>—>plumbing_test,在demo03下创建新的功能包

# plumbing_test/scripts/test01_pub_twist_p.py
#! /usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

if __name__=='__main__':
	rospy.init_node('my_control_p')
	pub=rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
	rate=rospy.Rate(10)
	twist=Twist()
	twist.linear.x=0.5
	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 not rospy.is_shutdown():
	pub.publish(twist)
	rate.sleep()

#添加权限,配置文件,编译
# roscore
# rosrun turtlesim turtlesim_node
# rosrun plumbing_test test01_pub_twist_p.py

2.话题订阅

获取turtle位姿信息、线速度、角速度
实现分析:启动turtle显示以及运动控制节点并控制乌龟运动;通过ROS命令,获取乌龟位姿发布的话题以及消息;编写订阅节点,订阅并打印乌龟的位姿信息

准备工作

实现流程:1.通过ros命令获取话题与消息信息 2.编码实现位姿获取节点 3.启动roscore、turtlesim_node、控制节点以及位姿订阅节点,控制乌龟运动并输出乌龟位姿

使用launch文件启动turtle的GUI以及键盘控制

# plumbing_test/launch/start_turtle.launch
 <!-- 启动turtle GUI和key控制节点>
<launch>
	<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen" />
	<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen" />
</launch>

roslaunch pluming_test start_turtle.launch
rostopic list—> /turtle1/pose 查看话题信息
rostopic info /turtle1/pose—>Type: turtlesim/Pose 查看话题数据类型信息
rosmsg info turtlesim/Pose 查看数据格式

运用命令的方式获取turtle位姿
rostopic echo /turtle1/pose

python编码实现

# plumbing_pub_test/scripts/test02_sub_pose_p.py
#! /usr/bin/env python
import rospy
from turtlesim.msg import Pose
  
def doPose(pose):
	rospy.loginfo('turtle位姿坐标({:.2f}, {:.2f}),朝向为{:.2f},线速度为{:2f}, 角速度为{:.2f}'.format(pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)
if __name__=='__main__':
	rospy.init_node('sub_pose')
	sub=rospy.Subscribuer('/tuttle1/pose',Pose,doPose,queue_size=10)
	rospy.spin()

# 添加权限,配置文件,编译

3.服务调用

编码向turtlesim发送请求,在turtle显示节点的窗体指定位姿生成一乌龟,这是一个服务请求操作

准备工作

实现分析:

  • 启动显示乌龟的显示节点
  • 通过ROS命令,获取乌龟生成服务的服务名称以及服务消息类型
  • 编写服务请求节点,生成新的乌龟

实现步骤:

  • ROS命令获取服务与服务消息等
  • 编码实现服务请求节点
  • 启动roscore, turtlesim_node, turtle生成节点,生成新的乌龟

rosservice list 查看当前服务列表,找到/spawn
rosservice info /spawn查看服务信息:Node节点,URI本地地址,Type数据类型,Args请求服务的话得输入的参数
rossrv info turtlesim/Spawn查看具体参数格式

rosservice call /spawn tab补齐参数信息,改变对应参数信息即可生成新的turtle

Python编码实现

# plumbing_pub_test/scripts/test03_service_client_p.py
#! /usr/bin/env pyhton

import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse

if __name__=='__main__':
	rospy.init_node('service_call_p')
	client=rospy.ServiceProxy('/spawn',Spawn)
	# 创建服务端对象,输入'/spawn'是服务名称,Spawn是参数类型
	request=SpawnRequest()
	# 创建请求对象
	request.x=4.5
	request.y=2.0
	reuqest.theta=3
	request.name='no1'
	client.wait_for_service()
	# 等待服务端启动
	try:
		response=client.call(request)
		# call()方法会返回创建turtle的name
		rospy.loginfo('the new turtle is {}'.format(response))
	except Exception as e:
		rospy.loginfo('there is a problem with the input parameter format')

# 添加权限,配置文件,编译

4.参数服务器

修改turtlesim乌龟显示节点窗体背景色,已知背景色是通过参数服务器的方式一rgb方式设置的

准备工作

实现分析:

  • 启动turtlesim节点
  • 通过ROS命令,获取参数服务器中设置背景色的参数
  • 编写参数设置节点,修改参数服务器中参数值

实现流程

  • 通过ros命令获取参数信息
  • 编码实现设置节点参数
  • 启动roscore, turtlesim_node与参数竖直节点,查看运行结果

先启动turtlesim窗口

roscore
rosrun turtlesim turtlesim_node
rosparam list # 列出系统中的参数,找到/turtlesim/background_b,g,r 
rosparam get /turtlesim/background_b\g\r #依次调用以获得三个参数对应的值
rosparam set /turtlesim/background_b\g\r  xx #分别修改三个参数的值

# 需重新启动turtlesim节点,背景颜色才能改变
rosrun turtlesim turtlesim_node 

python编码实现

# plumbing_pub_test/scripts/test04_param_p.py
#! /usr/bin/env python
import rospy

if __name__=='__main__':
	rospy.init_node('change_bgColor_p')
	rospy.set_param('/turtlesim/background_r', 100)
	rospy.set_param('/turtlesim/background_g', 50)
	rospy.set_param('/turtlesim/background_b', 200)

# 添加权限,配置文件,编译

其他实现方式

  • 命令行实现rosparam set /turtlesim/background ...
  • 启动节点时,直接设置参数rosrun turtlesim turtlesim_node _background_r:100 _background_g=50 _background_b=200
  • 通过launch文件传参,后续学习补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值