在Gazebo中添加悬浮模型后,利用键盘控制其移动方法

简介: 今天讲一下如何通过键盘来控制其移动:监听键盘输入并根据按键调整模型的位置,然后通过调用set_model_state函数来更新模型在Gazebo中的状态

前段时间写了文章,通过修改sdf、urdf模型的方法,在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:https://developer.aliyun.com/article/1295828?spm=a2c6h.14164896.0.0.66067b0a3HOyzq


今天讲一下如何通过键盘来控制其移动:监听键盘输入并根据按键调整模型的位置,然后通过调用set_model_state函数来更新模型在Gazebo中的状态


程序举例:


首先,我们先通过一个程序,实现在指定的空间坐标生成一个指定的模型

(注意,如果要使用的话,需要修改程序中指定的模型名称和模型的路径)

# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
Author:sagima
使用Gazebo仿真环境中生成一个名为"aruco_cubo_hover"的模型
python model.py
程序运行在Python2.7环境下。
"""
import os
import rospy
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import DeleteModel, SpawnModel
from std_msgs.msg import Header
from geometry_msgs.msg import Pose, Point
# 初始化ROS节点
rospy.init_node('spawn_aruco_cubo_hover', anonymous=True)
# 定义生成模型的函数
def spawn_aruco_cubo_hover():
    model_name = "aruco_cubo_hover"
    model_path = "/home/sjh/project/Tiago_ws/src/pal_gazebo_worlds/models/aruco_cube_hover/aruco_cube_hover.sdf"
    # 在这里修改目标位置
    initial_pose = Pose(position=Point(x=0.8, y=0, z=1))
    # 从文件加载模型
    with open(model_path, "r") as f:
        model_xml = f.read()
    # 调用Gazebo的SpawnModel服务
    spawn_model = rospy.ServiceProxy('/gazebo/spawn_sdf_model', SpawnModel)
    resp_sdf = spawn_model(model_name, model_xml, "", initial_pose, "world")
    if resp_sdf.success:
        rospy.loginfo("模型 '{}' 生成成功。".format(model_name))
    else:
        rospy.logerr("模型 '{}' 生成失败。".format(model_name))
# 调用生成模型的函数
if __name__ == '__main__':
    try:
        spawn_aruco_cubo_hover()
    except rospy.ROSInterruptException:
        pass


上面的程序没有问题的话,就可以为其加入通过键盘控制的功能了


# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
Author:sagima
使用Gazebo仿真环境中生成一个名为"aruco_cubo_hover"的模型,并通过键盘控制模型运动
python model_with_keyboard_control.py
程序运行在Python2.7环境下。
"""
import os
import rospy
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import SetModelState, GetModelState
from std_msgs.msg import Header
from geometry_msgs.msg import Pose, Point
import sys
import select
import tty
import termios
# 初始化ROS节点
rospy.init_node('spawn_aruco_cubo_hover', anonymous=True)
# 保存终端设置
old_settings = termios.tcgetattr(sys.stdin)
tty.setcbreak(sys.stdin.fileno())
# 定义运动速度
move_speed = 0.1
# 定义生成模型的函数
def spawn_aruco_cubo_hover(initial_pose):
    model_name = "aruco_cubo_hover"
    model_path = "/home/sjh/project/Tiago_ws/src/pal_gazebo_worlds/models/aruco_cube_hover/aruco_cube_hover.sdf"
    # 从文件加载模型
    with open(model_path, "r") as f:
        model_xml = f.read()
    # 调用Gazebo的SpawnModel服务
    spawn_model = rospy.ServiceProxy('/gazebo/spawn_sdf_model', SpawnModel)
    resp_sdf = spawn_model(model_name, model_xml, "", initial_pose, "world")
    if resp_sdf.success:
        rospy.loginfo("模型 '{}' 生成成功。".format(model_name))
    else:
        rospy.logerr("模型 '{}' 生成失败。".format(model_name))
# 定义设置模型状态的函数
def set_model_state(model_name, pose):
    model_state = ModelState()
    model_state.model_name = model_name
    model_state.pose = pose
    set_model_state = rospy.ServiceProxy('/gazebo/set_model_state', SetModelState)
    set_model_state(model_state)
