跳到主要内容

NexDroid 与 ROS 结合

视频

我们制作了 NexDroid 系统连接到 ROS 的视频教程。

NexDroid 与 ROS 结合-连接和使用

初始化 ROS 操作环境

Ubuntu18.04 系统安装,镜像放于 02 控制器/文档/将新电脑安装开发环境中。

ROS 系统的安装

包括完整的安装步骤和出现错误的解决方式。

设置 sources.list

设置电脑以安装来自 packages.ros.org 的软件。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main"
> /etc/apt/sources.list.d/ros-latest.list'

速度过慢配置清华源镜像

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" >
/etc/apt/sources.list.d/ros-latest.list'

PS:下载失败,尝试对 ubuntu 配置阿里源、清华源等。下面提供一个阿里源的配置方案。

备份源列表

Ubuntu 配置的默认源并不是国内的服务器,下载更新软件都比较慢。首先备份源列表文件 sources.list

sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

打开 sources.list 文件修改

sudo gedit /etc/apt/sources.list

编辑/ etc/apt/sources.list 文件, 在文件最前面添加阿里云镜像源:

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

刷新列表

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

设置密钥

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

安装

sudo apt update
sudo apt install ros-melodic-desktop-full
初始化 rosdep(很容易初始化失败)

初始化失败,可先尝试用手机热点连接网络进行 rosdep init,还是不行则按照步骤 6 修改(还是不可以就多次执行 sudo rosdep init 直到无报错),初始化完成再去配置环境变量

sudo rosdep init
rosdep update
设置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
rosdeq 出错

因为服务器的原因,会遇到下面的问题,需要对配置文件进行修改

sudo rosdep init

ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20- default.list
Website may be down.
rosdep update
reading in sources list data from /etc/ros/rosdep/sources.list.d ERROR: error loading sources list:
('The read operation timed out')

打开包含资源下载函数的文件:

sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py

添加

url="https://ghproxy.com/"+url
def download_rosdep_data(url):
"""
:raises: :exc:`DownloadFailure` If data cannot be
retrieved (e.g. 404, bad YAML format, server down).
"""
try:
url = "https://ghproxy.com/"+url
f = urlopen_gzip(url, timeout=DOWNLOAD_TIMEOUT)
text = f.read()
f.close()
data = yaml.safe_load(text)
if type(data) != dict:
raise DownloadFailure('rosdep data from [%s] is not a YAML dictionary' % (url))
return data
except (URLError, httplib.HTTPException) as e:
raise DownloadFailure(str(e) + '(%s)' % url)
except yaml.YAMLError as e:
raise DownloadFailure(str(e))

每个人可能都不一样 "在原本的路径前加https://gexxxxxx.com/"

修改/usr/lib/python2.7/dist-packages/rosdistro/init.py 文件中的 DEFAULT_INDEX_URL

sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/init.py

DEFAULT_INDEX_URL ='https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'

"""
第72行
"""

# default file to download with 'init' command in order to bootstrap
# rosdep
DEFAULT_INDEX_URL ='https://ghproxy.com/https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml'

改其余(4 个)文件中的地址,在地址http://raw.githubsercontent.com/ 前添加http://ghproxy.com/

sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
//修改第36行的地址
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/sources_list.py 72
//修改第72行
sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/rep3.py
//修改第39行
sudo gedit /usr/lib/python2.7/dist-packages/rosdistro/manifest_provider/github.py
//修改第68行、119行

解决 Hit 第五个地址的报错

sudo gedit /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py

在第 204 行添加如下代码(即在该函数块下的第一行处)

gbpdistro_url = "https://ghproxy.com/" + gbpdistro_url
# 注意,原网址中代理地址的双引号是中文,直接粘贴复制会报字符识别错误

如果依然不能解决 Hit 第五个地址的报错,则修改

sudo gedit /etc/resolv.conf

将原有的 nameserver 这一行注释,并添加以下两行:

nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器

保存退出,执行

sudo apt-get update

再执行

sudo rosdep init

ERROR: default sources list file already exists:
/etc/ros/rosdep/sources.list.d/20-default.list Please delete if you wish to re-initialize

解决办法: 执行以下命令,删除已经存在的初始化文件:

sudo rm /etc/ros/rosdep/sources.list.d/20-default.list

然后再重新运行

sudo rosdep init

ROS 功能包的安装

sudo apt-get install ros-melodic-moveit
sudo apt-get install ros-melodic-joint-state-publisher
sudo apt-get install ros-melodic-robot-state-publisher
sudo apt install ros-melodic-gazebo-ros-pkgs
sudo apt-get install ros-melodic-gazebo-ros-control
sudo apt-get install ros-melodic-joint-trajectory-controller
sudo apt-get install ros-melodic-industrial-core

