做机械臂导航时遇到的问题5:如何使用ROS内嵌serial功能包实现串口通信

 

摘自:https://blog.csdn.net/weixin_39579805/article/details/78809681?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param

做机械臂导航时遇到的问题5:如何使用ROS内嵌serial功能包实现串口通信

 

VIP文章 立雪青松 2017-12-15 09:54:54 5582 收藏 5

分类专栏: 机械臂导航 文章标签: ROS 机械臂 joint_states 串口通信 serial

版权

    在订阅joint_states话题,获取到position和velocity的数据之后,如何将这些信息发给下位机呢?下位机都具备串口,我们通过串口实现与下位机的通讯。在本篇中,我们采用ROS内嵌的Serial功能包实现串口通讯,当然还有其他方式来实现。

这里参考各位大神的文章,在这里表示感谢:

1、ROS中串口的使用——serial功能包:点击链接

2、ROS串口通信:点击链接

 

一、建立工作目录并下载serial功能包

 

 
  1. $mkdir -p ~/catkin_ws2/src/mypackage/

  2. $cd ~/catkin_ws2/src/mypackage/

  3. $git clone https://github.com/wjwwood/serial.git


二、创建串口节点

 

1、在mypackage目录下建立串口节点程序包:

 

$catkin_create_pkg my_serial_node std_msgs rospy roscpp

 

生成文件效果如下:

 


 

2、修改 CMakeLists.txt,修改后内容如下:

 

 
  1. cmake_minimum_required(VERSION 2.8.3)

  2. project( my_serial_node )

  3. find_package(catkin REQUIRED COMPONENTS

  4. roscpp

  5. serial

  6. std_msgs

  7. )

  8.  
  9. catkin_package(

  10. CATKIN_DEPENDS

  11. serial

  12. std_msgs

  13. )

  14. include_directories(

  15. ${catkin_INCLUDE_DIRS}

  16. )

  17. add_executable( my_serial_node src/my_serial_node.cpp)

  18. target_link_libraries( my_serial_node

  19. ${catkin_LIBRARIES}

  20. )

  21. add_executable(talker src/talker.cpp)

  22. target_link_libraries(talker ${catkin_LIBRARIES})

  23.  
  24. add_executable(listener src/listener.cpp)

  25. target_link_libraries(listener ${catkin_LIBRARIES})


3、修改package.xml,添加刚刚下载的serial 依赖

 

 

 
  1. <?xml version="1.0"?>

  2. <package>

  3. <name> my_serial_node</name>

  4. <version>0.0.0</version>

  5. <description>my serial node </description>

  6.  
  7. <maintainer email="xs@todo.todo">xs</maintainer>

  8. <license>BSD</license>

  9. <buildtool_depend>catkin</buildtool_depend>

  10. <build_depend>serial</build_depend>

  11. <build_depend>std_msgs</build_depend>

  12. <run_depend>serial</run_depend>

  13. <run_depend>std_msgs</run_depend>

  14. </package>

 

 


4、在 mypackage/my_serial_node/src目录下创建my_serial_node.cpp 文件

 

 
  1. #include "ros/ros.h"

  2. #include <serial/serial.h>

  3. #include <std_msgs/String.h>

  4. #include <std_msgs/Empty.h>

  5. #include "sensor_msgs/JointState.h"

  6. #include <string>

  7. #include <sstream>

  8. serial::Serial ros_ser; //声明串口对象

  9. //回调函数

  10. void jointstatesCallback(const sensor_msgs::JointStateConstPtr& msg)

  11. {

  12. std::stringstream str;

  13. str<<"joint1: pos:"<<msg->position[2]<<" vel:"<<msg->velocity[2]

  14. <<" joint2: pos:"<<msg->position[0]<<" vel:"<<msg->velocity[0]

  15. <<" joint3: pos:"<<msg->position[1]<<" vel:"<<msg->velocity[1]<<std::endl;

  16. ROS_INFO_STREAM("Writing to serial port" );

  17. ros_ser.write(str.str()); //发送串口数据

  18. }

  19.  
  20. /*void callback(const std_msgs::String::ConstPtr& msg)

  21. {

  22. std::stringstream str;

  23. str<<"joint1: pos:"<<1.0<<" vel:"<<2.0<<std::endl;

  24. ROS_INFO_STREAM("Write to serial port" << msg->data);

  25. ros_ser.write(str.str()); //发送串口数据

  26. }*/

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

  28. ros::init(argc, argv, "my_serial_node"); //初始化节点

  29. ros::NodeHandle n; //声明节点句柄

  30. //订阅主题/joint_states,并配置回调函数

  31. ros::Subscriber command_sub = n.subscribe("/joint_states", 1000, jointstatesCallback);

  32. //发布主题sensor

  33. ros::Publisher sensor_pub = n.advertise<std_msgs::String>("sensor", 1000);

  34.  
  35. try

  36. {

  37. //设置串口属性,并打开串口

  38. ros_ser.setPort("/dev/ttyUSB0");

  39. ros_ser.setBaudrate(115200);

  40. serial::Timeout to = serial::Timeout::simpleTimeout(1000);

  41. ros_ser.setTimeout(to);

  42. ros_ser.open();

  43. }

  44. catch (serial::IOException& e)

  45. {

  46. ROS_ERROR_STREAM("Unable to open port ");

  47. return -1;

  48. }

  49.  
  50. //检测串口是否已经打开,并给出提示信息

  51. if(ros_ser.isOpen()){

  52. ROS_INFO_STREAM("Serial Port opened");

  53. }else{

  54. return -1;

  55. }

  56.  
  57. //指定循环的频率

  58. ros::Rate loop_rate(10);

  59.  
  60. while(ros::ok()){

  61.  
  62. //处理ROS的信息,比如订阅消息,并调用回调函数

  63. ros::spinOnce();

  64.  
  65. if(ros_ser.available()){

  66. ROS_INFO_STREAM("Reading from serial port");

  67. std_msgs::String serial_data;

  68. //获取串口数据

  69. serial_data.data = ros_ser.read(ros_ser.available());

  70. ROS_INFO_STREAM("Read: " << serial_data.data);

  71. //将串口数据发布到主题sensor

  72. sensor_pub.publish(serial_data);

  73. }

  74. loop_rate.sleep();

  75. }

  76. }


