Arduino制作支持ROS机器人操作系统的7轴机械臂



from https://www.arduino.cn/forum.php?mod=viewthread&tid=85107#lastpost

用Arduino制作支持ROS机器人操作系统的7轴机械臂

参赛组员:
190808149
人数:1名


项目演示:

我使用Arduino和PCA9685来驱动舵机;并借用Lego Tech乐高孔条零件快速拼装机械臂;在Linux系统和ROS MoveIt机器人运动规划软件下,通过鼠标操作,自由拖动解算机械臂关节姿态。


两年前Arduino论坛发放给我MakeBlock MegaPi,所以一直比较关心MakeBlock 的发展。MakeBlock 现在已经在苹果商店上线Swift关联产品了。这样的商业成就真是值得兴奋和鼓舞。非常感慨正规的商业化运作让创客产品在公司机制的保障下演化和推进,比创客个人凭借兴趣进行尝试更有可行性和连续性。同样,两年前在论坛开展竞赛的uArm出品商UFACTORY最近上市的xArm技惊四座,已经开始在KickStarter上销售。这样的产品迭代能力真的很了不起。xArm的各项能力我们目前用Arduino和航模舵机等常用硬件是无法达到了。不过xArm能够结合ROS机器人操作系统使用,在Linux系统下使用图形用户界面模拟、实时控制机器人的操作,倒是我们用Arduino可以办到的。

在Ubuntu Linux ROS软件的支持下,我们同样可以应用Arduino和舵机组装的简易机器人实现图像识别、运动规划甚至强化学习等知识。我使用Arduino 2560和PCA9685来驱动舵机;并借用Lego Tech乐高孔条零件快速拼装机械臂;与Ubuntu Linux ROS互动操作。达到学习目的。

 


舵机和孔条的打印连接件的设计图纸在https://github.com/qq95538/ServoTurnAround/SolidWorkFiles/
连接件使用9g舵机配备的螺钉连接,然后用Lego插销固定孔条连接件。即可完成拼装。

这样做自由度高,模块性好,制作机器人,机械臂无需用3D打印机打印整个机器人。只需借助Lego孔条作为骨骼,快速搭建机器人原型。


 


机器人原型在Solidworks中也可以用零件进行及时装配调整,然后直接输出到机器人操作系统ROS,验证机器人的合理性。在计算机上验证合理后再组装真实的机械臂。实现了计算机辅助设计应有之意。通过原型设计,不端扩展,最终我们得到以下7轴机械臂:


 

机械臂舵机连接Arduino和PCA9685驱动板后,即可结合ROS机器人操作系统展开调试。



以下是操作指引:

1.Windows上安装VMWare,下载Ubuntu16.04 LTS操作系统光盘镜像,在VMWare上创建一个Linux系统虚拟机。安装完毕后在Ubuntu Linux上安装ROS,选完全安装。运行roscore节点。


 


2.在Arduino Sketch上安装rosserial库。确保上网通常,在第三项菜单Sketch中选Include Libraries,点击进入Manage Libraries直接搜索添加rosserial库。

3.下载github下载sketch程序ServoControledByROS烧录到Arduino 2560,Pin6连接舵机数字端口。点击通过VMWare右下角图标将Arduino 2560串口连接虚拟化到Linux虚拟机内。Linux识别出串口ttyUSB__之类的串口。在Linux命令行中继续执行rosrun rosserial_python serial_node.py /dev/ttyUSB__将一个ROS节点与Arduino连接。就能在Linux下让ROS操作Arduino舵机或机械臂了。

注意,在连接电脑,PCA9685和Arduino2560前,先确保Arduino程序逻辑调试通过,再给PCA9685独立供电,推动舵机。我在制作过程中,程序逻辑还未完善就加电调试舵机,机械臂乱动,损坏了拼接好的机械臂。只有重拼。

4.下载SolidWorks下的urdf制作插件,绘制自己设计的机械臂零件,制作装配图。

 



通过urdf插件指定机械臂链接和轴。

 



 



 
计算出的轴位置在Solidworks中虚线示意


 


选择Export输出urdf文件
 


solidworks插件自动计算机器人轴向位置和关节坐标
保存urdf文件

 

得到的urdf文件目录如下

 



 



