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

使用键盘控制Franka机械臂运动

功能说明

使用键盘按键,可以控制franka机械臂7个关节角,已在真机上验证。

代码

主要使用的是官方包内的 franka_example_controllers

1、修改 include下的 joint_position_example_controller.h, 改为如下:

// Copyright (c) 2017 Franka Emika GmbH
// Use of this source code is governed by the Apache-2.0 license, see LICENSE
//  技术交流/服务 v: L2622452304
#pragma once#include <array>
#include <string>
#include <vector>#include <controller_interface/multi_interface_controller.h>
#include <hardware_interface/joint_command_interface.h>
#include <hardware_interface/robot_hw.h>
#include <ros/node_handle.h>
#include <ros/time.h>
#include <ros/ros.h>
#include <std_msgs/Float32MultiArray.h>namespace franka_example_controllers {class JointPositionExampleController : public controller_interface::MultiInterfaceController<hardware_interface::PositionJointInterface> {public:ros::NodeHandle n;bool init(hardware_interface::RobotHW* robot_hardware, ros::NodeHandle& node_handle) override;void joint_command_callback(const std_msgs::Float32MultiArray &msg);void starting(const ros::Time&) override;void update(const ros::Time&, const ros::Duration& period) override;std::array<float, 7> joints_position_change = {0.0,0.0,0.0,0.0,0.0,0.0,0.0};private:hardware_interface::PositionJointInterface* position_joint_interface_;std::vector<hardware_interface::JointHandle> position_joint_handles_;ros::Duration elapsed_time_;std::array<double, 7> initial_pose_{};};}  // namespace franka_example_controllers

2、修改 src下的 joint_position_example_controller.cpp, 改为如下:

// Copyright (c) 2017 Franka Emika GmbH
// Use of this source code is governed by the Apache-2.0 license, see LICENSE
#include <franka_example_controllers/joint_position_example_controller.h>#include <cmath>#include <controller_interface/controller_base.h>
#include <hardware_interface/hardware_interface.h>
#include <hardware_interface/joint_command_interface.h>
#include <pluginlib/class_list_macros.h>
// #include <ros/ros.h>namespace franka_example_controllers {bool JointPositionExampleController::init(hardware_interface::RobotHW* robot_hardware,ros::NodeHandle& node_handle) {n = node_handle;position_joint_interface_ = robot_hardware->get<hardware_interface::PositionJointInterface>();if (position_joint_interface_ == nullptr) {ROS_ERROR("JointPositionExampleController: Error getting position joint interface from hardware!");return false;}std::vector<std::string> joint_names;if (!node_handle.getParam("joint_names", joint_names)) {ROS_ERROR("JointPositionExampleController: Could not parse joint names");}if (joint_names.size() != 7) {ROS_ERROR_STREAM("JointPositionExampleController: Wrong number of joint names, got "<< joint_names.size() << " instead of 7 names!");return false;}position_joint_handles_.resize(7);for (size_t i = 0; i < 7; ++i) {try {position_joint_handles_[i] = position_joint_interface_->getHandle(joint_names[i]);} catch (const hardware_interface::HardwareInterfaceException& e) {ROS_ERROR_STREAM("JointPositionExampleController: Exception getting joint handles: " << e.what());return false;}}std::array<double, 7> q_start{{0, -M_PI_4, 0, -3 * M_PI_4, 0, M_PI_2, M_PI_4}};for (size_t i = 0; i < q_start.size(); i++) {if (std::abs(position_joint_handles_[i].getPosition() - q_start[i]) > 0.1) {ROS_ERROR_STREAM("JointPositionExampleController: Robot is not in the expected starting position for ""running this example. Run `roslaunch franka_example_controllers move_to_start.launch ""robot_ip:=<robot-ip> load_gripper:=<has-attached-gripper>` first.");return false;}}return true;
}void JointPositionExampleController::joint_command_callback(const std_msgs::Float32MultiArray &msg){for (size_t i = 0; i < 7; ++i) {joints_position_change[i] = msg.data[0];}
}void JointPositionExampleController::starting(const ros::Time& /* time */) {// for (size_t i = 0; i < 7; ++i) {//   initial_pose_[i] = position_joint_handles_[i].getPosition();// }// elapsed_time_ = ros::Duration(0.0);// ros::init("keyboard_subscriber");ros::Subscriber joint_sub = n.subscribe("/keyboard", 1, &JointPositionExampleController::joint_command_callback,this);ros::spin();
}void JointPositionExampleController::update(const ros::Time& /*time*/,const ros::Duration& period) {// elapsed_time_ += period;// double delta_angle = M_PI / 16 * (1 - std::cos(M_PI / 5.0 * elapsed_time_.toSec())) * 0.2;// for (size_t i = 0; i < 7; ++i) {//   if (i == 4) {//     position_joint_handles_[i].setCommand(initial_pose_[i] - delta_angle);//   } else {//     position_joint_handles_[i].setCommand(initial_pose_[i] + delta_angle);//   }// }for (size_t i = 0; i < 7; ++i) {initial_pose_[i] = position_joint_handles_[i].getPosition();}for (size_t i = 0; i < 7; ++i) {position_joint_handles_[i].setCommand(initial_pose_[i] + joints_position_change[i]);joints_position_change[i] = 0.0;}
}}  // namespace franka_example_controllersPLUGINLIB_EXPORT_CLASS(franka_example_controllers::JointPositionExampleController,controller_interface::ControllerBase)

