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

【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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用MoveIt获取末端姿态的C程序的基本示例: ``` #include <ros/ros.h> #include <moveit/move_group_interface/move_group_interface.h> #include <moveit/planning_scene_interface/planning_scene_interface.h> #include <moveit_msgs/DisplayRobotState.h> #include <moveit_msgs/DisplayTrajectory.h> #include <moveit_msgs/AttachedCollisionObject.h> #include <moveit_msgs/CollisionObject.h> #include <tf2_geometry_msgs/tf2_geometry_msgs.h> int main(int argc, char **argv) { ros::init(argc, argv, "moveit_demo"); ros::NodeHandle nh; // 创建MoveGroup接口 moveit::planning_interface::MoveGroupInterface move_group("manipulator"); // 设置目标终端姿态 geometry_msgs::PoseStamped target_pose; target_pose.header.frame_id = "base_link"; target_pose.pose.position.x = 0.5; target_pose.pose.position.y = 0.0; target_pose.pose.position.z = 0.5; tf2::Quaternion q; q.setRPY(0,0,1.57); // 绕z轴旋转90度 target_pose.pose.orientation = tf2::toMsg(q); // 设置终端姿态为目标姿态 move_group.setPoseTarget(target_pose); // 进行规划 moveit::planning_interface::MoveGroupInterface::Plan my_plan; bool success = (move_group.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS); // 移动到目标姿态 if(success) { move_group.move(); ROS_INFO("Move to target pose successfully."); } else { ROS_ERROR("Failed to move to target pose!"); } // 获取当前终端姿态 geometry_msgs::PoseStamped current_pose = move_group.getCurrentPose(); // 输出当前终端姿态 ROS_INFO_STREAM("Current end effector pose:\n" << current_pose.pose); return 0; } ``` 该程序使用MoveIt来规划机械臂的运动,并获取当前机械臂的末端姿态。首先,创建一个MoveGroup接口并设置目标终端姿态。然后,使用MoveIt进行规划并执行运动。最后,获取当前终端姿态并输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值