打开装有ROS的Ubuntu Linux虚拟机将urdf文件
拖动拷贝到Linux虚拟机catkin_ws/src/文件目录。
 


在linux中找到urdf位置
 




编辑package.xml信息,注明自己的版权信息和邮箱
 


借用现成的urdf_tutorial 定义,运行命令roslaunch urdf_tutorial display.launch model:=文件所在位置.urdf。在RViz中机械臂的CAD三维示意图就显示出来了。


 



操作joint_state_publisher控制关节舵机运动。rviz中的机械臂模型就动起来了。
 


Arduino通过rosserial收到joint_state_publisher发出的topic信号,


和Rviz中虚拟的机械臂模型一起也做同步运动


 


在Rviz中配置好机械臂模型后,就可以通过ROS Moveit软件,在计算机GUI图形界面下配置和规划机械臂运动路径了。


首先,我们根据前面的2轴(关节)机械臂,扩展舵机数量得到7轴(关节)机械臂。
 


Arduino自带的servo.h库只能驱动2个舵机。要同时驱动7个关节舵机,需要使用Adafruit PCA9685驱动板。该配件价格不贵,淘宝价10元。



 

将舵机分别连接到PCA9685舵机口0-6,连接供电。连接PCA9685的5V,GND到Arduino相应位置,SDA到Arduino A4,SLC到Arduino A5。再烧录代码https://github.com/qq95538/ArduinoRobotHardWareInterfaceForROS/blob/master/arduino_sketch_for_myrobot_control/arduino_sketch_for_myrobot_control.ino到Arduino。

 

#include <std_msgs/Float64.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  500 // this is the 'maximum' pulse length count (out of 4096)
#define SERVONUM 7
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
ros::NodeHandle  nh;
void messageCb(const sensor_msgs::JointState& msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
  uint16_t pulselength[SERVONUM];
  for(int i = 0; i < SERVONUM; i++){
    pulselength = map(msg.position * 1000, -1.57 * 1000, 1.57 * 1000, SERVOMIN, SERVOMAX);
    pwm.setPWM(i, 0, pulselength);
  }  
}
ros::Subscriber<sensor_msgs::JointState> sub("/joint_states", &messageCb );
void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(sub);
  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
  delay(10);
  digitalWrite(13, 1);
  uint16_t pulselength[SERVONUM];
  for(int i = 0; i < SERVONUM; i++){
    pwm.setPWM(i, 0, (SERVOMIN+SERVOMAX)/2);
  }
}
void loop()
{
  nh.spinOnce();
  delay(1);
}




本项目使用的其他代码也在https://github.com/qq95538/ArduinoRobotHardWareInterfaceForROS

先我们配置机械臂和ROS运动规划功能相关节点

1、首先,根据之前产生的机械臂模型https://github.com/qq95538/Ardui ... r/0320_all_assembly  
配置一个ros_control节点:https://github.com/qq95538/Ardui ... ter/myrobot_control,控制机械臂的运动。

2、同时根据刚才所述的机械臂模型https://github.com/qq95538/Ardui ... r/0320_all_assembly
配置一个ros moveit节点:https://github.com/qq95538/Ardui ... /master/0320_config

运行命令roslaunch moveit_setup_assistant setup_assistant.launch
打开moveit配置界面,为机械臂配置运动规划功能
 


把关节相邻部分碰撞检测关闭
 


配置机械臂关节组,设置IK动力学插件,以便在软件中对关节姿态进行实时反向解算
 

 


设置几个常用的机器人关节姿态
 


设置ros_control接口
 


最后生成MoveIt运动规划节点
 


就可以在计算机上通过GUI图形用户界面实时设定和规划7轴机械臂的运动了。
 

3、配置节点后依次运行命令:
中心节点
roscore
机械臂控制节点
roslaunch myrobot_control myrobot_joint_trajectory_controllers.launch
运动规划节点
roslaunch 0320_config demo.launch
触发Moveit和RViz图形用户界面,即可通过Moveit规划机器人运动路径。

演示视频:

直接通过鼠标拖动机械臂指定机械臂目标位置,ROS MoveIt通过IK反向动力学插件及时求解所需的关节变动参数,传递给Arduino,指挥舵机作相应旋转,机械臂即可运动到达相应位置。


留言

熱門文章