3、在package下新建scripts文件夹,新建 joint_position_keyboard.py 程序,如下:

#! /usr/bin/env python
#  技术交流 /服务v: L2622452304
import rospy
from std_msgs.msg import Float32MultiArray
import sys, select, termios, tty
from threading import Threadjoints_change = {'1':(0,0.01),'q':(0,-0.01),'2':(1,0.01),'w':(1,-0.01),'3':(2,0.01),'e':(2,-0.01),'4':(3, 0.01),'r':(3,-0.01),'5':(4, 0.01),'t':(4,-0.01),'6':(5, 0.01),'y':(5,-0.01),'7':(6, 0.01),'u':(6,-0.01),}
key = ''
rospy.init_node('keyboard_pub')
pub = rospy.Publisher('/keyboard', Float32MultiArray, queue_size=1)def getKey():global keytty.setraw(sys.stdin.fileno())rlist, _, _ = select.select([sys.stdin], [], [], 0.1)if rlist:key = sys.stdin.read(1)if key == 'z':print('Stop')exit(0)else:key = ''termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)def pub_command():global keyglobal pubkeyboard_command = Float32MultiArray()rate = rospy.Rate(100)while True:joints = [0.0,0.0,0.0,0.0,0.0,0.0,0.0]if key in joints_change.keys():joints[joints_change[key][0]] += joints_change[key][1]# print(joints)keyboard_command.data = jointspub.publish(keyboard_command)rate.sleep()if __name__ == '__main__':settings = termios.tcgetattr(sys.stdin)t = Thread(target=pub_command)t.start()try:while True:getKey()except rospy.ROSInterruptException:passtermios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

实现原理

利用官方给的示例代码,稍作改动来驱动机械臂,然后用topic通信,把py获取的键盘控制信息发送到cpp内的机械臂控制循环中,实现关节运动控制。

使用

启动launch下的 joint_position_example_controller.launch,

<?xml version="1.0" ?>
<launch><include file="$(find franka_control)/launch/franka_control.launch" pass_all_args="true"/><arg name="arm_id" default="panda"/><rosparam command="load" file="$(find franka_example_controllers)/config/franka_example_controllers.yaml" subst_value="true" /><node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen"  args="joint_position_example_controller"/><node pkg="rviz" type="rviz" output="screen" name="rviz" args="-d $(find franka_example_controllers)/launch/robot.rviz -f $(arg arm_id)_link0 --splash-screen $(find franka_visualization)/splash.png"/>
</launch>

