使用外骨骼灵活远程控制协作机器人案例
外骨骼控制器采用可调节结构,简化了机器人编程,使协作机器人 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。

相关文章:
使用外骨骼灵活远程控制协作机器人案例
外骨骼控制器采用可调节结构,简化了机器人编程,使协作机器人 FR3 的远程控制变得容易。 一、引言 在开发机器人手臂或双臂系统的应用程序时,经常会遇到以下挑战: 1. 使用拖动和示教进行定位的困难:拖动和示教功能通常…...
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连点器
要实现一个用于抖音点赞的鼠标连点工具,可以通过编程或现有软件实现。以下是两种常见方法(但请注意:频繁自动化操作可能违反平台规则,需谨慎使用): 方法 1:使用现成工具(如 AutoClic…...
STM32G474--Whetstone程序移植(单精度)笔记
1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程,进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型,以及函数接口全部更换为单精度…...
Spring Boot 3.4 中 MockMvcTester 的新特性解析
引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...
java 读取sq3所有表数据到objectNode
1.实现效果:将sq3中所有表的所有字段读到objectNode 对象中,兼容后期表字段增删情况,数据组织形式如下图所示: 代码截图: 代码如下: package com.xxx.check.util;import java.sql.*; import java.util.Arr…...
网络计算机的五个组成部分
单个计算机是无法进行通信的。所以需要借助网络。 下面介绍一些在网络里常见的设备。 一、服务器 服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备 它在网络中为其他客户机(如个人计算机、智能手机、ATM机等终端设备)提供计算或者应用…...
jakarta EE学习笔记-个人笔记
WebServlet注解:声明一个类为Servlet Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface WebServlet {// 指定Servlet的影子String name() default ""; // 匹配地址映射(URL)String[] value() default {};// …...
vue3-响应式 toRefs
在Vue 3中,toRefs是一个非常有用的组合式API(Composition API)函数,它主要用于将响应式对象(通常是由reactive创建的对象)转换为单独的响应式引用对象。这样做的好处是可以将这些响应式引用解构出来&#x…...
学习threejs,使用Lensflare模拟镜头眩光
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Lensflare 二、&…...
redis高级数据结构布隆过滤器
文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻…...
mysql 5.7安装
基础环境: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 操作
在本指南中,我们将探索sync/atomic包的细节,展示如何编写更安全、更高效的并发代码。无论你是经验丰富的Gopher还是刚刚起步,你都会发现有价值的见解来提升Go编程技能。让我们一起开启原子运算的力量吧! 理解Go中的原子操作 在快…...
微信小程序如何使用decimal计算金额
第三方库地址:GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript 之前都是api接口走后端计算,偶尔发现这个库也不错,计算简单,目前发现比较准确 上代码 导入js import Decimal from ../../uti…...
最新Modular公司之MAX和Mojo作者 克里斯·拉特纳简介
Chris Lattner(克里斯拉特纳) 是一位著名的计算机科学家和软件工程师,以其在编程语言、编译器技术和软件开发工具领域的贡献而闻名。以下是关于他的详细介绍: 1. 主要成就 (1)LLVM 项目的创始人 Chris La…...
Redis数据库篇 -- Pipeline
一. 什么是Pipeline 在传统的请求-响应模式中,客户端与服务器之间的通信流程如下: 客户端发送一个命令到服务器。服务器接收命令并执行。服务器将执行结果返回给客户端。客户端接收结果后,发送下一个命令 在这种传统的模式下,…...
爬虫自动化(DrissionPage)
目录 ?一.介绍: 下载DrissionPage,还是我们熟悉的pip: 环境准备: ?二.基本代码: 它对于的导包和类使用: 窗口的设置: 和获取的页面的滑动: 3.进一步认识DrissionPage: 浏览器可以多开…...
常见string库中的函数(C语言超详细)
文章目录 strcspnstrcpystrncpystrcatstrncatstrcmpstrncmpstrchrstrrchrstrstrstrtokstrlenstrnlen strcspn 原型: size_t strcspn(const char *str1, const char *str2);功能: strcspn 会扫描 str1,并返回一个整数,表示 str1 中第一个匹配…...
单例模式几种实现
静态内部类holder实现(推荐) 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 布局中,使用CheckBox控件设置选中背景图代码如下 <CheckBoxandroid:layout_width"wrap_content"android:layout_height"wrap_content"android:button"drawable/dfrd_common_selecotr_check"android:paddingStart&q…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
