rviz仿真底盘移动与云台击打

2023-05-16

rviz仿真底盘移动与云台击打

底盘与云台通过坐标轴来模拟,目标方块与子弹可视化通过marker仿真。
其中底盘与云台固连,底盘xy方向移动云台会同步移动,云台可进行pitch和yaw轴旋转,通过简单算法可实现云台跟随目标点,再发射出模拟子弹通过物理推导坠落进行模拟击打。

图片:在这里插入图片描述

rviz仿真代码

#!/usr/bin/env python 
import roslib
import rospy
import tf
import math
from geometry_msgs.msg import Twist
from visualization_msgs.msg import *
from geometry_msgs.msg import Point
current_time,last_time,delta_time=0,0,0
x,y=0,0				#initializes chassis and gimabal position
x0,y0=0,0			#initializes the trajectory of the bullet
twist_x,angular_z=0,0
thetachassis=0
position_x,position_y,position_z=1,2,3	#initializes the position of the strike cube
id,i = 0,0

#teleop control callback
def callback(twist):
    global twist_x
    global angular_z
    twist_x = twist.linear.x
    angular_z = twist.angular.z
    #rospy.loginfo("%f",twist.linear.x)
    #rospy.loginfo("%f",twist_x)
    #rospy.loginfo("%f",angular_z) 

# target cube callback
def positioncallback(position):
	global position_x
	global position_y
	global position_z
	rospy.loginfo("%f  %f  %f",position.x,position.y,position.z)
	position_x = position.x
	position_y = position.y
	position_z = position.z

if __name__=="__main__":
	rospy.init_node('tf_broadcaster')
	rospy.Subscriber('cmd_vel', Twist, callback)
	topic = 'visualization_marker_array'
	topic3 = 'draw_bullet_tracks'
	topic4 = 'draw_target_points'
	publisher = rospy.Publisher(topic, MarkerArray,queue_size = 100)
	publisherpoint = rospy.Publisher(topic4, Marker,queue_size = 100)
	count = 0
	markerArray = MarkerArray()
	rospy.Subscriber("point3d", Point, positioncallback)
	while not rospy.is_shutdown():
		#target strike cube visualization
		marker1 = Marker()
		marker1.header.frame_id = "/world"
		marker1.type = Marker.CUBE
		marker1.action = Marker.ADD
		marker1.ns = 'Testline'
		marker1.scale.x = 0.5
		marker1.scale.y = 0.5
		marker1.scale.z = 0.5
		marker1.color.a = 1.0
		marker1.color.r = 1.0
		marker1.color.g = 1.0
		marker1.color.b = 0.0
		marker1.pose.orientation.w = 1.0
		marker1.pose.position.x = position_x
		marker1.pose.position.y = position_y
		marker1.pose.position.z = position_z
		marker1.id=0
		publisherpoint.publish(marker1)
		
		#get delta time
		last_time=current_time
		current_time = rospy.Time.now().to_sec()
		delta_time=current_time-last_time

		#create gimbal and chassis axes
		br1 = tf.TransformBroadcaster()
		br2 = tf.TransformBroadcaster()
		thetachassis=thetachassis+angular_z*delta_time
		x=x+delta_time*twist_x*math.cos(thetachassis)
		y=y+delta_time*twist_x*math.sin(thetachassis)
		
		#get gimabal pitch and yaw
		ninea_y=position_y-y
		ninea_x=position_x-x
		ninea_z=position_z-1
		pitch=math.atan2((ninea_y),(ninea_x))
		s=math.sqrt(position_x*position_x+position_y*position_y)
		v=10
  		yaw=-math.atan((2*math.pow(v,2)*s-math.sqrt(4*math.pow(v,4)*math.pow(s,2)-8*9.8*math.pow(v,2)*math.pow(s,2)*position_z-4*9.8*9.8*math.pow(s,4)))/(2*9.8*math.pow(s,2)))+0.1
		
		#send the tf transform
		br1.sendTransform((x,y,1.0),
						tf.transformations.quaternion_from_euler(0, yaw,pitch),
						rospy.Time.now(),
						"gimbal",
						"world")
		br2.sendTransform((x,y,0.0),
						tf.transformations.quaternion_from_euler(0, 0,thetachassis),
						rospy.Time.now(),
						"chassis",
						"world")
		if i ==0:
			yaw0,pitch0=yaw,pitch
			i+=1
		#bullet visualization
		marker = Marker()
  		marker.header.frame_id = "/world"
		marker.type = marker.SPHERE
		marker.action = marker.ADD
		marker.scale.x = 0.1
		marker.scale.y = 0.1
		marker.scale.z = 0.1
		marker.color.a = 1.0
		marker.color.r = 1.0
		marker.color.g = 1.0
		marker.color.b = 0.0
		marker.pose.orientation.w = 1.0
		#simulate time
		if(count>1):
			count=0
			print("refresh bullet")
			#get current position and posture
			x0,y0=x,y
			yaw0,pitch0=yaw,pitch
		marker.pose.position.x = v*math.cos(yaw0)*(1-math.pow(2.71828,-count))*math.cos(pitch0)+x0
		marker.pose.position.y = v*math.cos(yaw0)*(1-math.pow(2.71828,-count))*math.sin(pitch0)+y0
		marker.pose.position.z = (9.8+v*math.sin(-yaw))*(1-math.pow(2.71828,-count))-9.8*count+1
		markerArray.markers.append(marker)
		#amend id
		for m in markerArray.markers:
			m.id = id
			id += 1
			if id == 10:
				id=5
		publisher.publish(markerArray)
		count += 0.01
		rospy.sleep(0.01)