也可实现键盘控制机械臂末端移动,但是代码为找到。后续可能继续更新在仿真中的实现。

相关文章:

使用键盘控制Franka机械臂运动

功能说明 使用键盘按键&#xff0c;可以控制franka机械臂7个关节角&#xff0c;已在真机上验证。 代码 主要使用的是官方包内的 franka_example_controllers 1、修改 include下的 joint_position_example_controller.h, 改为如下&#xff1a; // Copyright (c) 2017 Frank…...

力扣第45天----第392题、第115题

# 力扣第45天----第392题、第115题 文章目录 一、第392题--判断子序列二、第115题--不同的子序列 一、第392题–判断子序列 ​ 挺简单的&#xff0c;思路跟以前的都差不多。 class Solution { public:bool isSubsequence(string s, string t) {vector<vector<int>&g…...

扔掉你的开发板,跟我玩Mcore-全志h616

本文转载自WhyCan Forum(哇酷开发者社区)&#xff1a; https://whycan.com/t_10024.html 作者leefei 这是一个1.69寸触摸小电视。使用全志H616芯片&#xff0c;板上硬件有mpu6050陀螺仪&#xff0c;USB转ttl调试串口&#xff0c;一个USB接口&#xff0c;WIFI&蓝牙&#x…...

【Linux】网络篇:UDP、TCP 网络接口及使用

文章目录 socket 及 相关补充0. netstat - - 查询当前服务器上网络服务器1. 端口号&#xff08;port&#xff09;2. 网络字节序3. sockaddr 结构体 一、socket 常见 APIUDP0. IP 地址转化 函数1. socket 函数&#xff1a;创建 socket 文件描述符 (TCP/UDP, 客户端 服务器)2. b…...

卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-2

目录 前言数学理论推导卡尔曼增益超详细数学推导结语参考 前言 最近项目需求涉及到目标跟踪部分&#xff0c;准备从 DeepSORT 多目标跟踪算法入手。DeepSORT 中涉及的内容有点多&#xff0c;以前也就对其进行了简单的了解&#xff0c;但是真正去做发现总是存在这样或者那样的困…...

SQL 性能优化总结

文章目录 一、性能优化策略二、索引创建规则三、查询优化总结 一、性能优化策略 1. SQL 语句中 IN 包含的值不应过多 MySQL 将 IN中的常量全部存储在一个排好序的数组里面&#xff0c;但是如果数值较多&#xff0c;产生的消耗也是比较大的。所以对于连续的数值&#xff0c;能用…...

MYSQL事务隔离级别分析

MYSQL事务隔离级别分析 不可重复读和幻读的区别&#xff1f; 不可重复读和幻读的区别&#xff1f; 先理解几个概念 不可重复读 一个事务中&#xff0c;后续查询结果得到不同的数据&#xff0c;可被重复读隔离级别解决幻影 出现在查询结果集中但不出现在较早查询的结果集中的行幻…...

学习javaEE初阶的第一堂课

学习金字塔 java发展简史 Java最初诞生的时候是用来写前端的!! 199x年 199x年,互联网还处在比较早期的阶段,当时主流的编程语言是 C/C, 有个大佬要搞个"智能面包机",觉得用C来做太难了 于是就基于C搞了个简单点的语言,Java 就诞生了~~ 遗憾的是项目流产了,没做成…...

请问一下就是业务概念模型和业务逻辑模型有啥关系

请问一下就是业务概念模型和业务逻辑模型有啥关系&#xff1f; 业务概念模型和业务逻辑模型是业务建模的两个关键组成部分&#xff0c;两者密切相关但又有所不同。 1.业务概念模型&#xff1a;这是对业务术语、定义和关系的一种抽象表示。它是从业务专家那里获得的知识&#…...

