@Lorry 我以前做控制的时候用过这部分,但是用角加速度和加速度输出的角度值是没问题的,或者你在里面写一个代码把它转换成角度说不定就可以验证了
重要提示
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
空白 发布的帖子
-
RE: Imu坐标系转换以及数据验证
-
RE: Imu坐标系转换以及数据验证
https://blog.csdn.net/will_ye/article/details/116401523#:~:text=rosrun%20rviz%20rviz%201%20%E2%91%A4,%E5%9C%A8rviz%E9%87%8C%E9%9D%A2add%E8%BF%99%E4%B8%AA%E6%8F%92%E4%BB%B6%20rviz_imu_plugin%20%EF%BC%8C%E4%BC%9A%E6%9C%89%E4%B8%A4%E4%B8%AA%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%80%E4%B8%AA%E8%A7%92%20rviz_plugin_tutorials%20%EF%BC%8C%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%98%BE%E7%A4%BA%E7%9A%84%E6%98%AF%E7%BB%8F%E8%BF%87%E6%BB%A4%E6%B3%A2%E5%92%8C%E5%90%88%E6%88%90%E5%90%8E%E7%9A%84%E5%9B%9B%E5%85%83%E6%95%B0%E5%92%8C%E5%8A%A0%E9%80%9F%E7%AD%89%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%80%8C%E7%AC%AC%E4%BA%8C%E4%B8%AA%E7%94%A8%E6%9D%A5%E6%98%BE%E7%A4%BA%E5%8E%9F%E5%A7%8Bimu%E6%95%B0%E6%8D%AE
可以参考下这个链接
-
RE: Imu坐标系转换以及数据验证
@Lorry 我记得imu有办法(好像是一个功能包)看到tf变换是否是对的,当时的操作就是晃动手里的陀螺仪,然后看rviz里面的运动和手里是不是一样,但是我没具体看
-
RE: Imu坐标系转换以及数据验证
@Lorry 在 Imu坐标系转换以及数据验证 中说:
目前成品imu的坐标系(x、y、z轴的顺序)一般为右-前-上或者左-前-下,这和ros中定义的小车坐标系不一致(小车坐标系为前-左-上),所以就需要将imu坐标系转换到小车坐标系。
我对这方面不是特别了解,但是我觉得可以不自己进行转换,尝试使用TF变换会不会效果会好一点?而且可以通过tf tree查看具体的转换问题
-
Moveit2 怎么在Rviz里面直接显示机械臂末端轨迹?
我目前实现显示末端轨迹的方法是通过
moveit_visual_tools::MoveItVisualTools visual_tools(move_group_node, "base_link", "move_group_tutorial", move_group.getRobotModel()); visual_tools.publishPath(path, rvt::BLUE, 0.005);
来实现相关功能的,但是我发现当机械臂模型没有定义末端执行器(end effector)的时候是不能直接使用像
visual_tools.publishTrajectoryLine(my_plan.trajectory_, joint_model_group);
这样获取的(不知道是不是bug)。
我记得rviz可以直接设置Show Trail来显示末端轨迹的,但是在MotionPlanning里面的Planned Path没有用,RobotModel里面也没有找到,想问问大家是怎么显示轨迹的。
版本ROS2 humble -
RE: 在同一个节点,没定义callback_group的情况下,有多个回调函数,请问算是多个线程么
@Lorry 那就是说,如果资源足够的情况下,遇到话题服务动作相关的数据处理,最好都是使用多线程来完成?
-
RE: 在同一个节点,没定义callback_group的情况下,有多个回调函数,请问算是多个线程么
@Lorry 那单纯的定时和监听是不是单线程也能实现呢,因为定时和监听之间肯定存在时间差,比如说我先监听,然后以低于监听的速度定时发布内容?
-
RE: 在同一个节点,没定义callback_group的情况下,有多个回调函数,请问算是多个线程么
@Lorry 你好,我也想问一下,什么情况下要使用单线程执行器,什么时候要用多线程执行器?如果没有写是默认使用的单线程执行器吗?之前没有学过这类的编程,只学过c,不是特别了解
-
如何通过代码判断当前机械臂正在运动?
我在写一个小小的demo,想实现的功能是:机械臂移动一小段轨迹,在移动前输出机械臂的位姿,在移动过程中每隔固定时间输出机械臂的关节角度,在移动结束后输出机械臂结束的位姿,目前已经基本实现;但是想询问下大家如何只在移动过程在输出当前关节角?
补充:我是通过订阅/joint_states 这一话题实现的,然后通过定时器固定时间发布,但是不知道如何判断只有在移动时才发布关节角,所以输出屏幕会很多
-
RE: 机械臂代码一直卡在(move_group.plan(my_plan)部分
@小鱼 在 机械臂代码一直卡在(move_group.plan(my_plan)部分 中说:
去掉肯定是不行的,试试多线程执行器,原来的估计是跨线程通信造成死锁问题了
好的,谢谢小鱼,这个问题基本上解决了,后面就是去github上面多找找代码学习和练手
-
RE: 机械臂代码一直卡在(move_group.plan(my_plan)部分
@小鱼 我明白为什么官方要使用这个代码了,去掉后的确不能得到目前机械臂的状态了
像介绍里面描述的一样// We spin up a SingleThreadedExecutor for the current state monitor to get // information about the robot's state.
但是离谱的是如果加上这个就没办法从plan那部分循环里面出来
-
RE: 机械臂代码一直卡在(move_group.plan(my_plan)部分
@小鱼 这个应该顺便解释了之前很多人在群里问Moveit Documentation:Humble documentation 这部分里面关于Visualizing In RViz 提供的代码为什么会执行不下去卡住的原因,因为官方也是用的这部分spin方法
https://moveit.picknik.ai/humble/doc/tutorials/visualizing_in_rviz/visualizing_in_rviz.html
// We spin up a SingleThreadedExecutor for the current state monitor to get // information about the robot's state. rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(node); auto spinner = std::thread([&executor]() { executor.spin(); });
我之前在这里也卡住了,但是没有认真考虑这个问题
-
RE: 机械臂代码一直卡在(move_group.plan(my_plan)部分
@小鱼 嗯嗯,把这个去掉后就跳出循环了,后面代码也执行了,但是前面又出现问题了,我再重新看看代码。官方源码是这样写的
// We spin up a SingleThreadedExecutor for the current state monitor to get information // about the robot's state. /* 我们为当前状态监视器启动SingleThreadExecutor以获取信息 关于机器人的状态。 rclcpp::executors::SingleThreadedExecutor executor;//初始化执行器 单线程执行器 executor.add_node(node);//将要实时控制的节点添加到Executor Executor 不维护对节点的强引用(只是一个weak_ptr,所以shared_ptr 计数不会增加) std::thread([&executor]() { executor.spin(); }).detach();//spin直到 rclcpp::ok() 返回 false 是不是就相当于node.spin()? */ rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(move_group_node); std::thread([&executor]() { executor.spin(); }).detach();
去掉这个spin后出现了之前没有出现的问题,不过这个原因确实解决了,谢谢 小鱼
-
RE: 机械臂代码一直卡在(move_group.plan(my_plan)部分
@空白 目前排查到的原因应该是关于MoveGroup的action client/server 目前自己的节点向move_group发送请求得到了响应,但是move_group的反馈结果没有返回给自己的节点,在
[move_group-1] [INFO] [1670712315.987015277] [moveit_move_group_default_capabilities.move_action_capability]: Received request [move_group-1] [INFO] [1670712315.987152679] [moveit_move_group_default_capabilities.move_action_capability]: executing.. [move_group-1] [INFO] [1670712315.991030377] [moveit_move_group_default_capabilities.move_action_capability]: Planning request received for MoveGroup action. Forwarding to planning pipeline. [move_group-1] [INFO] [1670712315.991917639] [moveit.ompl_planning.model_based_planning_context]: Planner configuration 'manipulator' will use planner 'geometric::RRTConnect'. Additional configuration parameters will be set when the planner is constructed. [move_group-1] [INFO] [1670712316.032067397] [moveit_move_group_default_capabilities.move_action_capability]: Motion plan was computed successfully.
时应该会向自己的节点发送
[panda_move_node-1] [INFO] [1670754384.475582319] [move_group_interface]: Planning request accepted [panda_move_node-1] [INFO] [1670754384.543603441] [move_group_interface]: Planning request complete!
对应的反馈结果,但是我自己编写的abb_move_node并没有接收到,所以就一直卡在等待响应的过程中了,但是还是没有想到怎么解决