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
将 inexbot_driver 文件中的两个文件夹拷贝进来
以及生成的 moveit 文件
将 qj_ws/src/inexbot_support/launch 中 moveit_planning_execution.launch 中所有默认的 moveit 文件夹名称改成 qj_moveit(moveit 文件夹的名字)
inexbot_support/config 中两个.yaml 文件 joints 名称改成 urdf 中的 joints name
qj_moveit/launch/qj_moveit_controller_manager.launch.xml 中红框内容改成(find inexbot_support)/config/controllers.yaml
打开终端
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 控制
点击 plan 产生规划轨迹,底部会显示计算用时 Time。
点击 execute 执行,也可以点击 plan&execute 规划完立即执行。
2.拖拽规划器控制
拖拽规划器前端的绿色小球,光标放在小球上时,下方出现一个三维坐标,拖拽到目标点,点击 plan 产生规划轨迹,点击 execute 执行,也可以点击 plan&execute 规划完立即执行。
四、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