当前位置: 首页 > news >正文

使用外骨骼灵活远程控制协作机器人案例

外骨骼控制器采用可调节结构,简化了机器人编程,使协作机器人 FR3 的远程控制变得容易。

一、引言

在开发机器人手臂或双臂系统的应用程序时,经常会遇到以下挑战:

1. 使用拖动和示教进行定位的困难:拖动和示教功能通常效率低下且劳动密集。

2. 示教器效率低下: 使用示教器进行路径编程复杂、容易出错且效率低下。

3. 与人体运动不匹配:将双臂机器人运动与自然人体运动保持一致具有挑战性,使运动数据收集复杂化。

4. 远程控制限制:由于对碰撞或开发要求的担忧,对远程控制的需求一直很高。

myController S570 是应对这些挑战的理想工具,因为它专为机器人系统的远程控制和运动数据收集而设计。主要功能包括:

● 可调接头:J3 和 J4 之间的角度可以通过扭动螺丝自由调整(90° 或 0°),允许修改 DH 模型参数以兼容各种 6 DOF 机械臂。

● 高性能:凭借快速的数据采集和近乎零的延迟,控制器与各种机器人无缝集成,用于数据接口和控制。

我们将使用 FR3 协作机器人来演示如何无缝调整外骨骼控制器以远程作协作机器人。

二、硬件介绍

Elephant Robotics myController S570

myController S570 是大象机器人首款便携外骨骼数据采集设备,具备便携式穿戴、精准动作捕捉和高度开源等特性,涵盖数据采集、遥操作、端到端应用开发等场景,助力研究人员与开发者,在教育培训中结合人形、轮式等机器人,拓宽教学科研实践,促进知识技能传播与掌握。

三、项目

在构建项目时,需要注意以下问题:

● 如何将外骨骼的运动与受控机械臂对齐?

● 应使用什么通讯方式进行控制?

● 如何构建项目?

1. 将外骨骼运动控制与机械臂对齐

DH 模型的概念是机器人运动学的基础,美国机械工程师协会的文章提供了一个通用标准,阐明了机器人的运动计算方法。

由于外骨骼和机械臂具有不同的机械结构,因此它们也具有不同的 DH 模型,需要运动映射过程。

可以采用两种方法来建立运动映射。

方法 1:使用模拟工具(例如 ROS-RViz)

通过 ROS 仿真,您可以在不为机器人供电的情况下比较外骨骼控制器和机械臂的关节方向,从而快速识别 0° 位置偏移并简化关节角度映射。

方法 2:使用 DH 模型获取控制器的正向运动学

在得到控制器的 3D 坐标和欧拉角(X、Y、Z、A、B、C)后,可以通过机器人的 API 发送 MoveL(X、Y、Z、A、B、C、vel、acc、dec、P)命令,将数据直接应用于机器人。或者,您可以在 DH 模型中调整链接长度,以重新计算运动学并获取机器人控制的笛卡尔坐标。

此外,外骨骼的 DH 信息可以从其开源 URDF 模型派生。

我们将使用方法 1 来控制协作机器人 FR3。

2. 控制方法

整个控制系统由三个主要部分组成:外骨骼控制器PC 和受控机械臂。计算机充当中介,通过数据线连接到外骨骼控制器,并通过 API 获取双臂 14 DOF 的实时信息。然后,数据被处理并通过制造商提供的方法用于控制机械臂。

我们可以使用 ROS 进行模拟和数据处理。ROS 基于主题的通信机制支持在同一项目中同时使用 Python 和 C++,与硬件 API 具有出色的兼容性。这种方法不仅允许在联合接口后无缝添加发布者和订阅者,而且还有助于高效传输联合角度信息。

3. 项目设置

该项目是在 Ubuntu 20.04 + ROS Noetic 环境中构建的。为避免错误,请确保使用相同的设置。

3.1 创建企业空间,克隆项目,并执行初始构建。

bashcd ~
mkdir myController_ws && mkdir myController_ws/src && cd myController_ws/src
git clone https://github.com/FAIR-INNOVATION/frcobot_ros.git
git clone  -b mycontroller_s570 https://github.com/elephantrobotics/mycobot_ros.git
cd ..
rosdep install --from-paths src --ignore-src -r -y
catkin_make

 

您可以通过运行外骨骼的 RViz 来测试它是否正常运行。

bashroslaunch mycontroller_s570 test.launch

 

3.2 手动对齐动作。

