六自由度机械臂 SolidWorks 模型转化成 urdf 文件,添加简单 gazebo 属性并修改为 xacro 中,模型建立的顺序是正确的,也能够在 rviz 中显示,但是加载 arbotix 配置后出现如下错误,模型的 tf 树始终都是断的,网上提到的方法几乎尝试遍了也没有解决这个问题,纠结了好几天,最终决定从模型开始重新入手,自己建模丰衣足食。

Arbotix是一款控制电机、舵机的控制板,并提供相应的 ros 功能包,但是这个功能包的功能不仅可以驱动真实的Arbotix 控制板,它还提供一个差速控制器,通过接受速度控制指令更新机器人的 joint 状态,从而帮助我们实现机器人在 rviz 中的运动。

这个差速控制器在 arbotix_python 程序包中,完整的 arbotix 程序包还包括多种控制器,分别对应 dynamixel 电机、多关节机械臂以及不同形状的夹持器。本文用到如下控制器:

关节轨迹控制器 FollowController

单伺服电机并行夹持器 parallel_single_servo_controller

2.Arbotix 配置文件

arbotix 配置文件格式为 .yaml,通常放在模型包的 config 文件夹下。模拟仿真比较简单,一个 launch 文件+arbotix 配置文件即可。该配置文件与控制器相关,定义控制器名称、作用的关节(关节一定要写全,不然会出现 tf 变换错误)以及位置速度参数等,具体可见本文代码。参考 phantomx_pincher_arm 的配置代码,arm 部分的配置文件为 myrobot_arm.yaml,如下:

source: myrobot_arm.yaml

baud: 1000000 #与实际有关,虚拟仿真时可以不用管

rate: 100#与实际有关,虚拟仿真时可以不用管

port: /dev/ttyUSB0

read_rate: 15 #与实际有关,虚拟仿真时可以不用管

write_rate: 25 #与实际有关,虚拟仿真时可以不用管

joints: {

joint1: {id: 1, max_angle: 135, min_angle: -135, max_speed: 90},

joint2: {id: 2, max_angle: 135, min_angle: -135, max_speed: 90},

joint3: {id: 3, max_angle: 135, min_angle: -135, max_speed: 90},

joint4: {id: 4, max_angle: 135, min_angle: -135, max_speed: 90},

joint5: {id: 5, max_angle: 135, min_angle: -135, max_speed: 90},

finger_joint1: {id: 6, max_speed: 90},

}

controllers: {

arm_controller: {type: follow_controller, joints: [joint1, joint2, joint3, joint4, joint5], action_name: arm_controller/follow_joint_trajectory, onboard: False }

}

17

简单说一下第一部分 joints 每个参数的含义:

id 电机的硬件编号,按顺序写

neutral(默认 512):上面代码没有,主要作用是当发布关节状态时,neutral 值由 arbotix 驱动映射为 0 弧度。实际操作中怎么用我现在还不清楚,后面遇到了再解决

max_angle、min_angle 关节电机转动角度的范围

max_speed 电机的最大允许速度

第二部分 controllers 是配置文件的控制器部分,这里 arm 只需配置一个控制器:机械臂关节的轨迹运动控制器 follow_controller,涉及参数如下:

onboard(默认:true)在使用真正的 arbotix 控制板时改为 true

action_name 定义了关节轨迹控制器的命名空间,指定 arbotix 节点接受的消息名称

joint 该控制器管理的一系列关节,顺序要与上一部分中相同

type 控制器的种类

gripper 部分的配置文件为 myrobot_gripper.yaml,代码如下。

source: myrobot_gripper.yaml

model: parallel

invert: false

pad_width: 0.005

finger_length: 0.08

min_opening: 0.0

max_opening: 0.06

joint: finger_joint1

model 夹持器的种类,总共有三种,单边单伺服模型(pi 机器人)、双边双伺服模型(MaxWell)、单伺服并行模型(PhantomX),本文选择单伺服并行模型 parallel

