gpt4 book ai didi

c++ - ROS 移动约束

转载 作者:行者123 更新时间:2023-11-30 05:44:33 25 4
gpt4 key购买 nike

我正在尝试使用移动它来仅垂直移动 ARM 。这个想法是让末端执行器的尖端始终保持 x 和 y 轴位置,并在每次迭代中更改 z 轴位置,同时保持其方向。我还想在每次迭代中限制从起始位置到结束位置的移动以遵循此约束(x 和 y 固定,z 仅更改)。只要抓手(我的末端执行器)只向上移动,我不关心关节变化多少。

我尝试按照下面的说明进行操作,但我没有看到任何约束被遵循?我做错了什么?

int main(int argc, char **argv){

ros::init(argc, argv, "move_group_interface_tutorial");
ros::NodeHandle node_handle;
ros::AsyncSpinner spinner(1);
spinner.start();


/* This sleep is ONLY to allow Rviz to come up */
sleep(20.0);

moveit::planning_interface::MoveGroup group_r("right_arm");

robot_state::RobotState start_state(*group_r.getCurrentState());
geometry_msgs::Pose start_pose;
start_pose.orientation.x = group_r.getCurrentPose().pose.orientation.x;
start_pose.orientation.y = group_r.getCurrentPose().pose.orientation.y;
start_pose.orientation.z = group_r.getCurrentPose().pose.orientation.z;
start_pose.orientation.w = group_r.getCurrentPose().pose.orientation.w;
start_pose.position.x = group_r.getCurrentPose().pose.position.x;
start_pose.position.y = group_r.getCurrentPose().pose.position.y;
start_pose.position.z = group_r.getCurrentPose().pose.position.z;

//const robot_state::JointModelGroup *joint_model_group = start_state.getJointModelGroup(group_r.getName());
//start_state.setFromIK(joint_model_group, start_pose);
group_r.setStartState(start_state);

moveit_msgs::OrientationConstraint ocm;

ocm.link_name = "r_wrist_roll_link";
ocm.header.frame_id = "base_link";
ocm.orientation.w = 0.0;
ocm.absolute_x_axis_tolerance = 0.0;
ocm.absolute_y_axis_tolerance = 0.0;
ocm.absolute_z_axis_tolerance = 0.1;
ocm.weight = 1.0;
moveit_msgs::Constraints test_constraints;
test_constraints.orientation_constraints.push_back(ocm);
group_r.setPathConstraints(test_constraints);



geometry_msgs::Pose next_pose = start_pose;
while(1){
std::vector<geometry_msgs::Pose> waypoints;
next_pose.position.z -= 0.03;
waypoints.push_back(next_pose); // up and out

moveit_msgs::RobotTrajectory trajectory;
double fraction = group_r.computeCartesianPath(waypoints, 0.005, 0.0, trajectory);

/* Sleep to give Rviz time to visualize the plan. */
sleep(5.0);
}


}

最佳答案

我认为问题出在这个:

ocm.orientation.w = 0.0;

如果你看moveit_msgs::OrientationConstraint引用您找到该 orientation 字段的解释。

# The desired orientation of the robot link specified as a quaternion
geometry_msgs/Quaternion orientation

但是,您将四元数的所有字段都设置为 0(如果未指定,虚构的 x、y 和 z 将初始化为 0),这可能会导致意外行为。

如果您关注了 this tutorial ,您可能已经看到作者设置了 ocm.orientation.w = 1.0;,这意味着方向没有变化(即滚动俯仰角和偏航角等于 0)。因此,请尝试为您的约束指定一个现实的方向。

最后但同样重要的是,为了清楚起见,最好简洁地编写 start_pose 初始化:

geometry_msgs::Pose start_pose = group_r.getCurrentPose().pose;

关于c++ - ROS 移动约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29777767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com