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()
完全类似话题订阅方程序的编写
#! /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图就可以非常清晰的看到这些节点之间的关系。
(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("请求失败!重复执行或其他异常")
(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)