树莓派4B控制Elfin05机械臂
树莓派4B控制Elfin05机械臂
本次实验采用的是Ubuntu18.04的版本来操作Elfin05机械臂,系统搭载在树莓派4B上
1、Ubuntu系统安装
首先说明一下,树莓派4B不支持Ubuntu18.04,作者在安装的时候遇到了很多的坑,根据大量的博客和网上经验,最适合搭载在树莓派4B上的是Ubuntu18.04.3Server版本,但在作者研究本项目时,全网都找不到Ubuntu18.04.3这个版本,经过多次测试,Ubuntu18.04.5的版本也可以支持,本次作者以Ubuntu18.04.5Server版本来安装。
- 下载Ubuntu18.04.5镜像,这里作者给出百度网盘地址:
- 准备一张大于16G的内存卡,这里推荐32G以上的,作者使用的是128G的内存卡,使用读卡器插在带Windows系统上。
- 使用SD Card Formatter软件进行内存卡格式化
- 使用Win32DiskImager软件进行镜像烧录
- 将内存卡插入树莓派并开机。进入后需要账号和密码:开始都默认是ubuntu;然后你需要修改密码;再然后就可以进入终端界面
- 打开可以看到是命令行的模式,这里需要安装桌面,但是此时是命令行模式,很难设置网络,作者采用有线网络的方式,将有线网络插在树莓派上,ping一下网络即可用
# 1、先更新一下源,然后重启
sudo apt-get update
sudo apt-get upgrade
reboot
# 2、再次进入系统后,下载桌面环境
sudo apt-get install ubuntu-desktop
# 3、下完如果失败,我们需要跟着提示输入一下命令
sudo apt-get update --fix-missing
# 4、下完后重启,再次输入下载命令
reboot
sudo apt-get install ubuntu-desktop
# 5、然后运行桌面环境
startx
到这里,树莓派上Ubuntu系统已经安装完毕!
2、ROS系统安装
树莓派安装ROS与虚拟机、真机安装区别不大,本次作者安装的是melodic版本
- 添加ROS软件源(TX2使用自带源即可,该步可省去)
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
- 添加公钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
- 更新软件包
sudo apt update
- 安装ros
sudo apt install ros-melodic-desktop-full
- 初始化 rosdep
sudo rosdep init
rosdep update
好了,在这步骤打住吧,90%的人都会在执行sudo rosdep init的时候遇到问题,这里贴上古月居的解决方案,但是作者尝试了很多次,均未成功;
经过大量的测试,以下的方案可以解决:(本方法来自该网站)
(1)下载源码包文件
下载 rosdistro包文件,若无法访问GitHub可以使用GitHub加速网站进行下载或者将其搬运至国内Gitee。
git clone https://github.com/ros/rosdistro.git
(2)修改url地址指向本地文件
此问题的原因在于无法连接外网,若上述步骤无法实现连接外网不妨换个思路连接本地文件解决问题。
# 进入下载的源码包内
cd rosdistro
# 修改url指向本地
sudo vim rosdep/sources.list.d/20-default.list
修改内容如下:
# os-specific listings first
yaml file:///home/jasonli/develop/rosdistro/rosdep/osx-homebrew.yaml osx
# generic
yaml file:///home/jasonli/develop/rosdistro/rosdep/base.yaml
yaml file:///home/jasonli/develop/rosdistro/rosdep/python.yaml
yaml file:///home/jasonli/develop/rosdistro/rosdep/ruby.yaml
gbpdistro file:///home/jasonli/develop/rosdistro/releases/fuerte.yaml fuerte
# newer distributions (Groovy, Hydro, ...) must not be listed an已成功保存至草稿箱
ymore, they are being fetched from the rosdistro index.yaml instead
其中,地址 /home/jasonli/develop/rosdistro/ 为博主存放改源码包的地址,大家需要将其修改为自己的地址。格式file:// 为url指向本地文件的头。
(3)修改配置文件内默认url
配置完成下载文件后需要将下载所用配置文件内的默认地址同样进行修改。
此处注意,对于ROS Melodic及之前版本的修改地址因该同上述博文中博主一样为python2,而Noetic版本及之后可能存在的版本应将地址修改为python3
# 进入rosdep2目录(Melodic及之前)
cd /usr/lib/python2.7/dist-packages/rosdep2
# 进入rosdep2目录(Noetic及之后)
cd /usr/lib/python3/dist-packages/rosdep2
修改sources_list.py文件
# 修改第一个文件 sources_list.py
sudo vim sources_list.py
打开文件将第74行参数 DEFAULT_SOURCES_LIST_URL 修改为如下内容,需要将其修改为你的地址:
DEFAULT_SOURCES_LIST_URL = 'file:///home/jasonli/develop/rosdistro/rosdep/sources.list.d/20-default.list'
修改rep3.py文件
# 修改第二个文件 rep3.py
sudo vim rep3.py
打开文件将第39行参数 REP3_TARGETS_URL 修改为如下内容,需要将其修改为你的地址:
REP3_TARGETS_URL = 'file:///home/jasonli/develop/rosdistro/releases/targets.yaml'
修改__init__.py文件
# 修改第三个文件 __init__.py
cd ../rosdistro # 在上述文件所在目录的上级目录下的rosdistro文件内
sudo vim __init__.py
打开文件将第68行参数 DEFAULT_INDEX_URL 修改为如下内容,需要将其修改为你的地址:
DEFAULT_INDEX_URL = 'file:///home/jasonli/develop/rosdistro/index-v4.yaml'
(4)运行rosdep
sudo rosdep init
- 根据提示,运行指令rosdep update ,该指令千万别加上sudo 听说会搞乱权限,导致只能重装系统才能解决问题。
rosdep update
- 设置环境
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 安装rosinstall,便利的工具
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
#使用下面命令安装ROS插件(包括3D包围框)
sudo apt install ros-melodic-jsk-rviz-plugins
- 检验
roscore
到这里恭喜你,ROS安装成功了
3、安装Elfin05机械臂软件包
- 安装一些重要的依赖包
sudo apt-get install ros-melodic-soem ros-melodic-gazebo-ros-control ros-melodic-ros-control ros-melodic-ros-controllers
- 安装和升级MoveIt!, 注意因为MoveIt!最新版进行了很多的优化,如果你已经安装了MoveIt!, 也请一定按照以下方法升级到最新版。
安装/升级MoveIt!:
sudo apt-get update
sudo apt-get install ros-melodic-moveit
- 首先创建catkin工作空间 (教程)。 然后将本文件夹克隆到src/目录下,之后用catkin_make来编译。
假设你的工作空间是~/catkin_ws,你需要运行的命令如下:
cd ~/catkin_ws/src
git clone -b melodic-devel https://github.com/hans-robot/elfin_robot.git
cd ..
catkin_make
source devel/setup.bash
- 先把购买机器人时得到的elfin_drivers.yaml放到elfin_robot_bringup/config/文件夹下。
将Elfin通过网线连接到电脑。先通过ifconfig指令来确定与Elfin连接的网卡名称。本软件包默认的名称是eth0 。假如当前名称不是eth0的话,请对elfin_robot_bringup/config/elfin_drivers.yaml的相应部分进行修改。
elfin_ethernet_name: eth0
- 启动机器人需要执行以下步骤
#(一定要打开示教器,给机器人上电!)
# 打开终端1
roslaunch elfin_robot_bringup elfin5_bringup.launch
# 打开终端2
sudo chrt 10 bash
roslaunch elfin_robot_bringup elfin_ros_control.launch
# 打开终端3
roslaunch elfin5_moveit_config moveit_planning_execution.launch
# 打开终端4
roslaunch elfin_basic_api elfin_basic_api.launch
# 打开终端5
rosrun elfin_robot_bringup cmd_pub_test.py
- 鸽子智能饲养项目代码cmd_pub_test.py(该文件放置在~/catkin_ws/src/elfin_robot_bringup/script/):
import rospy
import numpy as np
from sensor_msgs.msg import JointState
from geometry_msgs.msg import PoseStamped, PoseArray, Pose
class CmdPub(object):
def __init__(self):
self.joints_pub=rospy.Publisher('elfin_basic_api/joint_goal', JointState, queue_size=1)
self.cart_pub=rospy.Publisher('elfin_basic_api/cart_goal', PoseStamped, queue_size=1)
self.cart_path_pub=rospy.Publisher('elfin_basic_api/cart_path_goal', PoseArray, queue_size=1)
def function_pub_joints(self, theta):
js=JointState()
js.name=['elfin_joint1', 'elfin_joint2', 'elfin_joint3',
'elfin_joint4', 'elfin_joint5', 'elfin_joint6']
js.position=theta
js.header.stamp=rospy.get_rostime()
self.joints_pub.publish(js)
if __name__=='__main__':
rospy.init_node('cmd_pub', anonymous=True)
cp = CmdPub()
rospy.sleep(1)
# initialize robot joint position
p0 = [0., 0., 0., 0., 0., 0.]
#jieliao
p_goal_1 = [-34.550*np.pi/180., 109.298*np.pi/180., 107.279*np.pi/180., 73.517*np.pi/180., 97.239*np.pi/180., 3.481*np.pi/180.]
#fangliao1
p_goal_2 = [10.574*np.pi/180., 52.409*np.pi/180., 35.699*np.pi/180., 170.104*np.pi/180., 73.017*np.pi/180., 3.736*np.pi/180.]
#fangliao
p_goal_3 = [4.328*np.pi/180., 44.253*np.pi/180., 17.897*np.pi/180., 174.563*np.pi/180., 67.323*np.pi/180., 128.241*np.pi/180.]
#huiliao1
h_goal_1 = [-12.771*np.pi/180., 50.553*np.pi/180., 34.568*np.pi/180., 169.955*np.pi/180., 73.078*np.pi/180., 3.773*np.pi/180.]
#huiliao2
h_goal_2 = [10.405*np.pi/180., 93.351*np.pi/180., 91.019*np.pi/180., 108.929*np.pi/180., 82.414*np.pi/180., 3.767*np.pi/180.]
#huiliao3
h_goal_3 = [-1.022*np.pi/180., 114.756*np.pi/180., 113.704*np.pi/180., 91.790*np.pi/180., 89.601*np.pi/180., 3.790*np.pi/180.]
time_sleep = 5
time_sleep1 = 2
time_sleep2 = 10
while True:
cp.function_pub_joints(p_goal_1)
rospy.sleep(time_sleep)
cp.function_pub_joints(h_goal_3)
rospy.sleep(time_sleep1)
cp.function_pub_joints(h_goal_2)
rospy.sleep(time_sleep1)
cp.function_pub_joints(h_goal_1)
rospy.sleep(time_sleep)
cp.function_pub_joints(p_goal_2)
rospy.sleep(time_sleep)
cp.function_pub_joints(p_goal_3)
rospy.sleep(time_sleep2)
#回程
cp.function_pub_joints(p_goal_2)
rospy.sleep(time_sleep2)
cp.function_pub_joints(h_goal_1)
rospy.sleep(time_sleep)
cp.function_pub_joints(h_goal_2)
rospy.sleep(time_sleep)
cp.function_pub_joints(h_goal_3)
rospy.sleep(time_sleep)
rospy.spin()
有不正确的地方,欢迎与我交流,麻烦私信~~