在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)

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

目录
相关文章
QT+OpenGL鼠标操作和模型控制
光线追踪法 从鼠标投射 3D 射线, 通过摄像机,进入场景,然后检查该光线是否与某个对象相交。
373 0
|
4月前
|
计算机视觉
基于鼠标事件与键盘控制的针对鼠标运动轨迹的
该文章介绍了一个基于鼠标事件和键盘控制的图像ROI截取工具的实现,包括使用OpenCV库监听鼠标事件、记录鼠标拖拽轨迹、绘制多边形ROI以及应用掩模提取感兴趣区域的代码示例和运行效果展示。
|
7月前
|
弹性计算 Ubuntu 数据安全/隐私保护
|
Python
在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型
在使用ros做仿真实验时,有时会需要在空间中添加一个模型文件,使之悬浮在空间中的某个坐标,但是往往会因为重力原因,模型会直接掉落在地上
682 0
LabVIEW鼠标移动显示曲线坐标值
实现功能:将鼠标放在波形图曲线上,可以显示出横轴及纵轴的值(坐标值)。 代码思想:注册鼠标移动事件,字符串显示控件显示坐标
172 0
win10怎么调鼠标灵敏度(Win10鼠标滑轮灵敏度怎么设置)
win10怎么调鼠标灵敏度(Win10鼠标滑轮灵敏度怎么设置)
931 0
|
Java
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
488 0
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
【selenium】鼠标控制和键盘控制
简介:【selenium】鼠标控制和键盘控制
【selenium】鼠标控制和键盘控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制