键盘控制代码


    #include <termios.h>
    #include <signal.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/poll.h>
     
    #include <boost/thread/thread.hpp>
    #include <ros/ros.h>
    #include <geometry_msgs/Twist.h>
     
    #define KEYCODE_W 0x77
    #define KEYCODE_A 0x61
    #define KEYCODE_S 0x73
    #define KEYCODE_D 0x64
     
    #define KEYCODE_A_CAP 0x41
    #define KEYCODE_D_CAP 0x44
    #define KEYCODE_S_CAP 0x53
    #define KEYCODE_W_CAP 0x57
     
    class SmartCarKeyboardTeleopNode
    {
        private:
            double walk_vel_;
            double run_vel_;
            double yaw_rate_;
            double yaw_rate_run_;
            
            geometry_msgs::Twist cmdvel_;
            ros::NodeHandle n_;
            ros::Publisher pub_;
     
        public:
            SmartCarKeyboardTeleopNode()
            {
                pub_ = n_.advertise<geometry_msgs::Twist>("cmd_vel", 1);
                
                ros::NodeHandle n_private("~");
                n_private.param("walk_vel", walk_vel_, 0.5);
                n_private.param("run_vel", run_vel_, 1.0);
                n_private.param("yaw_rate", yaw_rate_, 1.0);
                n_private.param("yaw_rate_run", yaw_rate_run_, 1.5);
            }
            
            ~SmartCarKeyboardTeleopNode() { }
            void keyboardLoop();
            
            void stopRobot()
            {
                cmdvel_.linear.x = 0.0;
                cmdvel_.angular.z = 0.0;
                pub_.publish(cmdvel_);
            }
    };
     
    SmartCarKeyboardTeleopNode* tbk;
    int kfd = 0;
    struct termios cooked, raw;
    bool done;
     
    int main(int argc, char** argv)
    {
        ros::init(argc,argv,"tbk", ros::init_options::AnonymousName | ros::init_options::NoSigintHandler);
        SmartCarKeyboardTeleopNode tbk;
        
        boost::thread t = boost::thread(boost::bind(&SmartCarKeyboardTeleopNode::keyboardLoop, &tbk));
        
        ros::spin();
        
        t.interrupt();
        t.join();
        tbk.stopRobot();
        tcsetattr(kfd, TCSANOW, &cooked);
        
        return(0);
    }
     
    void SmartCarKeyboardTeleopNode::keyboardLoop()
    {
        char c;
        double max_tv = walk_vel_;
        double max_rv = yaw_rate_;
        bool dirty = false;
        int speed = 0;
        int turn = 0;
        
        // get the console in raw mode
        tcgetattr(kfd, &cooked);
        memcpy(&raw, &cooked, sizeof(struct termios));
        raw.c_lflag &=~ (ICANON | ECHO);
        raw.c_cc[VEOL] = 1;
        raw.c_cc[VEOF] = 2;
        tcsetattr(kfd, TCSANOW, &raw);
        
        puts("Reading from keyboard");
        puts("Use WASD keys to control the robot");
        puts("Press Shift to move faster");
        
        struct pollfd ufd;
        ufd.fd = kfd;
        ufd.events = POLLIN;
        
        for(;;)
        {
            boost::this_thread::interruption_point();
            
            // get the next event from the keyboard
            int num;
            
            if ((num = poll(&ufd, 1, 250)) < 0)
            {
                perror("poll():");
                return;
            }
            else if(num > 0)
            {
                if(read(kfd, &c, 1) < 0)
                {
                    perror("read():");
                    return;
                }
            }
            else
            {
                if (dirty == true)
                {
                    stopRobot();
                    dirty = false;
                }
                
                continue;
            }
            
            switch(c)
            {
                case KEYCODE_W:
                    max_tv = walk_vel_;
                    speed = 1;
                    turn = 0;
                    dirty = true;
                    break;
                case KEYCODE_S:
                    max_tv = walk_vel_;
                    speed = -1;
                    turn = 0;
                    dirty = true;
                    break;
                case KEYCODE_A:
                    max_rv = yaw_rate_;
                    speed = 0;
                    turn = 1;
                    dirty = true;
                    break;
                case KEYCODE_D:
                    max_rv = yaw_rate_;
                    speed = 0;
                    turn = -1;
                    dirty = true;
                    break;
                    
                case KEYCODE_W_CAP:
                    max_tv = run_vel_;
                    speed = 1;
                    turn = 0;
                    dirty = true;
                    break;
                case KEYCODE_S_CAP:
                    max_tv = run_vel_;
                    speed = -1;
                    turn = 0;
                    dirty = true;
                    break;
                case KEYCODE_A_CAP:
                    max_rv = yaw_rate_run_;
                    speed = 0;
                    turn = 1;
                    dirty = true;
                    break;
                case KEYCODE_D_CAP:
                    max_rv = yaw_rate_run_;
                    speed = 0;
                    turn = -1;
                    dirty = true;
                    break;              
                default:
                    max_tv = walk_vel_;
                    max_rv = yaw_rate_;
                    speed = 0;
                    turn = 0;
                    dirty = false;
            }
            cmdvel_.linear.x = speed * max_tv;
            cmdvel_.angular.z = turn * max_rv;
            pub_.publish(cmdvel_);
        }
    }

