ros1使用过程中遇到的问题记录

文章讨论了在ROS环境中使用moveit时遇到的问题,如因缺少spin函数导致无法获取当前机器人状态。解决方案包括添加spin或AsyncSpinner,以及如何正确实例化MoveGroupInterface和NodeHandle,特别是当尝试将其作为全局变量时。通过创建MoveGroupInterface的全局指针并在main函数内初始化,可以避免程序崩溃。
摘要由CSDN通过智能技术生成

Failed to fetch current robot state

如果使用的是moveit助手生成的demo.launch文件启动机械臂的话,应该是其他在运行的自己写的节点代码中少了spin函数,因为getCurrentPose函数依赖于spin,也可以使用AsyncSpinner。具体看下面这个链接https://answers.ros.org/question/302283/failed-to-fetch-current-robot-state/

代码执行到一半停住了

有的函数依靠spin函数,加上就行了。参照上一条

我出于测试,没写循环也没用spin函数,使用moveit将机械臂移动到一个预定义姿势,此行代码执行完,终端就不动了,既不结束程序,也不继续输出信息。加上spin就行了。

[startArm-5] process has died [pid 14527, exit code -6,

因为想自定义函数操作机械臂,而操作机械臂需要规划组MoveGroupInterface对象,将对象作为参数传入函数感觉有点占用性能,于是我将规划组对象移到main函数外面作为全局变量,就出现了此报错。
moveit::planning_interface::MoveGroupInterface arm("arm_PG"); 

原因:实例化规划组对象需要先实例化NodeHandle对象,但NodeHandle对象是在main函数内实例化。而NodeHandle需要在init函数之后定义,而init函数需要传入main函数的argc和argv。这就导致不能干脆地将规划组MoveGroupInterface实例化直接移出来作为全局变量。

解决办法:可以定义全局规划组指针,如下

#include "" // 一堆include

moveit::planning_interface::MoveGroupInterface *arm;    // 全局指针

int main(int argc, char *argv[])
{
    ros::init(argc, argv, "test_node");
    ros::NodeHandle nh;
    arm = new moveit::planning_interface::MoveGroupInterface("arm_PG");    // 给指针填上东西
    // 获取末端名称
    std::string endEffector_link = arm->getEndEffectorLink();    // .调用需要改为->调用
}

参考https://answers.ros.org/question/350643/node-crashes-with-ros-does-not-seem-to-be-running/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值