ROS下樹莓派USBシリアル通信

3208 ワード

工事をするときは、ベリーパイでシリアル通信を行う必要があります.具体的には、あるROSのtopicデータを受信した後、シリアルポートにデータを送信する.コード作成には2つの方法があります.
方法1:serialライブラリの利用
1、運行環境はubuntuで、まずserialライブラリをインストールする:
sudo apt-get install serial

2、構成書のpackage中のCMakeLists.txt
find_パッケージにserialを追加します.
3、デバイスへのUSBポート権限;
4、コードの例:
               manipulator_ros_serial.cpp
#include 
#include 
#include 
#include 

#define sBUFFERSIZE 7
unsigned char s_buffer[sBUFFERSIZE]; 

using namespace std;

serial::Serial ser;

//trans different serial cmds according to different action_cmd(joystick button)
void write_action_cmd(const std_msgs::Int64& action_cmd){
	memset(s_buffer,0,sizeof(s_buffer));
	if( 1 == action_cmd.data ){
		s_buffer[0] = 0x55;
		s_buffer[1] = 0x55;
		s_buffer[2] = 0x05;
		s_buffer[3] = 0x06;
		s_buffer[4] = 0x01;
		s_buffer[5] = 0x01;
		s_buffer[6] = 0x00;
		//std::cout<("serial_port", serial_port_, "/dev/ttyUSB0");
	nh_private.param("baudrate", baudrate_, 9600);
	
	std::cout<

5、USBポート番号とボーレートはlaunchファイルで構成できます. 
       manipulator_ros_serial.launch

    
      
      
    

  
方法2:boostを借りる
1、運行環境はraspbianであり、raspbianにはserialライブラリがない.
2、コード例
           manipulator_ros.h
#ifndef MANIPULATOR_SERIAL_H_
#define MANIPULATOR_SERIAL_H_
#include 
#include 
#include  
#include 
#include 

boost::asio::io_service io;
boost::asio::serial_port sp(io);

namespace manipulator_serial_namespace{
class ManipulatorSerial{
	public:
	      ManipulatorSerial();
	      ~ManipulatorSerial();
	      
	      ros::Subscriber write_sub;
	      
	      //boost::asio::io_service io;
	      
	      void write_action_cmd(const std_msgs::Int64& action_cmd);
	  };
	}

#endif

       manipulator_serial.cpp
#include 

#define sBUFFERSIZE 7
unsigned char s_buffer[sBUFFERSIZE];

using namespace std;
using namespace  boost::asio;

namespace manipulator_serial_namespace{
	ManipulatorSerial::ManipulatorSerial(){
		ros::NodeHandle nh;
	    ros::NodeHandle nh_private("~");
	
	    std::string serial_port_;
	    int baudrate_;
	    nh_private.param<:string>("serial_port", serial_port_, "/dev/ttyUSB0");
	    nh_private.param("baudrate", baudrate_, 9600);
	
	    std::cout<

5、USBポート番号とボーレートはlaunchファイルで構成できます.
    manipulator_serial.launch