Skip to content

ROS 使用教程

本文介绍 ROS 的基本使用方法,包括创建工作空间、配置 URDF 模型、通过 MoveIt 控制机器人以及 C++ 编程实现控制。可结合视频教程 NexDroid 与 ROS 结合-连接和使用 一起学习。

1. 创建工作空间

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

如果出现异常:

执行以下命令:

bash
ls -al ~/inexbot/src

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

bash
catkin_init_workspace
cd ../
catkin_make

2. 配置 ~/.bashrc

bash
gedit ~/.bashrc

在文件末尾添加:

bash
source ~/inexbot/devel/setup.bash

将 inexbot 功能包复制到 ~/inexbot/src 目录下。

3. 配置 MoveIt

安装 MoveIt

新开一个终端,执行:

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

启动 MoveIt Setup Assistant

bash
cd ~/inexbot
source ./devel/setup.bash
roslaunch moveit_setup_assistant setup_assistant.launch

将 inexbot_driver 文件中的两个文件夹拷贝进来,以及生成的 moveit 文件:

qj_ws/src/inexbot_support/launchmoveit_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

打开终端,编译并启动:

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

4. 通过 MoveIt 控制机器人

方法一:设置 Goal State

点击 Plan 生成规划轨迹,底部会显示计算用时 Time。

点击 Execute 执行,也可以点击 Plan & Execute 规划完立即执行。

方法二:拖拽规划器

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

5. C++ 编程控制机器人

创建功能包

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

关节空间规划示例

将以下代码保存为 src/moveit_joint_demo.cpp,放入 ~/inexbot/src/inexbot_code/src/

cpp
#include <ros/ros.h>
#include <moveit/move_group_interface/move_group_interface.h>

int main(int argc, char **argv)
{
    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);

    // 控制机械臂回到初始化位置(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

add_executable 标签上方添加:

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

编译并运行

bash
cd ~/inexbot
catkin_make
rosrun inexbot_code moveit_joint_demo