3.2 Android eBPF程序类型

写在前面 为什么要先了解eBPF程序类型? 从帮助函数中,我们可能基于内核的eBPF开放API,对eBPF的能力有一个比较细致的认识,但是这并不能让我们从全局,或者更概括的认识eBPF。eBPF程序类型能够更宏观的告诉我们,eBPF能做哪些事情(除网络相关)。 一,eBPF程序类型 内核…...

多目标优化算法:基于非支配排序的小龙虾优化算法(NSCOA)MATLAB

一、小龙虾优化算法COA 小龙虾优化算法&#xff08;Crayfsh optimization algorithm&#xff0c;COA&#xff09;由Jia Heming 等人于2023年提出&#xff0c;该算法模拟小龙虾的避暑、竞争和觅食行为&#xff0c;具有搜索速度快&#xff0c;搜索能力强&#xff0c;能够有效平衡…...

Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情

在正式写这篇笔记前&#xff0c;有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽&#xff0c;跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发…...

ModuleNotFoundError: No module named ‘omni‘

install isaac sim on linux open the isaac sim folder in /home//.local/share/ov/pkg/isaac_sim-2022.1.1 source setup_python_env.sh ./python.sh standalone_examples/replicator/offline_generation.pyNo module named ‘omni.isaac’...

题解:ABC320B - Longest Palindrome

题解&#xff1a;ABC320B - Longest Palindrome 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;C。 思维难度&#xff1a;C。 调码难度&#xff1a;C。 综合评价&#xff1a;入门。 算法 字符串处理。 思路 通过双层循环分别枚…...

大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):结合使用Agent和VectorStore]

分类目录&#xff1a;《大模型从入门到应用》总目录 代理执行器接受一个代理和工具&#xff0c;并使用代理来决定调用哪些工具以及以何种顺序调用。本文将参数如何结合使用Agent和VectorStore。这种用法是将数据加载到VectorStore中&#xff0c;并希望以Agent的方式与之进行交互…...

【算法题】100040. 让所有学生保持开心的分组方法数

题目&#xff1a; 给你一个下标从 0 开始、长度为 n 的整数数组 nums &#xff0c;其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生&#xff1a; 如果能够满足下述两个条件之一&#xff0c;则认为第 i 位学生将会保持开心&#xff1a; …...

TrOCR – 基于 Transformer 的 OCR 入门

一、TrOCR 架构 近些年,光学字符识别 (OCR) 出现了多项创新。它对零售、医疗保健、银行和许多其他行业的影响是巨大的。与深度学习的许多其他领域一样,OCR领域也看到了Transformer 神经网络的重要性和影响。如今,出现了像TrOCR(Transformer OCR)这样的模型,它在准确性方面…...

单例模式优缺点

单例模式是一种创建型设计模式&#xff0c;其主要目的是确保类只有一个实例&#xff0c;并提供全局访问点来获取该实例。单例模式具有一些优点和缺点&#xff0c;下面我将列出它们&#xff1a; **优点&#xff1a;** 1. **全局唯一性**&#xff1a;单例模式确保在应用程序中只…...

【Java 基础篇】Java 字节流详解:从入门到精通

Java中的字节流是处理二进制数据的关键工具之一。无论是文件操作、网络通信还是数据处理&#xff0c;字节流都发挥着重要作用。本文将从基础概念开始&#xff0c;深入探讨Java字节流的使用&#xff0c;旨在帮助初学者理解和掌握这一重要主题。 什么是字节流&#xff1f; 在Ja…...

Vue记录(下篇)

Vuex getters配置项 *Count.vue <template><div><h1>当前求和为&#xff1a;{{$store.state.sum}}</h1><h3>当前求和的10倍为&#xff1a;{{$store.getters.bigSum}}</h3><select v-model.number"n"><option value&q…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...