您应该在 'xxx_description' 包下添加新的启动文件。该文件用于通过在 ROS 中接收节点信息来加载机器人关节信息控制关节角度,帮助建立机械臂与外骨骼的关节运动关系。

bashcd ~/myController_ws/src/frcobot_ros/frcobot_description/launch
touch fr3robot_control_rviz.launch
gedit fr3robot_control_rviz.launch

(fr3robot_control_rviz.launch) 

<launch><param name="robot_description" textfile="$(find frcobot_description)/urdf/fr3_robot.urdf" /><node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" /><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/><node name="rviz" pkg="rviz" type="rviz" args="-d $(find frcobot_description)/launch/fr3robot.rviz"/><node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world dual_base"/>
</launch>

 关闭文件并继续。

bashcd ~/myController_ws/
catkin_make
roslaunch frcobot_description fr3robot_control_rviz.launch

之后,我们可以在 RViz 中加载机械臂模型,并使用滑块对照控制器检查关节角度旋转方向,根据需要进行初步调整。 

3.3 修改通信的外骨骼代码。

在终端中运行以下命令:

 

bashcd /home/u204/myController_ws/src/mycobot_ros/mycontroller_s570/scripts
gedit test.py

重写处理左右臂数据的代码。在此示例中,仅使用右臂的日期来控制单个机器人手臂。

(test.py)

 

#!/usr/bin/env pythonfrom exoskeleton_api import Exoskeleton, ExoskeletonSocket
import rospy
from math import pi
import time
from sensor_msgs.msg import JointState
from std_msgs.msg import Header
import rosnode
import os
import subprocessos.system("sudo chmod 777 /dev/ttyACM*")obj = Exoskeleton(port="/dev/ttyACM0")def shutdown_ros_node(node_name):try:subprocess.run(['rosnode', 'kill', node_name])print(f"Node {node_name} has been shutdown.")except subprocess.CalledProcessError as e:print(f"Error: {e}")# Init ROS node
#_________ change _________
rospy.init_node("fr3_joint_state_publisher")
#_________ change _________
shutdown_ros_node('joint_state_publisher_gui')
pub = rospy.Publisher('/joint_states', JointState, queue_size=10)
rate = rospy.Rate(100) # 100Hzjoint_state = JointState()while not rospy.is_shutdown():joint_state.header = Header()#_________ change _________joint_state.header.stamp = rospy.Time.now()joint_state.name = ['j1','j2','j3','j4','j5','j6']l_angle = obj.get_arm_data(1)l_angle = l_angle[:7]l_angle = [int(x) for x in l_angle]r_angle = obj.get_arm_data(2)r_angle = r_angle[:7]r_angle = [int(y) for y in r_angle]rad_l_angle = [a/180*pi for a in l_angle]joint_state.position = [0.0] * 6  # Initialize with 6 elements#only use r_angle and converse joints angle #FR 1 = EX 2joint_state.position[0] = -r_angle[1] - 70#FR 2 = EX 1joint_state.position[1] =  r_angle[0] -170#FR 3 = EX 4joint_state.position[2] = -r_angle[3] - 45#FR 4 = EX 6joint_state.position[3] =  r_angle[5] - 50#FR 5 = EX 5 joint_state.position[4] =  r_angle[4] + 90#FR 6 = EX 7joint_state.position[5] = -r_angle[6]# convert to position joint_state.position = [a/180*pi for a in joint_state.position]
#_________ change _________joint_state.effort = []joint_state.velocity = []# publish pub.publish(joint_state)rospy.loginfo('success')for i in range(6):print(f"j{i+1}: {joint_state.position[i]/pi*180}")# waitrate.sleep()

关闭文件并运行脚本以验证运动。

bashpython3  test.py

3.4 驾驶真人机器人

调整成功后,我们需要接收关节信息,并根据机器人的 API 驱动真实机器人。

此步骤需要根据不同机器人的特定 API 编写代码。为了简化演示,我们修复了 J1、J5 和 J6 的角度。

bashcd /home/u204/myController_ws/src/frcobot_ros/frcobot_python_sdk-main/linux/example
touch control_test.py && gedit control_test.py

(control_test.py)

