【Moveit2】第一个C++ Moveit程序

本文详细介绍了如何在ROS2环境下,通过C++创建并执行Moveit2的第一个程序,包括创建功能包、配置依赖、编写基础节点和运动控制脚本,展示了机械臂定位的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Moveit2】第一个C++ Moveit程序

这个系列的blog会记录笔者学习moveit2的过程。

在第一篇环境配置中,我们对moveit进行了构建,第一次对moveit进行build可能会花费30min左右,请耐心等待。

1.创建功能包

和ROS2的开发流程一致,首先我们需要构建一个功能包来存放我们的脚本程序,进入之前的工作空间ws_moveit2,然后新建我们自己的功能包

cd ~/ws_moveit2/src
ros2 pkg create --build-type ament_cmake \
--dependencies moveit_ros_planning_interface rclcpp \
--node-name hello_moveit2 hello_moveit2

注意这里的选项--node-name hello_moveit2 hello_moveit2,它的用法是--node-name <node_name> <pkg_name>
这里是指定了在hello_moveit2包中的节点hello_moveit2,并且为这个节点自动创建脚本文件hello_moveit2.cpp,然后在CMakeLists.txt中自动配置依赖,主动添加的依赖如下:

add_executable(hello_moveit2 src/hello_moveit2.cpp)
target_include_directories(hello_moveit2 PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_compile_features(hello_moveit2 PUBLIC c_std_99 cxx_std_17)  # Require C99 and C++17
ament_target_dependencies(
  hello_moveit2
  "moveit_ros_planning_interface"
  "rclcpp"
)

然后在hello_moveit2.cpp文件中写入以下内容,这些内容算是编写moveit2节点的基本模板

#include <memory>

#include <rclcpp/rclcpp.hpp>
#include <moveit/move_group_interface/move_group_interface.h>

int main(int argc, char * argv[])
{
  // Initialize ROS and create the Node
  rclcpp::init(argc, argv);
  auto const node = std::make_shared<rclcpp::Node>(
    "hello_moveit",
    rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true)
  );

  // Create a ROS logger
  auto const logger = rclcpp::get_logger("hello_moveit");

  // Next step goes here

  // Shutdown ROS
  rclcpp::shutdown();
  return 0;
}

然后我们再次进入到ws_moveit2工作空间中,进行编译

cd ~/ws_moveit2
colcon build --mixin debug

这次编译的过程会比较快速,只用了1min左右的时间

Image

然后我们可以运行上面的节点,来检验我们的各项配置没有问题

source install/setup.bash
ros2 run hello_moveit2 hello_moveit2

如果每报错就说明没有问题

2.编写运动控制脚本

然后将上面的hello_moveit2.cpp的脚本文件编写如下:

#include <memory>

#include <rclcpp/rclcpp.hpp>
#include <moveit/move_group_interface/move_group_interface.h>

int main(int argc, char * argv[])
{
  // Initialize ROS and create the Node
  rclcpp::init(argc, argv);
  auto const node = std::make_shared<rclcpp::Node>(
    "hello_moveit",
    rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true)
  );

  // Create a ROS logger
  auto const logger = rclcpp::get_logger("hello_moveit");

  // Next step goes here
  // Create hte MoveIt MoveGroup Interface
  using moveit::planning_interface::MoveGroupInterface;
  auto move_group_interface = MoveGroupInterface(node, "panda_arm");

  // Set a target Pose
  auto const target_pose = []{
    geometry_msgs::msg::Pose msg;
    msg.orientation.w = 1.0;
    msg.position.x = 0.28;
    msg.position.y = -0.2;
    msg.position.z = 0.5;
    return msg;
  }();
  move_group_interface.setPoseTarget(target_pose);

  // Create a plan to that target pose
  auto const [success, plan] = [&move_group_interface]{
    moveit::planning_interface::MoveGroupInterface::Plan msg;
    auto const ok = static_cast<bool>(move_group_interface.plan(msg));
    return std::make_pair(ok, msg);
  }();

  // Execute the plan
  if(success){
    move_group_interface.execute(plan);
  }else{
    RCLCPP_ERROR(logger, "Planning failed!");
  }

  // Shutdown ROS
  rclcpp::shutdown();
  return 0;
}

代码中指定了机械臂的一个位姿,然后使用规划器,自动规划了一条路径。
然后再回到工作空间中,再次进行编译,然后运行官方例程

cd ~/ws_moveit2
colcon build --mixin debug
ros2 launch moveit2_tutorials demo.launch.py

rviz中的Displays窗口下的Motion Planning/Planning Request取消勾选Query Goal State,然后新建一个终端

cd ~/ws_moveit2
source install/setup.bash
ros2 run hello_moveit2 hello_moveit2

就可以看到机械臂规划运到到我们指定的位姿了

Image

Reference

[1]Your First C++ MoveIt Project