pad_width、finger_length 单位为米,根据具体模型指定 finger 的宽度和长度

min_opening、max_opening 单位为米,根据具体模型指定夹持器的最大、最小开合距离

joint 关节名必须匹配 urdf 模型文件中的夹持器关节名

invert 如果发现关节以一个跟 urdf 模型中规定方向的反方向运动,则可将 invert 参数设置为 true

需要特别注意的是,yaml 格式比较严格,不能解析 tab,要用空格来代替。写好之后可以利用这个地址格式检查来检查一下 yaml 是否有格式错误。

3.launch 启动文件

<?xml version="1.0"?>

利用 arbotix_gui 测试

运行命令:

$ cd ~/catkin_ws && catkin_make

$ source ./devel/setup.bash

$ runlaunch myrobot_description fake_myrobot.launch

屏幕上会出现如下输出:

process[robot_state_publisher-1]: started with pid [25867]

process[arbotix-2]: started with pid [25868]

process[gripper_controller-3]: started with pid [25869]

process[rviz-4]: started with pid [25885]

shutdown request: new node registered with same name

[INFO] [1556967484.301683]: ArbotiX being simulated.

shutdown request: new node registered with same name

[INFO] [1556967484.404963]: Started FollowController (arm_controller). Joints: ['joint1', 'joint2', 'joint3', 'joint4', 'joint5'] on C1

可以看到 gripper_controller、虚拟模式下的 arbotix 控制器启动了,还启动了 FollowController(arm_controller)。

输入命令 arbotix_gui,调节各关节滚动条可以看到对应的机械臂关节在 rviz 中运动。

启动后,运行起来的节点图

利用 trajectory_demo.py 例程测试 arbotix 关节轨迹动作控制器

参考例程古月大神著作源码

创建这个例程的主要目的在于方便。前面提到 arbotix 中的 follow_controller,这是机械臂关节的虚拟控制器,它能够实现一个 joint trajectory action server,并且通过 FollowJointTrajectoryGoal 消息来响应动作目标,这种消息对于手工在命令行输入而言太长太复杂,因此利用 trajectory_demo 这个 python 脚本代替,代码如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import rospy

import actionlib

from control_msgs.msg import FollowJointTrajectoryAction, FollowJointTrajectoryGoal

from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint

class TrajectoryDemo():

def __init__(self):

rospy.init_node('trajectory_demo')

# 是否需要回到初始化的位置

reset = rospy.get_param('~reset', False)

# 机械臂中 joint 的命名,要与 urdf 中描述的一致

arm_joints = ['joint1',

'joint2',

'joint3',

'joint4',

'joint5',

]

# 下面关节位置的顺序需要与上面定义的关节名一一对应,如果在命令行将 reset 参数设为 true,目标位置就会回到空挡位置;如果为 false,则会到设定的 foward 位姿

if reset:

# 如果需要回到初始化位置,需要将目标位置设置为初始化位置的六轴角度

arm_goal = [0, 0, 0, 0, 0]

else:

# 如果不需要回初始化位置,则设置目标位置的六轴角度

# 设定位姿为 forward

arm_goal = [-9.87189668696e-05, 0.804022496599, 0.88171765075, 0.700188077266, 9.77076938841e-05]

# 连接机械臂轨迹规划的 trajectory action server

rospy.loginfo('Waiting for arm trajectory controller...')

arm_client = actionlib.SimpleActionClient('arm_controller/follow_joint_trajectory', FollowJointTrajectoryAction)

arm_client.wait_for_server()

rospy.loginfo('...connected.')

# 使用设置的目标位置创建一条轨迹数据

arm_trajectory = JointTrajectory()

arm_trajectory.joint_names = arm_joints

arm_trajectory.points.append(JointTrajectoryPoint())

arm_trajectory.points[0].positions = arm_goal

arm_trajectory.points[0].velocities = [0.0 for i in arm_joints]

arm_trajectory.points[0].accelerations = [0.0 for i in arm_joints]

arm_trajectory.points[0].time_from_start = rospy.Duration(3.0)