#!/usr/bin/env python3import rospy
from sensor_msgs.msg import JointState
import math
import time
import frrpc# Define your parameters
acc = 0.01
vel = 0.01
t = 0.01
lookahead_time = 0.0
P = 0.0
eP1=[0.000,0.000,0.000,0.000]
dP1=[1.000,1.000,1.000,1.000,1.000,1.000]# Initialize joint_angles_deg as a global variable
joint_angles_deg = [0.0] * 6robot = frrpc.RPC('192.168.58.2')def joint_state_callback(msg):global joint_angles_degjoint_angles_rad = msg.position[:6]# Convert angles from radians to degreesjoint_angles_deg = [angle * (180.0 / math.pi) for angle in joint_angles_rad]# Modify specific joint angles as needed  # fixed J1 J5 J6 to avoid robot collision, just for test joint_angles_deg[0] = -16.11joint_angles_deg[4] = 90.0joint_angles_deg[5] = 90.0# Initialize the ROS node
rospy.init_node('joint_state_listener', anonymous=True)# Subscribe to the /joint_states topic
rospy.Subscriber('/joint_states', JointState, joint_state_callback)while not rospy.is_shutdown():# Update the joint angles whenever new data is receivedif joint_angles_deg:  # Check if joint_angles_deg has been updatedif(joint_angles_deg[0]!=0.0):joint_angles_deg = [float(angle) for angle in joint_angles_deg]joint_c = robot.GetForwardKin(joint_angles_deg)joint_c = [joint_c[1],joint_c[2],joint_c[3],joint_c[4],joint_c[5],joint_c[6]]ret = robot.RobotEnable(1)ret = robot.MoveJ(joint_angles_deg,joint_c,1,0,250.0,200.0,100.0,eP1,-1.0,0,dP1) print("Updated Joint Angles (Degrees):")for i, angle in enumerate(joint_angles_deg):print(f"Joint {i+1}: {angle:.2f} degrees")for i, angle in enumerate(joint_c):print(f"L{i+1}: {angle:.2f} degrees")time.sleep(0.02)

4. 测试

我们总共需要运行 3 个终端:

● 一个用于启动 RViz 以显示机器人的模拟状态

● 一个用于接收 myController S570 的数据 并将其 作为节点消息发布到 ROS 中

● 一个用于调用机器人 API、接收节点消息和控制机器人

航站楼 A:

cd ~/myController_ws
roslaunch frcobot_description fr3robot_control_rviz.launch

航站楼 B:

cd /home/u204/myController_ws/src/mycobot_ros/mycontroller_s570/scripts
python3 test.py

C 航站楼:

cd /home/u204/myController_ws/src/frcobot_ros/frcobot_python_sdk-main/linux/example
python3 control_test.py

然后你可以尝试使用外骨骼来控制真正的协作机器人。

总结

我们使用 FAIRINO 协作机器人 FR3 演示了 myController S570 外骨骼控制器如何远程控制协作机器人。

myController S570 的强大兼容性使开发人员能够轻松进行二次开发,包括远程控制各种机器人并简化数据收集过程。

通过使用外骨骼的摇杆和按钮来控制机器人的末端执行器,用户可以解锁更多潜在的应用场景。我们期待看到创客们更多创意发展,并热忱邀请您参与我们的案例收集活动:Call for User Cases - Elephant Robotics

相关文章:

使用外骨骼灵活远程控制协作机器人案例

外骨骼控制器采用可调节结构&#xff0c;简化了机器人编程&#xff0c;使协作机器人 FR3 的远程控制变得容易。 一、引言 在开发机器人手臂或双臂系统的应用程序时&#xff0c;经常会遇到以下挑战&#xff1a; 1. 使用拖动和示教进行定位的困难&#xff1a;拖动和示教功能通常…...

Centos Stream 10 根目录下的文件夹结构

/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…...

python连点器

要实现一个用于抖音点赞的鼠标连点工具&#xff0c;可以通过编程或现有软件实现。以下是两种常见方法&#xff08;但请注意&#xff1a;频繁自动化操作可能违反平台规则&#xff0c;需谨慎使用&#xff09;&#xff1a; 方法 1&#xff1a;使用现成工具&#xff08;如 AutoClic…...

STM32G474--Whetstone程序移植(单精度)笔记

1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程&#xff0c;进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型&#xff0c;以及函数接口全部更换为单精度…...

Spring Boot 3.4 中 MockMvcTester 的新特性解析

引言 在 Spring Boot 3.4 版本中&#xff0c;引入了一个全新的 MockMvcTester 类&#xff0c;使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性&#xff0c;分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...

java 读取sq3所有表数据到objectNode

1.实现效果&#xff1a;将sq3中所有表的所有字段读到objectNode 对象中&#xff0c;兼容后期表字段增删情况&#xff0c;数据组织形式如下图所示&#xff1a; 代码截图&#xff1a; 代码如下&#xff1a; package com.xxx.check.util;import java.sql.*; import java.util.Arr…...