ROS 创建工作空间

mkdir -p ~/inexbot/src
cd ~/inexbot/src
catkin_init_workspace

如果出现

Creating symlink "/root/learn_ros_ws/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"

这种情况,就执行下面的命令

ls -al ~/inexbot/src

之后再运行工作空间初始化命令即可

catkin_init_workspace
cd ../
catkin_make

修改~/.bashrc

gedit ~/.bashrc

在文件末尾添加

source ~/inexbot/devel/setup.bash

把所有 inexbot 的功能包复制到 inexbot/src 目录下

(inexbot 的功能包放在 02 控制器/文档/将新电脑安装开发环境/ros/inexbot_diver 下)

对 moveit 和机器人的进行配置

使用 moveit 对一款机器人的 urdf 模型进行配置,生成的配置文件是 xxx_config 文件夹。里面的文件需要修改。

安装 moveit

新打开一个终端

sudo apt-get install ros-melodic-moveit
source /opt/ros/melodic/setup.bash
sudo apt-get install ros-melodic-moveit-resources

安装后终端输入 加载机器人 urdf

roslaunch moveit_setup_assistant setup_assistant.launch

ros

ros

ros

ros

ros

ros

ros

ros

ros

将 inexbot_driver 文件中的两个文件夹拷贝进来

以及生成的 moveit 文件

ros

将 qj_ws/src/inexbot_support/launch 中 moveit_planning_execution.launch 中所有默认的 moveit 文件夹名称改成 qj_moveit(moveit 文件夹的名字)

ros

ros

inexbot_support/config 中两个.yaml 文件 joints 名称改成 urdf 中的 joints name

ros

qj_moveit/launch/qj_moveit_controller_manager.launch.xml 中红框内容改成(find inexbot_support)/config/controllers.yaml

ros

打开终端

cd qj_ws
catkin_make
source devel/setup.bash
roslaunch inexbot_support moveit_planning_execution.launch sim:=false robot_ip:=192.168.1.13

三、通过 moveit 控制机器人

1.设置 Goal state 控制

5

​ 点击 plan 产生规划轨迹,底部会显示计算用时 Time。

6

​ 点击 execute 执行,也可以点击 plan&execute 规划完立即执行。

2.拖拽规划器控制

​ 拖拽规划器前端的绿色小球,光标放在小球上时,下方出现一个三维坐标,拖拽到目标点,点击 plan 产生规划轨迹,点击 execute 执行,也可以点击 plan&execute 规划完立即执行。

7

四、C++编程实现对机器人的控制

1.创建 ros 功能包,存放程序文件

cd ~/inexbot/src
catkin_create_pkg inexbot_code std_msgs rospy roscpp
cd ../
catkin_make

2.关节空间规划

创建moveit_joint_demo.c

将文件放置到~/inexbot/src/inexbot_code/src路径下

//moveit_joint_demo.c
#include <ros/ros.h>
#include <moveit/move_group_interface/move_group_interface.h>

int main(int argc, char **argv)
{
//ros的初始化
ros::init(argc, argv, "moveit_joint_demo");
ros::AsyncSpinner spinner(1);
spinner.start();

//manipulator是通过moveit设置的规划组
moveit::planning_interface::MoveGroupInterface arm("manipulator");

//容许误差
arm.setGoalJointTolerance(0.001);
//最大加速度
arm.setMaxAccelerationScalingFactor(0.2);
//最大速度
arm.setMaxVelocityScalingFactor(0.2);

// 设置goal_state,控制机械臂先回到初始化位置
//home为moveit预设的位置
arm.setNamedTarget("home");
//运行
arm.move();
sleep(1);
//设置关节空间的六个轴的角度
double targetPose[6] = {0.391410, -0.676384, -0.376217, 0.0, 1.052834, 0.454125};
std::vector<double> joint_group_positions(6);
joint_group_positions[0] = targetPose[0];
joint_group_positions[1] = targetPose[1];
joint_group_positions[2] = targetPose[2];
joint_group_positions[3] = targetPose[3];
joint_group_positions[4] = targetPose[4];
joint_group_positions[5] = targetPose[5];

arm.setJointValueTarget(joint_group_positions);
arm.move();
sleep(1);

// 控制机械臂先回到初始化位置
arm.setNamedTarget("home");
arm.move();
sleep(1);

ros::shutdown();

return 0;
}

修改CMakeLists.txt文件

在 install 标签上面添加

add_executable(moveit_joint_demo src/moveit_joint_demo.cpp)
target_link_libraries(moveit_joint_demo ${catkin_LIBRARIES})
#############
## Install ##
#############

编译代码文件

cd ~/inexbot
catkin_make

运行

rosrun inexbot_code moveit_joint_demo