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

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

目录
相关文章
|
9月前
|
存储 机器学习/深度学习 人工智能
Qt魔法书:打造自定义鼠标键盘脚本(二)
Qt魔法书:打造自定义鼠标键盘脚本
251 0
|
6月前
|
计算机视觉
基于鼠标事件与键盘控制的针对鼠标运动轨迹的
该文章介绍了一个基于鼠标事件和键盘控制的图像ROI截取工具的实现,包括使用OpenCV库监听鼠标事件、记录鼠标拖拽轨迹、绘制多边形ROI以及应用掩模提取感兴趣区域的代码示例和运行效果展示。
|
9月前
LabVIEW强制子VI前面板停留在其他面板前面
LabVIEW强制子VI前面板停留在其他面板前面
100 1
|
9月前
|
开发框架 Linux API
Qt魔法书:打造自定义鼠标键盘脚本(一)
Qt魔法书:打造自定义鼠标键盘脚本
99 0
|
Python
在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型
在使用ros做仿真实验时,有时会需要在空间中添加一个模型文件,使之悬浮在空间中的某个坐标,但是往往会因为重力原因,模型会直接掉落在地上
761 0
|
搜索推荐
LabVIEW设计自定义指示灯和按钮控件
LabVIEW中提供了很多内置的指示灯和按钮控件,可以实现状态的切换和控制,效果如下图所示:
|
Java
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
501 0
swing中一些常见的鼠标事件(鼠标形状的改变、鼠标接近、按下(图标的切换)、鼠标接近、离开(字体颜色的改变)、鼠标拖拽等)还有系统托盘+对话框
【selenium】鼠标控制和键盘控制
简介:【selenium】鼠标控制和键盘控制
【selenium】鼠标控制和键盘控制
|
小程序 C++
【一个整蛊人的小程序】c++,鼠标控制
【一个整蛊人的小程序】c++,鼠标控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制