网络计算机的五个组成部分

单个计算机是无法进行通信的。所以需要借助网络。 下面介绍一些在网络里常见的设备。 一、服务器 服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备 它在网络中为其他客户机&#xff08;如个人计算机、智能手机、ATM机等终端设备&#xff09;提供计算或者应用…...

jakarta EE学习笔记-个人笔记

WebServlet注解&#xff1a;声明一个类为Servlet Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface WebServlet {// 指定Servlet的影子String name() default ""; // 匹配地址映射(URL)String[] value() default {};// …...

vue3-响应式 toRefs

在Vue 3中&#xff0c;toRefs是一个非常有用的组合式API&#xff08;Composition API&#xff09;函数&#xff0c;它主要用于将响应式对象&#xff08;通常是由reactive创建的对象&#xff09;转换为单独的响应式引用对象。这样做的好处是可以将这些响应式引用解构出来&#x…...

学习threejs,使用Lensflare模拟镜头眩光

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Lensflare 二、&…...

redis高级数据结构布隆过滤器

文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时&#xff0c;它会给我们不停地推荐新的内容&#xff0c;它每次推荐时要去重&#xff0c;去掉那些已经看过的内容。问题来了&#xff0c;新闻…...

mysql 5.7安装

基础环境&#xff1a;centos7.9 创建日志存放目录 mkdir -p /opt/supervisor/log安装相关工具 yum install -y perl net-tools numactl gcc python-devel配置yum源 sudo vim /etc/yum.repos.d/mysql-community.repo [mysql-connectors-community] nameMySQL Connectors Com…...

Golang:精通sync/atomic 包的Atomic 操作

在本指南中&#xff0c;我们将探索sync/atomic包的细节&#xff0c;展示如何编写更安全、更高效的并发代码。无论你是经验丰富的Gopher还是刚刚起步&#xff0c;你都会发现有价值的见解来提升Go编程技能。让我们一起开启原子运算的力量吧&#xff01; 理解Go中的原子操作 在快…...

微信小程序如何使用decimal计算金额

第三方库地址&#xff1a;GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript 之前都是api接口走后端计算&#xff0c;偶尔发现这个库也不错&#xff0c;计算简单&#xff0c;目前发现比较准确 上代码 导入js import Decimal from ../../uti…...

最新Modular公司之MAX和Mojo作者 克里斯·拉特纳简介

Chris Lattner&#xff08;克里斯拉特纳&#xff09; 是一位著名的计算机科学家和软件工程师&#xff0c;以其在编程语言、编译器技术和软件开发工具领域的贡献而闻名。以下是关于他的详细介绍&#xff1a; 1. 主要成就 &#xff08;1&#xff09;LLVM 项目的创始人 Chris La…...

Redis数据库篇 -- Pipeline

一. 什么是Pipeline 在传统的请求-响应模式中&#xff0c;客户端与服务器之间的通信流程如下&#xff1a; 客户端发送一个命令到服务器。服务器接收命令并执行。服务器将执行结果返回给客户端。客户端接收结果后&#xff0c;发送下一个命令 在这种传统的模式下&#xff0c;…...

爬虫自动化(DrissionPage)

目录 ?一.介绍: 下载DrissionPage,还是我们熟悉的pip&#xff1a; 环境准备&#xff1a; ?二.基本代码&#xff1a; 它对于的导包和类使用&#xff1a; 窗口的设置&#xff1a; 和获取的页面的滑动&#xff1a; 3.进一步认识DrissionPage&#xff1a; 浏览器可以多开…...

常见string库中的函数(C语言超详细)

文章目录 strcspnstrcpystrncpystrcatstrncatstrcmpstrncmpstrchrstrrchrstrstrstrtokstrlenstrnlen strcspn 原型: size_t strcspn(const char *str1, const char *str2);功能&#xff1a; strcspn 会扫描 str1&#xff0c;并返回一个整数&#xff0c;表示 str1 中第一个匹配…...

单例模式几种实现

静态内部类holder实现&#xff08;推荐&#xff09; public class UniqueIdGenerator {public static final UniqueIdGenerator INSTANCE Holder.INSTANCE;// Private holder class for lazy initializationprivate static class Holder {static final UniqueIdGenerator INS…...

android中关于CheckBox自定义选中图片选中无效问题

在android xml 布局中&#xff0c;使用CheckBox控件设置选中背景图代码如下 <CheckBoxandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:button"drawable/dfrd_common_selecotr_check"android:paddingStart&q…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...