放在功能包编译完即可运行,运行时先打开rviz,调出marker和tf标签,再运行仿真代码即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rviz仿真底盘移动与云台击打 的相关文章

  • rviz仿真背景很暗的处理方法

    最近在学习ros仿真的时候发现 xff1a rvix仿真中心界面很暗 xff0c 看着那是相当的难受 界面中与alpha相关的参数不管怎么调 xff0c 甚至于file open config中重新调用配置文件 配置文件中alpha修改为1
  • rviz

    我发现小觅和T265最后安装好后都是通过rviz查看图像 小觅可以见它的官网SDK教程 xff0c 这里我先不暂时写 xff0c 因为时间有限 https blog csdn net zhengjieCYD article details
  • Ubuntu20.04.2+ROS noetic打开rviz报错:...symbol lookup error...librviz.so: undefined symbol:

    打开rviz闪退 xff0c shell显示如下 xff1a 一开始我的独立显卡是安装好了的 xff0c 界面显示的OpenGL也是独显的 xff0c 但是用的其他博客的方法 xff1a span class token function
  • Arbotix+Rviz——基于Ubuntu20.04

    1 Arbotix简介 ArbotiX是一款控制电机 舵机的硬件控制板 xff1b 提供了相应的ROS功能包 xff1b 提供了一个差速控制器 xff0c 通过接收速度控制指令 xff0c 更新机器人的里程计状态 一 安装Arbotix g
  • rviz中机器人的位姿和gazebo中机器人的位姿不一致

    当在运行ROS机器人gazebo和rviz联合仿真的时候 xff0c rviz中机器人的位姿和gazebo中机器人的位姿不一致 xff0c 解决方案 xff1a 可以使用rviz上方工具栏中 的2D Pose estimate 工具 xff
  • rviz和tf树报错修改

    跟着这个博主进行多机器人仿真 xff0c 一直出错 xff0c 有点崩溃了 ROS仿真笔记之 基于gazebo的ROS多机器人仿真 gwpscut的博客 CSDN博客 TF REPEATED DATA warnings ROS Answer
  • MoveIt的使用(三)机械臂在rviz中的可视化以及编程控制

    在第一篇文章中 xff0c 我们实现了从solidworks到urdf文件的转换 xff0c 第二篇文章 xff0c 主要介绍了MoveIt xff01 Setup Assistant的配置 xff0c 以及机械臂的初步可视化 xff0c
  • rviz远程查看机器人显示

    1 使用rviz远程查看机器人显示 1 1 已有设备 本地主机 ip为192 168 2 102 机器人主机 ip192 168 2 104 主机名 xff1a hhh 2 配置本地 bashrc sudo gedit bashrc 输入
  • rviz无法显示的问题

    1 启用初始化配置 首先删除保存好的rviz xff0c 运行最初始化的配置 rviz运行后会选择保存在 home cbc rviz default rviz 删除之后 xff0c 重新运行 xff1a roscore rosrun rvi
  • Ubuntu 16.04+ROS kinetic+rviz模拟turtlebot机器人时出现的问题-

    鉴于ROS kinetic 版本主能兼容 ubuntu 16 04和15 01版本 xff0c 而16 04的版本由于环境比较新 xff0c 感觉还有很多问题需要解决 博主在进行RVIZ模拟仿真机器人跑时 xff0c 出现了以下问题 xff
  • ROS教程(四):RVIZ使用教程(详细图文)

    ros教程 xff1a rviz使用教程 文章目录 前言一 RVIZ介绍1 数据类型介绍2 界面介绍 二 发送基础形状至RVIZ xff08 C 43 43 xff09 1 创建程序包2 创建节点3 编辑代码如下 xff08 示例 xff0
  • 解决gazebo中urdf模型显示不正常的问题,rviz中显示模型

    之前使用roslaunch将urdf模型加载到rosparam参数服务器中 而在rviz中模型颜色显示正常 xff0c gazebo中显示白色 正确的解决办法是 xff1a 单独文件materials xacro中定义材料的性质 lt xm
  • 远程调试使用rviz的问题

    在远程调试过程中 xff0c 尤其是在建图过程中 xff0c 经常需要用到rviz xff0c 需要在bashrc文件里面进行端口绑定 输入 1 在远程电脑输入 xff1a gedit bashrc 进入bashrc文件 xff0c 假设本
  • rviz更改机器人位置,不考虑gazebo环境。

    文章目录 问题描述解决方案 问题描述 在RVIZ中想要去更改机器人模型位置 xff0c 但不想考虑gazebo的各种因素 xff0c 只想通过别人给的数据流去实时更改机器人在rviz中的位置 解决方案 首先 xff0c 先将原理弄清楚 在R
  • 智能小车建图导航-在rviz中导航(运行)

    笔记来源 xff1a 机器人开发与实践 xff08 古月 xff09 或者直接运行这个脚本文件 xff1a xff08 如果你没有在 bracsh文件中加入source xff0c 建议加入或者在脚本文件的上面中添加source xff0c
  • rviz仿真底盘移动与云台击打

    rviz仿真底盘移动与云台击打 底盘与云台通过坐标轴来模拟 xff0c 目标方块与子弹可视化通过marker仿真 其中底盘与云台固连 xff0c 底盘xy方向移动云台会同步移动 xff0c 云台可进行pitch和yaw轴旋转 xff0c 通
  • 运行Gazebo+moveit+Rviz,报错,提示无控制器

    在rviz里规划成功后 xff0c 执行显示failed rviz里能规划 xff0c 但是Gazebo里动不了 moveit报错如下 xff1a WARN 1679466487 132361192 26 763000000 Waiting
  • rviz显示urdf模型:No transform from [base_link] to [base_footprint]

    问题描述 No transform from base link to base footprint 创建URDF模型在rviz中显示时 xff0c 可以显示模型形状 xff0c 但不显示颜色 xff0c 如下图 xff1a 问题分析 rv
  • Rviz 使用Arbotix控制机器人运动

    需求 控制机器人模型在 rviz 中做圆周运动 实现流程 安装 Arbotix创建新功能包 xff0c 准备机器人 urdf xacro 文件添加 Arbotix 配置文件编写 launch 文件配置 Arbotix启动 launch 文件
  • ROS--URDF集成Gazebo仿真小车和rviz结合

    ROS URDF集成Gazebo仿真小车 实现流程 需要编写封装惯性矩阵算法的 xacro 文件 为机器人模型中的每一个 link 添加 collision 和 inertial 标签 xff0c 并且重置颜色属性 在 launch 文件中

