ROS-Moveit机械臂追踪二维码(四)

ROS-Moveit机械臂追踪二维码(四)

在仿真环境增加相机

<gazebo reference="camera_depth_frame"><sensor name="camera1" type="depth"><always_on>true</always_on><update_rate>20.0</update_rate><camera><horizontal_fov>1.0471975511965976</horizontal_fov><image><format>R8G8B8</format><width>640</width><height>480</height></image><clip><near>0.05</near><far>8.0</far></clip></camera><plugin filename="libgazebo_ros_openni_kinect.so" name="camera_depth_frame_kinect_controller"><baseline>0.1</baseline><alwaysOn>true</alwaysOn><updateRate>10</updateRate><cameraName>camera1</cameraName><imageTopicName>rgb/image_raw</imageTopicName><cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName><depthImageTopicName>depth/image_raw</depthImageTopicName><depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName><pointCloudTopicName>depth/points</pointCloudTopicName><frameName>camera_depth_optical_frame</frameName><pointCloudCutoff>0.3</pointCloudCutoff><distortion_k1>0.0</distortion_k1><distortion_k2>0.0</distortion_k2><distortion_k3>0.0</distortion_k3><distortion_t1>0.0</distortion_t1><distortion_t2>0.0</distortion_t2><!--<CxPrime>0</CxPrime><Cx>0</Cx><Cy>0</Cy><focalLength>0</focalLength><hackBaseline>0</hackBaseline>--></plugin></sensor></gazebo><joint name="camera_rgb_joint" type="fixed"><!-- 以下rpy xyz参数为相机位置可适当修改--><origin rpy="3.142 1.5706 3.142" xyz="0.35 0 1"/><parent link="world"/><child link="camera_rgb_frame"/></joint><link name="camera_rgb_frame"><inertial><mass value="0.001"/><origin xyz="0 0 0"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><joint name="camera_rgb_optical_joint" type="fixed"><origin rpy="-1.5707963267948966 0 -1.5707963267948966" xyz="0 0 0"/><parent link="camera_rgb_frame"/><child link="camera_rgb_optical_frame"/></joint><link name="camera_rgb_optical_frame"><inertial><mass value="0.001"/><origin xyz="0 0 0"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><joint name="camera_joint" type="fixed"><origin rpy="0 0 0" xyz="-0.031 0 -0.016"/><parent link="camera_rgb_frame"/><child link="camera_link"/></joint><link name="camera_link"><visual><origin rpy="0 0 1.5707963267948966" xyz="0 0 0"/><geometry><mesh filename="package://robot_arm_urdf/meshes/kinect.dae"/></geometry></visual><collision><origin rpy="0 0 0" xyz="0.0 0.0 0.0"/><geometry><box size="0.07271 0.27794 0.073"/></geometry></collision><inertial><mass value="0.001"/><origin xyz="0 0 0"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><!-- The fixed joints & links below are usually published by static_transformers launched by the OpenNi launch files. However, for Gazebo simulation we need them, so we add them here.(Hence, don't publish them additionally!) --><joint name="camera_depth_joint" type="fixed"><origin rpy="0 0 0" xyz="0 0 0"/><parent link="camera_rgb_frame"/><child link="camera_depth_frame"/></joint><link name="camera_depth_frame"><inertial><mass value="0.001"/><origin xyz="0 0 0"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><joint name="camera_depth_optical_joint" type="fixed"><origin rpy="-1.5707963267948966 0 -1.5707963267948966" xyz="0 0 0"/><parent link="camera_depth_frame"/><child link="camera_depth_optical_frame"/></joint><link name="camera_depth_optical_frame"><inertial><mass value="0.001"/><origin xyz="0 0 0"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><gazebo reference="camera_link"><material>Gazebo/Black</material></gazebo>
</robot>

生成AR码Model

git clone https://github.com/mikaelarguedas/gazebo_models.git

参考其README

移动到/ar_tags/scripts

执行命令格式如下:

$ ./generate_markers_model.py -h
usage: generate gazebo models for AR tagsoptional arguments:-h, --help            show this help message and exit-i IMAGES_DIR, --images-dir IMAGES_DIRdirectory where the marker images are located(default: $HOME/gazebo_models/ar_tags/images)-g GAZEBODIR, --gazebodir GAZEBODIRGazebo models directory (default:$HOME/.gazebo/models)-s SIZE, --size SIZE  marker size in mm (default: 500)-v, --verbose         verbose mode (default: False)-w WHITE_CONTOUR_SIZE_MM, --white-contour-size-mm WHITE_CONTOUR_SIZE_MMAdd white contour around images, default to no contour(default: 0)./generate_markers_model.py -i IMAGE_DIRECTORY -g GAZEBO_MODELS_DIRECTORY -s SIZE_IN_MILLIMETER -w CONTOUR_SIZE_IN_MM

执行以下命令:

./generate_markers_model.py  -s 90

可获得90x90的Ar markers model,模型文件默认保存目录为$HOME/.gazebo/models

建立launch文件

ar_track_param.launch

    <launch><arg name="marker_size" default="9" /> <arg name="max_new_marker_error" default="0.08" /><arg name="max_track_error" default="0.2" /><arg name="cam_image_topic" default="/camera1/rgb/image_raw" /><arg name="cam_info_topic" default="/camera1/rgb/camera_info" /><arg name="output_frame" default="/base_link" /><node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" respawn="false" output="screen"><param name="marker_size"           type="double" value="$(arg marker_size)" /><param name="max_new_marker_error"  type="double" value="$(arg max_new_marker_error)" /><param name="max_track_error"       type="double" value="$(arg max_track_error)" /><param name="output_frame"          type="string" value="$(arg output_frame)" /><remap from="camera_image"  to="$(arg cam_image_topic)" /><remap from="camera_info"   to="$(arg cam_info_topic)" /></node></launch>

arg参数可适当修改

建立py文件

moveit_track_demo.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy, sys
import moveit_commander
import tf
import threading
from moveit_msgs.msg import RobotTrajectory
from trajectory_msgs.msg import JointTrajectoryPoint
from ar_track_alvar_msgs.msg import AlvarMarkers, AlvarMarker
from geometry_msgs.msg import PoseStamped, Posex = 0
y = 0
z = 0
ox = 0
oy = 0
oz = 0
zw = 0  
# 初始化move_group的API
moveit_commander.roscpp_initialize(sys.argv)               
# 初始化需要使用move group控制的机械臂中的arm group
arm = moveit_commander.MoveGroupCommander('arm_group')
# 初始化需要使用move group控制的机械臂中的gripper group
gripper = moveit_commander.MoveGroupCommander('hand_group')       
# 获取终端link的名称
end_effector_link = arm.get_end_effector_link()                       
# 设置目标位置所使用的参考坐标系
reference_frame = 'base_link'
arm.set_pose_reference_frame(reference_frame)              
# 当运动规划失败后,允许重新规划
arm.allow_replanning(True)      
# 设置位置(单位:米)和姿态(单位:弧度)的允许误差
arm.set_goal_position_tolerance(0.01)
arm.set_goal_orientation_tolerance(0.05)
gripper.set_goal_joint_tolerance(0.001)        
# 控制机械臂先回到初始化位置
#arm.set_named_target('home')
#arm.go()
# 设置机器臂当前的状态作为运动初始状态
arm.set_start_state_to_current_state()
target_pose = PoseStamped()
a = 1 
def Listener():rospy.init_node('listener', anonymous=True)rospy.Subscriber("/ar_pose_marker",AlvarMarkers,ar_pose, queue_size=1)rospy.spin()
def ar_pose(data):x = data.markers[0].pose.pose.position.xy = data.markers[0].pose.pose.position.yz = data.markers[0].pose.pose.position.zox = data.markers[0].pose.pose.orientation.xoy = data.markers[0].pose.pose.orientation.yoz = data.markers[0].pose.pose.orientation.zow = data.markers[0].pose.pose.orientation.wtarget_pose.header.frame_id = reference_frametarget_pose.header.stamp = rospy.Time.now()     target_pose.pose.position.x =  x-0.08target_pose.pose.position.y = ytarget_pose.pose.position.z = z+0.03target_pose.pose.orientation.x = 0.911822target_pose.pose.orientation.y = -0.0269758target_pose.pose.orientation.z = 0.285694target_pose.pose.orientation.w = -0.293653print(target_pose)# 设置机械臂终端运动的目标位姿arm.set_pose_target(target_pose, end_effector_link)arm.go()# rospy.sleep(1)global aa+=1print(" count ",a) # 关闭并退出moveit#moveit_commander.roscpp_shutdown()#moveit_commander.os._exit(0)print("清除") 
if __name__ == "__main__":Listener()

执行

roslaunch moveit_ros_robot_arm full_robot_arm_sim.launch

roslaunch moveit_progect ar_track_param.launch

rosrun moveit_progect moveit_track_demo.py

演示视频: https://www.bilibili.com/video/BV1k8411S7fo/?spm_id_from=333.999.0.0&vd_source=b57e293dfa3402722a1522f3d1c08c97

image-20230722171206584

参考文章:
ROS机械臂控制之跟踪二维码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KnowStreaming系列教程第二篇——项目整体架构分析

一、KS项目代码结构&#xff1a; ks项目代码结构如上&#xff1a; (1)km-console 是前端部分&#xff0c;基于React开发 (2)km-rest 是后端部分&#xff0c;主要是接受前端请求&#xff0c;对应controller相关代码所在模块 (3)km-biz:业务逻辑处理 (4)km-core:核心逻辑 (5…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

Java_23_并发包

并发包 并发包的来历&#xff1a; 在实际开发中如果不需要考虑线程安全问题&#xff0c;大家不需要做线程安全&#xff0c;因为如果做了反而性能不好&#xff01; 但是开发中有很多业务是需要考虑线程安全问题的&#xff0c;此时就必须考虑了。否则业务出现问题。 Java为很多业…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的&#xff0c;变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9&#xff0c;且已完成docker的构建 二、安装mysql5.7 安装镜像&#xff1a;[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器&#xff0c;且分配端口号[rootlocalhost lll]# dock…

JVM(Java Virtual Machine)

哥几个来学 JVM 啦~~ 目录 &#x1f332;一、JVM 执行流程&#xff08; JVM 是如何运行的&#xff1f;&#xff09; &#x1f333;二、JVM 运行时数据区 &#x1f366;1. 堆&#xff08;线程共享&#xff09; &#x1f367;2. Java 虚拟机栈&#xff08;线程私有&#xff0…

关于我组件家庭服务器,挑选硬件设备的经历

目录 起因 升级——玩客云 原因 折腾日记 又升级——d2550工控主机 原因 折腾日记 又双升级——itx主机 原因 折腾日记 又双叒升级&#xff08;目前再用的机器&#xff09;——i9级x99平台e5v3主机 原因 折腾日记 心得 起因 起因大概在今年三月底四月初的时候&…

DuckDB全面挑战SQLite

概要 当我们想要在具有嵌入式数据库的本地环境中工作时&#xff0c;我们倾向于默认使用 SQLite。虽然大多数情况下这都很好&#xff0c;但这就像骑自行车去 100 公里之外&#xff1a;可能不是最好的选择。 这篇文章中将讨论以下要点&#xff1a; • DuckDB 简介&#xff1a;它…

uniapp WIFI上下班打卡

大纲 &#x1f959; uniapp官网&#xff1a;uni-app官网 &#x1f959; WIFI功能模块&#xff1a; 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE &#xff08;访问权限状态&#xff09; 2. CHANGE_WIFI_STATE&#xff…

SpringBoot整合ActiveMQ

ActiveMQ简单使用 JMS ActiveMQ 下载安装 https://activemq.apache.org/components/classic/download/解压缩文件。进入win64目录&#xff0c;双击运行activemq.bat文件&#xff0c;运行服务 将下面的网址输入到浏览器&#xff0c;用户名和密码都是admin SpringBoot整合Act…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展&#xff0c;外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业&#xff0c;可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化&#xff0c;我们在这里提供了一些提…

异构线程池的c++实现方案

概要 通常线程池是同质的&#xff0c;每个线程都可以执行任意的task&#xff08;每个线程中的task顺序执行&#xff09;&#xff0c;如下图所示&#xff1a; 但本文所介绍的线程和task之间有绑定关系&#xff0c;如A task只能跑在A thread上&#xff08;因此称为异构线程池&am…

2023云曦期中复现

目录 SIGNIN 新猫和老鼠 baby_sql SIGNIN 签到抓包 新猫和老鼠 看到反序列化 来分析一下 <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0);class mouse { public $v;public function __toString(){echo "Good. You caught the mouse:&…

Apache pulsar 技术系列-- 消息重推的几种方式

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。在很多场景下&#xff0c;用户需要通过 MQ 实现消息的重新推送能力&#xff0c…

Python+Playwright自动化测试--标签页操作(tab)

1.简介 标签操作其实也是基于浏览器上下文&#xff08;BrowserContext&#xff09;进行操作的&#xff0c;而且宏哥在之前的BrowserContext也有提到过&#xff0c;但是有的童鞋或者小伙伴还是不清楚怎么操作&#xff0c;或者思路有点模糊&#xff0c;因此今天单独来对其进行讲…

nvidia-smi输出的结果代表什么

nvidia-smi(NVIDIA System Management Interface) 是基于nvml的gpu的系统管理接口,主要用于显卡的管理和状态监控。 nvidia-smi简称NVSMI&#xff0c;提供监控GPU使用情况和更改GPU状态的功能&#xff0c;是一个跨平台工具&#xff0c;支持所有标准的NVIDIA驱动程序支持的Linu…

【RS】基于规则的面向对象分类

ENVI使用最多的工具就是分类&#xff0c;这也是很多卫星影像的用途。在ENVI中有很多分类工具&#xff0c;如最基础的监督分类&#xff08;最大似然法、最小距离、支持向量机、随机森林&#xff09;、非监督分类&#xff08;K-means、IsoData&#xff09;&#xff0c;还有面向对…

13、PHP面向对象2(方法的访问控制、子类继承、常量)

1、类中的方法可以被定义为公有&#xff0c;私有或受保护。如果没有设置这些关键字&#xff0c;则该方法默认为公有。 public定义的方法&#xff0c;可以在类外使用。 protected定义的方法&#xff0c;只能在本类或子类的定义内使用。 private定义的方法&#xff0c;只能在本…

ubuntu开机自启动

ubuntu开机自启动 1、建一个test.sh脚本&#xff0c;并写入 #!/bin/sh gnome-terminal -x bash -c ‘cd /home/文件路径/;python3 main.py’ exit 0 2、:wq!保存 3、创建rc-local.service文件&#xff08;sudo vim /etc/systemd/system/rc-local.service&#xff09;&#xf…