rospy.loginfo('Moving the arm to goal position...')

# 创建一个轨迹目标的空对象

arm_goal = FollowJointTrajectoryGoal()

# 将之前创建好的轨迹数据加入轨迹目标对象中

arm_goal.trajectory = arm_trajectory

# 设置执行时间的允许误差值

arm_goal.goal_time_tolerance = rospy.Duration(0.0)

# 将轨迹目标发送到 action server 进行处理,实现机械臂的运动控制

arm_client.send_goal(arm_goal)

# 等待机械臂运动结束

arm_client.wait_for_result(rospy.Duration(5.0))

rospy.loginfo('...done')

if __name__ == '__main__':

try:

TrajectoryDemo()

except rospy.ROSInterruptException:

pass

1 from control_msgs.msg import FollowJointTrajectoryAction, FollowJointTrajectoryGoal

2 from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint

control_msgs 包含用于控制机器人的基本消息(message)和动作(action),提供了控制器设定点、关节以及笛卡尔轨迹的表示;

trajectory_msgs 定义了用于定义机器人轨迹的消息(message)。

首先需要导入一些和轨迹相关的 message 和 action,比如 FollowJointTrajectoryAction 动作和 FollowJointTrajectoryGoal 消息。另外,这些轨迹信息是由关节位置、速度、加速度和受到的作用力进行定义的,因此还需要导入 JointTrajectory 和 JointTrajectoryPoint 消息。

1 arm_client = actionlib.SimpleActionClient('arm_controller/follow_joint_trajectory', FollowJointTrajectoryAction)

创建一个简单的动作客户端 action client,将其连接到机械臂的 joint trajectory action server 上,声明 action 的消息名为 arm_controller/follow_joint_trajectory,这是用前面提到 arbotix 配置文件的 action_name 参数,类型为 FollowJointTrajectoryAction。

1 arm_trajectory = JointTrajectory() #创建一个空的 JointTrajectory()对象

2 arm_trajectory.joint_names = arm_joints #将上面定义的 arm_joints 变量存入关节名称中

3 # 追加一个空的 JointTrajectoryPoint,序号为 0,之后会在里面填入目标位姿

4 arm_trajectory.points.append(JointTrajectoryPoint())

5 arm_trajectory.points[0].positions = arm_goal #填入目标位置

6 # 机械臂运动到目标位置后,各关节速度和加速度应均为 0

7 arm_trajectory.points[0].velocities = [0.0 for i in arm_joints]

8 arm_trajectory.points[0].accelerations = [0.0 for i in arm_joints]

9 arm_trajectory.points[0].time_from_start = rospy.Duration(3.0) #规定整条轨迹在 3s 内运行完

之前 arm_goal 变量中保存了机械臂各关节的目标位姿,将该变量赋给 arm_trajectory.point[0].positions。创建完单点目标轨迹 arm_trajectory 发送给动作服务器 joint trajectory action server。

首先启动上文创建的 fake_myrobot.launch,然后运行测试例程

1 $ roslaunch myrobot_description fake_myrobot.launch

2 $ rosrun myrobot_planning trajectory_demo.py _reset:=False

可以在 rviz 界面看到机械臂开始平滑运动,到达目标位置后停止。

可以查看话题列表如下

