ros之乌龟做圆周运动and订阅乌龟的位姿信息

一 .基于乌龟显示节点,通过话题发布,编码实现控制小乌龟做圆周运动

  • 打开终端1,进入工作空间 ros_ws
cd ros_ws
  • 启动节点(ros服务器)
roscore

在这里插入图片描述

  • 新开终端2,启动乌龟节点(turtlesim )
rosrun turtlesim turtlesim_node 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 新开终端3,查看启动的节点信息
rosnode list

在这里插入图片描述

  • 乌龟的节点为 turtlesim ,并查看该节点的信息,找到订阅者话题为 /turtle1/cmd_vel
rosnode info turtlesim

在这里插入图片描述

  • 查看 /turtle1/cmd_vel话题的信息,可找到话题的消息类型为 geometry_msgs/Twist
rostopic info /turtle1/cmd_vel

在这里插入图片描述

  • 查看 geometry_msgs/Twist 消息的内容
rosmsg show geometry_msgs/Twist

在这里插入图片描述

  • 进入工作空间 ros_wssrc文件夹,创建新的功能包 wugui_topic
cd ros_ws/src
catkin_create_pkg wugui_topic roscpp rospy std_msgs
  • 进入功能包 wugui_topic ,创建 scripts文件夹
cd wugui_topic
mkdir scripts
  • 打开vscode

  • scripts下创建python文件 wu_tal.py,并进行编写程序

#! /usr/bin/env python
"""
    编写 ROS 节点,控制小乌龟画圆
    准备工作:
        1.获取topic : /turtle1/cmd_vel
        2.获取消息类型 : geometry_msgs/Twist
        3.运行前,注意先启动 turtlesim_node 节点
    实现流程:
        1.导包
        2.初始化 ROS 节点
        3.创建发布者对象
        4.创建频率对象 10HZ
        5.创建消息对象
        6.创建发布的消息内容
"""
 
import rospy
from geometry_msgs.msg import Twist
 
if __name__ == "__main__":
    # 初始化 ROS 节点
    rospy.init_node("wu_tal_p")
    
    # 创建发布者对象
    pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)

    # 创建频率对象(10HZ)
    rate = rospy.Rate(10)

    # 创建消息对象
    message = Twist()

    # 创建发布的消息内容
    message.linear.x = 2.0
    message.linear.y = 1.0
    message.linear.z = 0.0
    # 偏航角 单位弧度
    message.angular.x = 0.0
    message.angular.y = 0.0
    message.angular.z = 1.0
 
    while not rospy.is_shutdown():#判断rospy是否是关闭状态,如果不是运行以下代码

        pub.publish(message)
        rate.sleep()
  • 在vscode中wugui_topic 中的 CMakeLists.txt 文件中的 162-165 行取消注释,修改为 scripts/wu_tal.py

在这里插入图片描述

  • 进入 scripts文件夹,并给python文件增加可执行权限
chmod +x *.py
  • 返回终端1,在终端1先关闭 roscore节点管理器,在对工作空间进行编译后,再开启节点管理器
catkin_make
roscore
  • 终端2,重新启动乌龟节点(turtlesim )
rosrun turtlesim turtlesim_node 
  • 新开终端4,进入 ros_ws工作空间
cd ros_ws
  • 刷新并运行程序
source ./devel/setup.bash
rosrun wugui_topic wu_tal.py

在这里插入图片描述

二.在键盘控制乌龟运动的基础上,编码实现话题订阅,打印乌龟实时位姿信息

  • 打开终端1 启动 roscore节点管理器,并新开 终端2 启动乌龟节点
roscore       # 终端1 启动
rosrun turtlesim turtlesim_node   # 终端2 启动
  • 新开 终端3 查看 /turtlesim 节点的信息

    该节点信息的发布方具有三个话题

    /rosout:用于在ROS中进行日志记录和调试。

    /turtle1/color_sensor:用于获取turtlesim包中的turtle1海龟的颜色传感器信息

    /turtle1/pose:表示乌龟的位姿信息

rosnode info /turtlesim 

