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

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

5cd3b2b5da7ad-thumb.png

5cd3b2b6015a3-thumb.png

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 中运动。

5cd3b2b601310-thumb.png

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

5cd3b2b66ab20-thumb.png

利用 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 界面看到机械臂开始平滑运动,到达目标位置后停止。

5cd3b2b6d219e-thumb.png

可以查看话题列表如下

5cd3b2b6d15cb-thumb.png

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用ROS-Melodic和MoveIt来进行UR5机械臂仿真控制。以下是一个基本的步骤: 1. 安装ROS-Melodic:请根据ROS官方文档的说明安装ROS-Melodic。确保你的系统满足所有的依赖项。 2. 安装MoveIt:在终端中运行以下命令来安装MoveIt: ``` sudo apt-get install ros-melodic-moveit ``` 3. 配置工作空间:创建一个新的工作空间,并将其初始化为ROS工作空间。例如,你可以运行以下命令: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 4. 下载UR5机械臂包:在终端中运行以下命令来下载UR5机械臂ROS软件包: ``` cd ~/catkin_ws/src git clone https://github.com/ros-industrial/universal_robot.git ``` 5. 下载MoveIt配置文件:在终端中运行以下命令来下载MoveIt配置文件: ``` cd ~/catkin_ws/src git clone https://github.com/ros-planning/moveit_resources.git ``` 6. 构建和编译:在终端中运行以下命令来构建和编译你的工作空间: ``` cd ~/catkin_ws/ catkin_make ``` 7. 启动仿真环境:在终端中运行以下命令来启动UR5机械臂仿真环境: ``` roslaunch ur_gazebo ur5.launch ``` 8. 启动MoveIt RViz:在终端中运行以下命令来启动MoveIt RViz界面: ``` roslaunch ur5_moveit_config moveit_rviz.launch config:=true ``` 9. 进行控制:在RViz界面中,你可以使用MoveIt插件来规划和控制UR5机械臂的运动。你可以设置目标位置、执行运动等。 这些是基本的步骤,可以帮助你开始使用ROS-Melodic和MoveIt进行UR5机械臂仿真控制。你可以根据自己的需求进行进一步的定制和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值