话题通讯(发布/订阅)
视频地址
概要:
完成订阅者和发布者的编程,达到机器人扭动恢复原位置的目的。
正文:
是发布者也是订阅者
前面的章节,得到机器人里程计信息,并在rviz中可视化
Odom的消息类型
shell
rostopic type /tianbot_mini/odom
为 Nav_msgs/Odometry
怎么直接观察Nav_msgs/Odometry里面的消息内容呢
使用rosmsg_show
shell
rosmsg show nav_msgs/Odometry
我们知道了话题名字,话题类型,话题信息,现在就可以先写出一个里程计的subscriber出来
复制上节课listener的代码,把话题三要素改为如下图
在_sub_odom.py的文件夹下打开终端
我们还要能控制车去做运动,之前章节我们控制车转圈的节点是cmd_vel,这两节一直强调话题三要素,我们先看一下cmd_vel相关话题信息
shell
rostopic type /tianbot_mini/cmd_vel
geometry_msgs/Twist
内容是什么呢?
shell
rosmag show geometry_msgs/Twist
我们的思路是利用刚才_sub_odom.py里写的话题订阅信息,把发布的代码写进去,实现cmd_vel节点发布信息,Odometry里程计节点订阅接受信息,形成一个闭环,完成机器人的倔强
把代码改为
python
#!/usr/bin/env python
import rospy
from nav_msgs.msg import Odometry
from geometry_msgs.msg import Twist
def callback(data) :
rospy.loginfo(data.pose.pose.orientation.w)
pub = rospy.Publisher('tianbot_mini/cmd_vel', Twist, queue_size=10)
tianbot_move_cmd = Twist()
if data.pose.pose.orientation. w > -0.66:
tianbot_move_cmd.angular.z = 0.8
pub.publish(tianbot_move_cmd)
else:
if data.pose.pose.orientation.w < -0.76:
tianbot_move_cmd.angular.z = -0.8
pub.publish(tianbot_move_cmd) #相定义的
def listener() :
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("tianbot_mini/odom", Odometry, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__== '__main__' :
listener()
此时在juejiang_tianbot.py对应的文件夹下 运行
shell
python juejiang_tianbot.py
此时机器人可能会小范围抖动,是由于PID的原因,属于正常现象