随机推荐

  • Cmake 3 动态链接库

    代码地址 cmake examples 01 basic D shared library at master ttroy50 cmake examples GitHub 文件结构 1 添加动态链接库 和静态链接一样 这个add libra
  • PelcoD_协议指令分析

    通过协议收发控制第三方云台转动 一般的云台指令协议格式例如 xff1a span class token comment 发送带正负号的垂直角度 span span class token keyword float span vert a
  • 【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

    Esp32 Arduino 串口中断函数 缓冲区修改 一 前景描述1 遇到的问题2 开发环境 二 解决问题1 示例代码2 代码缺陷2 解决办法 三 最后的话 一 前景描述 最近需要用Esp32上传数据 xff0c 有一块数据采集板 xff0
  • C++程序编译过程

    C 43 43 程序编译的四个步骤 xff1a 编译预处理 xff0c 编译优化 xff0c 汇编 xff0c 链接 编译预处理 xff1a 处理以 开头的指令 xff0c 将源码 cpp 文件处理成 i 文件 编译优化 xff1a 将 i
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • vscode、idea、vim 开发工具快捷键

    vscode vscode快捷键文字版 配置启用 禁用 VSCodeVim 插件的快捷键 xff1a Vim Toggle Vim Mode 项 配置启用 vimrc 文件 idea 配置启用 禁用 Idea Vim 插件的快捷键 xff1
  • TDK一体化 IMU 评估板SmartBug2.0 像七星瓢虫一样可爱

    继 2019 年最初的 SmartBug 取得成功后 xff0c 2023 年 1 月初 xff0c TDK 公司宣布宣布推出 InvenSense SmartBug 2 0 评估板 SmartBug2 0 外观与 SmartBug 相似
  • C++ 指针(二)char与指针

    一 char字符串数组和char指针 上一小节对指针的操作进行简单的介绍 xff0c 本小节主要介绍的是char类型和指针之间的一些联系 xff08 虽然使用std string很方便 xff0c 但是我觉得了解这个还是有必要的 xff09
  • stm32f103单线半双工uart通信程序

    文章目录 前言 一 使用步骤 1 打开STMcubemx 2 添加代码 总结 前言 在使用数字舵机时 所用到的通信方式为uart通信 但舵机只有三根接线 出去vcc和gnd 只有一条通信线 也就是说要实现双向通信 只能使用单线半双工模式 本
  • BlueROV加舵机控制以及走过的弯路

    BlueROV加舵机控制以及走过的弯路 因实验需求 xff0c 需要在BlueROV上加上一个一自由度的机械臂 xff0c 由一个水下舵机控制 xff0c 水下舵机需要通过PWM控制 xff0c PWM输出由手柄控制 思路也很简单 xff1
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • UART、RS232 、RS485 区别

    UART RS232 RS485 区别 UART RS232 RS485这些物理层的串口通信 xff0c 它们都是在同一时间发送一位 RS232 RS485只是串口通讯的变种 xff0c 理解了UART串口通讯 xff0c 那么RS232和
  • 在STM32中使用printf()的方法(可直接复制粘贴)

    1 使用printf的方法 1 1 重定向 在使用printf之前添加重定向代码 xff1a span class token macro property span class token directive hash span span
  • 【字符串】字符串长度与字节长度

    字符串长度 xff1a 字符串在遇到 0 之前一共有几个字符 字节长度 字符串里出现的所有元素 例如 xff1a char str 61 123abc 0123 字符串长度 xff1a 6 字节长度 xff1a 11 PS xff1a 如果
  • C语言-字符串拼接(不用strcat函数)

    include lt stdio h gt int main char str1 100 char str2 100 int i 61 0 j 61 0 printf 34 请输入字符串1 xff1a n 34 gets str1 prin
  • Qt(十四)——实现机器人完整导航功能

    Qt xff08 十四 xff09 实现机器人完整导航功能 目录 1 ui 设计2 核心代码 1 ui 设计 2 核心代码
  • vector容器存放自定义数据类型及指针

    include lt iostream gt using namespace std include lt vector gt class person public person string a int b name a age b s
  • unreal 启动报错:运行引擎需要D3D11兼容GPU(功能级别11.0,着色器模型5.0)处理

    问题 AMD核显电脑 xff0c 突然有一天开机后显示器显示效果发白 xff0c 刚开始没在意 xff0c 后来某天想使用Unreal时发现启动不了了 xff0c 弹窗报错 xff1a 运行引擎需要D3D11兼容GPU xff08 功能级别
  • Win10 RealSense L515 ORBSLAM2 配置全攻略

    目录 背景简介Step 1 准备 SDKStep 2 连接设备Step 3 测试例程Step 4 配置环境Step 5 相机标定Step 6 编写入口Step 7 实地运行附录A xff1a 获取内参代码附录B xff1a yaml 参数文
  • rviz仿真底盘移动与云台击打

    rviz仿真底盘移动与云台击打 底盘与云台通过坐标轴来模拟 xff0c 目标方块与子弹可视化通过marker仿真 其中底盘与云台固连 xff0c 底盘xy方向移动云台会同步移动 xff0c 云台可进行pitch和yaw轴旋转 xff0c 通