# 中文提示
print("按下以下键盘按键来控制模型运动:")
print("W: 向前移动")
print("S: 向后移动")
print("A: 向左移动")
print("D: 向右移动")
print("Q: 上升")
print("E: 下降")
print("Ctrl+C: 退出程序")
try:
    # 定义初始位置
    initial_pose = Pose(position=Point(x=0.8, y=0, z=1))
    # 主循环,持续监听键盘输入并控制模型运动
    while True:
        if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]:
            key = sys.stdin.read(1)
            if key == 'w':
                initial_pose.position.x += move_speed
            elif key == 's':
                initial_pose.position.x -= move_speed
            elif key == 'a':
                initial_pose.position.y += move_speed
            elif key == 'd':
                initial_pose.position.y -= move_speed
            elif key == 'q':
                initial_pose.position.z += move_speed
            elif key == 'e':
                initial_pose.position.z -= move_speed
            elif key == '\x03':  # Ctrl+C
                break
            # 调用设置模型状态的函数
            set_model_state("aruco_cubo_hover", initial_pose)
except rospy.ROSInterruptException:
    pass
finally:
    # 恢复终端设置
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

注意,如果要使用的话,需要修改程序中指定的模型名称和模型的路径;同时如果需要修改按键,记得在中文提示中一并修改

目录
相关文章
|
Ubuntu Linux
在Linux中如何解压 .xz 和 tar.xz 文件?
【4月更文挑战第17天】
15555 6
在Linux中如何解压 .xz 和 tar.xz 文件?
|
10月前
|
算法 机器人 Python
【启发式算法】RRT*算法详细介绍(Python)
RRT(Rapidly-exploring Random Tree Star)* 是一种用于机器人路径规划的启发式算法,它是在经典的 RRT(Rapidly-exploring Random Tree)算法的基础上进行改进的。RRT* 通过优化路径质量,能够找到最短的路径,适用于高维空间中的路径规划问题。
1519 2
|
8月前
|
人工智能 安全 Ubuntu
保姆级教程 | 在Ubuntu上部署Claude CodeUI全过程
Claude Code Plan Mode 是 Anthropic 推出的智能编程助手功能,采用只读分析模式,保障代码安全的同时提供AI驱动的项目规划与风险评估。该模式平均每周为开发者节省27小时,显著提升开发效率与项目成功率,是AI编程领域的重要创新。
10319 10
|
监控 Java Linux
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
本文是关于如何在Jetson设备上使用CSI摄像头实现RTSP流传输的详细教程,包括安装依赖、编译gst-rtsp-server、测试、源代码介绍以及如何动态获取多路流的RTSP服务器。
1534 2
Jetson 学习笔记(十二):CSI摄像头实现rtsp流的传输并对动态获取多路流进行探索
|
10月前
|
JSON JavaScript 前端开发
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
WebSocket协议具有低延迟和高实时性的特性,适用于实时数据推送。但是,它也依赖于网络条件,因此,在通过WebSocket发送数据时,保证网络稳定性也是重要的。以上步骤为建立基本的WebSocket传输提供了框架,并可以根据实际需求进行调整和优化。
659 0
|
10月前
|
JSON 缓存 API
淘宝平台关键字搜索接口接入指南(含代码示例及商品标题解析)
淘宝开放平台(TOP)提供taobao.tbk.dg.material.optional接口,支持通过关键词搜索商品并获取标题、价格等信息。本文介绍其接入方法与数据解析方式。
|
传感器 算法 机器人
机器人SLAM建图与自主导航:从基础到实践
通过Gazebo平台和gmapping算法成功生成并保存了一张二维仿真环境地图,为后续的机器人自主导航实验奠定了基础。完整代码及更多细节可参考[GitHub仓库](https://github.com/Jieshoudaxue/ros_senior/tree/main/mbot_navigation/config/move_base)。
2948 23
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
5500 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
Ubuntu 计算机视觉 C++
Ubuntu 20.04 编译 Opencv 4.11,详细步骤(带图)及报错解决,我的踩坑之旅~
Ubuntu 20.04 编译 Opencv 4.11,详细步骤(带图)及报错解决,我的踩坑之旅~
10717 0
|
存储 人工智能 数据可视化
阿里云向量引擎快速搭建企业级RAG最佳实践
本文介绍了基于阿里云搭建RAG(检索增强生成)应用的技术分享。首先回顾了RAG技术背景及其面临的挑战,如大模型幻觉、知识局限和数据安全问题。接着详细讲解了阿里云提供的RAG技术架构,涵盖数据处理、模型服务和高性能检索引擎等多方面能力。最后,通过自研引擎与开源组件的结合,展示了如何快速构建RAG应用,并提供端到端的最佳实践方案,确保系统在企业级应用中的高效性和成本优化。

热门文章

最新文章