python机械臂仿真_如何用ROS+Rviz+Arbotix控制器仿真为六自由度机械臂建模-工业电子-与非网...相关推荐

  1. 六自由度机械臂建模仿真(matlab程序),有控制面板,标价即为真实价格,代码可流畅运行

    六自由度机械臂建模仿真(matlab程序),有控制面板,标价即为真实价格,代码可流畅运行 1.机器人运动学正逆解.动力学建模仿真与轨迹规划,雅克比矩阵求解 2.蒙特卡洛采样画出末端执行器工作空间 3. ...

  2. 大象机器人推出史上最紧凑的六自由度机械臂-mechArm

    2020年,秉持"Enjoy Robots World"的愿景和使命,在保留大部分工业型机器人功能的前提下,大象机器人与M5stack 强强联合共同出品了myCobot --全球最 ...

  3. 六自由度机械臂的solidworks模型图及分享

    之前曾经在一个机械臂制造商的网站上浏览过一款机械臂 603桌面级六自由度机械臂. 于是便想使用该款机械臂来学习ros. 于是我便使用了solidworks将这款机械臂按照一比一的比例画了出来,但是长度 ...

  4. python 机械臂控制_从零开始的ROS四轴机械臂控制-gazebo仿真控制

    这是一个四轴器械臂练手项目,定为arm0.1版本,使用MG90s舵机来搭建一个四轴机械臂.arm0.1版本的目标是对带颜色的方块进行识别并在Gazebo中模拟出来. 以下是这个ROS四轴机械臂控制的目 ...

  5. lorenz系统simulink仿真_直驱永磁同步风机并网仿真(二)

    我们上一篇已经介绍过直驱永磁同步风力发电机的相关情况,并且也介绍了一种常用的电路拓扑的仿真模型,本次介绍一下最常见.应用最广的拓扑--背靠背拓扑,结构如下图所示: 仿真模型 鉴于第一篇已经进行了相关的 ...

  6. 六自由度机械臂基于力传感器的末端力控及拖动示教

    ​近年来,工业机器人的运用范围不断扩大,金属成形.铸造行业.冶金行业等多种工业制造领域都可以见到机器人忙碌的身影,但是随着工艺标准的提升,越来越多的制造工艺仅靠工业机器人传统的位置控制难以胜任.如:精 ...

  7. 炮弹仿真系统matlab软件下载,基于Matlab/Simulink的导弹六自由度弹道仿真系统设计...

    第 11 卷 第 1 期 2011 年 1 月 1671-1815( 2011) 1-0029-06 科 学 技 术 与 工 程 Science Technology and Engineering ...

  8. python神经网络构建图_如何用卷积神经网络构建图像?

    原标题:如何用卷积神经网络构建图像? 原标题 |Everything you need to know to master Convolutional Neural Networks 作者 | Tir ...

  9. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  10. python贪吃蛇控制台_如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

最新文章

  1. Spring,你为何中止我的事务?
  2. 命令行请求jsp页面_JSP 之 8种HTTP的请求方式 之 页面组成等
  3. sqlserver int转varchar_SQL server 常用数据类型讲解
  4. Codeforces Round 504
  5. Restful HMAC认证
  6. CF505E-Mr. Kitayuta vs. Bamboos【贪心,二分】
  7. 【转】Linux的五个查找命令:find,locate,whereis,which,type
  8. 2018.11.27 元器件选型(2)- 连接器
  9. UI基础(四)之tableView (cell重用、原型cell、静态cell)/xib注意事项
  10. envoy中的iptable流量劫持
  11. idea复制代码空格报错
  12. 如何通过linux的终端命令远程登陆windows主机
  13. Tracking相关的文章
  14. 【田姓】宗谱——【郡望堂号】
  15. 安装从GitHub下载的包
  16. jQuery实现五星好评
  17. python--敲击木鱼积累功德小项目
  18. 深度学习-AUC/PR计算
  19. php 生成 rtf,php 实现html转为rtf格式
  20. 移动硬盘无法停止通用卷

热门文章

  1. 忘记卡巴斯基内置账户密码 / 取消卡巴斯基密码保护
  2. UnblockNeteaseMusic解锁网易云灰色歌曲(更新:用咪咕音乐可以免费听)
  3. Adobe 软件清理工具AdobeCreativeCloudCleanerTool.exe
  4. 左程云算法体系班笔记
  5. ideaIU-2018.3.5版本安装
  6. 海思3518C 4G模块移植及运用
  7. 图之查找关键路径(python)实现
  8. Invisible character on env file, cause programe abort abnormally
  9. f4 OF DATE FIELD IN DYNPRO PROGRAME
  10. Ubuntu一些基本软件安装方法