<think>好的,我需要帮助用户了解如何使用MoveItC++进行机械臂开发,特别是教程和示例代码。首先,我得回忆一下MoveIt的相关知识,尤其是C++接口的部分。根据用户提供的引用,有三个参考资料,其中引用1和2提到了具体的C++程序和规划场景的示例,引用3介绍了MoveIt的基本信息和资源网站。 首先,我应该整理用户的问题要点:用户需要教程和示例代码来使用C++进行MoveIt机械臂开发。根据引用,可以知道MoveIt2的教程中包含了C++程序的示例,比如第一个C++ MoveIt程序和规划场景的示例。此外,引用3提到了MoveIt的官方网站有文档和教程,这可能是一个重要的资源。 接下来,我需要确保回答符合系统级指令,比如正确使用LaTeX格式,生成相关问题,并且引用正确。用户还希望回答结构清晰,逐步指导,所以需要分步骤说明。 第一步,安装和环境配置。根据引用1,用户可能需要处理依赖安装的问题,比如vcs导入失败的情况,这时候可能需要手动下载或切换分支。需要提醒用户注意这一点。 第二步,教程文档结构。引用3提到官方网站有文档,可能需要引导用户查看moveit_tutorials包中的C++示例代码,比如planning_scene_tutorial.cpp。同时,引用2提到了运行示例的启动文件,比如ros2 launch命令,这里需要区分ROS1和ROS2的不同,但用户的问题可能涉及ROS2,因为引用1和2都提到MoveIt2。 第三步,代码示例解析。需要引用具体的代码结构,例如初始化MoveIt组件、设置运动规划参数等。引用1中的Python示例可能不太相关,但C++的示例需要解析,比如创建PlanningSceneInterface和规划请求。这部分可能需要结合引用2中的规划场景示例。 第四步,编译运行。需要指导用户如何编译代码,使用colcon构建系统,并运行示例启动文件,如引用2中的ros2 launch命令。 最后,生成相关问题,可能需要包括调试、与Python对比、实时控制、仿真环境等。 需要检查是否所有LaTeX格式正确,尤其是行内公式用$...$,独立公式用$$...$$。但在这个问题中,可能数学公式较少,但如果有的话要正确应用。例如,如果有涉及运动学的方程,可能需要用LaTeX表示,比如逆运动学公式$J(\theta)\Delta\theta = e$,但用户的问题可能更偏向代码和步骤,所以可能数学公式较少。 另外,要确保引用标记正确,比如[^1]、[^2]、[^3]对应正确的引用内容。引用1是关于第一个C++程序和下载问题,引用2是规划场景的启动文件,引用3是MoveIt的总体介绍和官方网站。 现在,组织回答的结构: 1. 环境准备:安装MoveIt2,处理依赖问题(引用1)。 2. 教程文档:引用3的官方网站和moveit_tutorials包中的C++示例。 3. 示例代码解析:初始化MoveGroupInterface,设置目标姿势,规划路径(引用2的规划场景)。 4. 编译运行:colcon构建和ros2 launch运行(引用2)。 5. 相关资源:官方文档和社区(引用3)。 6. 相关问题:生成四个相关问题,如环境配置、调试、Python对比、实时控制。 需要确保每一步都自然引用对应的文献,比如在讲环境准备时提到引用1的下载问题,在代码解析时提到引用2的启动文件,在资源部分提到引用3的官网。 最后,生成的问题需要与MoveIt C++开发相关,可能包括性能优化、错误处理、与其他库集成等。</think>以下是如何使用MoveItC++进行机械臂开发的步骤说明和示例代码: --- ### 一、环境准备与依赖安装 1. **安装MoveIt2** 确保已安装ROS2 Humble或Iron版本,通过以下命令安装MoveIt2核心包: ```bash sudo apt install ros-<distro>-moveit ``` 若使用教程源码时遇到下载失败(如引用中提到的`vcs import`问题),可手动下载并切换到稳定分支。 2. **获取教程代码** MoveIt官方教程代码位于`moveit2_tutorials`仓库: ```bash git clone -b <branch> https://github.com/ros-planning/moveit2_tutorials.git ``` --- ### 二、C++开发流程 #### 1. 初始化MoveIt组件 ```cpp #include <moveit/move_group_interface/move_group_interface.h> int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node = std::make_shared<rclcpp::Node>("moveit_demo"); auto move_group = std::make_shared<moveit::planning_interface::MoveGroupInterface>(node, "arm_group"); move_group->setMaxVelocityScalingFactor(0.5); // 设置速度限制 } ``` #### 2. 设置目标位姿并规划路径 ```cpp geometry_msgs::msg::Pose target_pose; target_pose.position.x = 0.5; target_pose.orientation.w = 1.0; move_group->setPoseTarget(target_pose); // 运动规划 auto [success, plan] = move_group->plan(); if (success) { move_group->execute(plan); // 执行轨迹 } ``` --- ### 三、关键API解析 - **`MoveGroupInterface`**:核心接口,用于控制机械臂关节组,提供目标设置、规划与执行功能[^2]。 - **`PlanningSceneInterface`**:管理环境障碍物与碰撞检测(如引用[^2]中的规划场景示例)。 --- ### 四、编译与运行 1. **编译配置** 在`CMakeLists.txt`中添加依赖: ```cmake find_package(moveit_ros_planning_interface REQUIRED) ament_target_dependencies(your_node moveit_ros_planning_interface ) ``` 2. **运行示例** 使用官方提供的启动文件: ```bash ros2 launch moveit2_tutorials planning_scene_tutorial.launch.py # 引用[^2] ``` --- ### 五、相关资源 1. [MoveIt官方文档](https://moveit.ros.org/):包含API详解、运动规划算法原理(如逆运动学求解器$J(\theta)\Delta\theta = e$)。 2. 社区示例:参考`moveit_resources`包中的URDF模型与配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值