5、关于话题的发布者:由my_serial_node.cpp文件中的回调函数可知, ros::Subscriber command_sub = n.subscribe("/joint_states", 1000, jointstatesCallback);

 

我们订阅的是/joint_states话题。(做机械臂导航时遇到的问题4:如何订阅joint_states话题(输出关节状态)

 

6、创建listener节点,接收串口助手发送的信息

在 mypackage/my_serial_node/src目录下新建文件 listener.cpp ,并在 CMakeLists.txt 中添加以下内容(已在上述CMakeList中添加):

 

 
  1. add_executable(listener src/listener.cpp)

  2. target_link_libraries(listener ${catkin_LIBRARIES})


listener.cpp文件内容如下:

 

 

 
  1. #include "ros/ros.h"

  2. #include "std_msgs/String.h"

  3. //回调函数

  4. void callback(const std_msgs::String::ConstPtr& msg)

  5. {

  6. ROS_INFO("I heard: [%s]", msg->data.c_str());

  7. }

  8.  
  9. int main(int argc, char **argv)

  10. {

  11. ros::init(argc, argv, "listener");

  12. ros::NodeHandle n;

  13. //订阅主题,接收串口数据

  14. ros::Subscriber sub = n.subscribe("sensor", 1000, callback);

  15. ros::spin();

  16. return 0;

  17. }


7、编译

 

 

 
  1. $cd ~/catkin_ws2/

  2. $catkin_make

编译成功后输入 source /devel/setup.bash

 

 

三、串口助手

在另一台笔记本上下载安装串口调试助手,我们选择的是sscom33,百度云链接https://pan.baidu.com/s/1bo7WRrL

用串口线连接两台电脑。

 

四、测试

1、先运行用arbotix来模拟控制机械臂,这会启动/joint_states话题。参考(做机械臂导航遇到的问题3:如何用arbotix接口控制机械臂    做机械臂导航时遇到的问题4:如何订阅joint_states话题(输出关节状态)

2、在新终端运行$roscore

3、在新终端运行$rosrun my_serial_node my_serial_node

4、在新终端运行$rosrun my_serial_node listenner

my_serial_node终端效果如下

listener终端效果如下,可以接收串口助手发送的信息

另一台电脑串口助手效果如下,在arbotix gui窗口控制滑块时,可以看到相应joint1、joint2、joint3的数据发生变化,如果连接了下位机和电机,便可手动控制真实机械臂。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
要在UR5e机械臂末端安装Robotiq-2F85夹爪,并使用ROS功能进行控制,可以按照以下步骤进行操作: 1. 首先,确保你已经在UR5e机械臂上正确安装了Robotiq-2F85夹爪,并且夹爪的通信和电源已经连接好。 2. 确保你的机器人上已经安装了ROS,并且配置了适当的URDF(Unified Robot Description Format)文件,以描述机械臂的结构和关节信息。 3. 在ROS工作空间创建一个新的功能,可以使用以下命令: ``` $ cd ~/catkin_ws/src $ catkin_create_pkg robotiq_control rospy ``` 4. 进入功能目录,创建一个名为"scripts"的文件夹,并在该文件创建一个Python脚本文件,用于控制Robotiq-2F85夹爪。例如,可以创建一个名为"robotiq_control.py"的文件。 5. 在Python脚本文件,导入必要的库和消息类型,例如rospy和Robotiq.msg。然后,编写代码来控制夹爪的动作,例如打开、关闭、设置位置等。你可以根据Robotiq的文档或示例代码来编写控制逻辑。 6. 在功能目录下创建一个名为"launch"的文件夹,并在该文件创建一个名为"robotiq_control.launch"的launch文件。在launch文件,配置节点和参数,以启动机器人控制节点和夹爪控制节点。 7. 编译ROS功能,可以使用以下命令: ``` $ cd ~/catkin_ws $ catkin_make ``` 8. 启动ROS节点,可以使用以下命令: ``` $ roslaunch robotiq_control robotiq_control.launch ``` 9. 现在,你应该能够通过ROS功能来控制UR5e机械臂末端的Robotiq-2F85夹爪了。你可以通过发布适当的消息到相关的ROS话题,来控制夹爪的动作。 请注意,以上步骤只是一个基本的指南。实际操作可能会有其他细节和配置,具体取决于你的机器人和环境。你可以查阅Robotiq和ROS的官方文档,以获取更详细的步骤和示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值