在这里插入图片描述

  • 查看位姿话题 /turtle1/pose 的信息,可找到话题类型为 turtlesim/Pose
rostopic info /turtle1/pose 

在这里插入图片描述

  • 查看 turtlesim/Pose内容
rosmsg show turtlesim/Pose

在这里插入图片描述

  • 在功能包 wugui_topic下的 scripts文件夹下创建python文件 wu_lis.py,并进行编写程序
#! /usr/bin/env python
"""
    获取小乌龟的位资
    准备工作:
        1.获取topic : /turtle1/pose
        2.获取消息类型 : turtlesim/Pose
        3.运行前,注意先启动 turtlesim_node 节点
    实现流程:
        1.导包
        2.初始化 ROS 节点
        3.创建服务对象
        4.回调函数处理请求并产生响应
        5.spin 函数
"""


import rospy
from turtlesim.msg import Pose

# 回调函数
def coord(msg):
    rospy.loginfo("乌龟位姿信息: 坐标(%.2f,%.2f), 朝向:%.2f, 线速度:%.2f, 角速度:%.2f",
                    msg.x,msg.y,msg.theta,msg.linear_velocity,msg.angular_velocity)

if __name__ == '__main__':

    # 初始化节点
    rospy.init_node("wu_lis_p")  

    # 创建服务对象
    sub = rospy.Subscriber("/turtle1/pose",Pose,coord,queue_size=10)

    # 阻塞函数
    rospy.spin()
  • 在vscode中wugui_topic 中的 CMakeLists.txt 文件中的 162-165 行取消注释,添加为 scripts/wu_lis.py

在这里插入图片描述

  • 返回终端1,在终端1先关闭 roscore节点管理器,在对工作空间进行编译后,再开启节点管理器
catkin_make
roscore
  • 终端2,重新启动乌龟节点(turtlesim )
rosrun turtlesim turtlesim_node 
  • 新开终端4,启动海龟控制节点
rosrun turtlesim turtle_teleop_key

在这里插入图片描述

  • 新开终端5,进入 ros_ws工作空间
cd ros_ws
  • 刷新并运行程序
source ./devel/setup.bash
rosrun wugui_topic wu_lis.py

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是实现小乌龟五边形运动并输出位姿ROS Python 代: ```python #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist from turtlesim.msg import Pose class TurtleController(): def __init__(self): # 初始化ROS节点 rospy.init_node('turtle_controller', anonymous=True) # 创建小乌龟速度发布者 self.velocity_publisher = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) # 创建小乌龟位姿订阅者 self.pose_subscriber = rospy.Subscriber('/turtle1/pose', Pose, self.pose_callback) # 初始化小乌龟位置和朝向角度 self.x = 0.0 self.y = 0.0 self.theta = 0.0 # 休眠1秒等待ROS节点初始化完成 rospy.sleep(1) def pose_callback(self, pose): # 更新小乌龟位置和朝向角度 self.x = pose.x self.y = pose.y self.theta = pose.theta def move(self): # 创建Twist消息并设置线速度和角速度 vel_msg = Twist() vel_msg.linear.x = 1.0 vel_msg.angular.z = 72.0 / 180.0 * 3.1416 # 计算五边形需要移动的时间 time = 100.0 / vel_msg.linear.x # 获取当前时间 start_time = rospy.Time.now().to_sec() # 循环移动小乌龟 while rospy.Time.now().to_sec() - start_time < time: self.velocity_publisher.publish(vel_msg) # 停止小乌龟运动 vel_msg.linear.x = 0.0 vel_msg.angular.z = 0.0 self.velocity_publisher.publish(vel_msg) # 输出小乌龟的位置和朝向角度 rospy.loginfo("位姿:x={}, y={}, theta={}".format(self.x, self.y, self.theta)) if __name__ == '__main__': try: # 创建TurtleController对象并移动小乌龟 turtle_controller = TurtleController() turtle_controller.move() except rospy.ROSInterruptException: pass ``` 运行代后,小乌龟会在ROS环境下画出一个五边形,并输出小乌龟的位置和朝向角度。注意需要在另一个终端中运行`roscore`命令开启ROS环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⚝ ⚝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值