ROS移植到Cyber小结(protobuf)

文章目录

    • 一、安装Cmake-3.16版本
    • 二、protobuf文件问题
          • 1.关于包名的命名
          • 2.time 自定义为uint64
          • 3.char 用float代替
    • 三、编译生成后类成员变量访问方法
    • 四、geometry_msgs 改写后赋值(嵌套+repeated)
    • 五、交叉编译生成二进制文件过大
    • 六、回调函数是类成员函数
    • 七、Proto3 区别于 Proto2 的使用
      • 参考文档:

一、安装Cmake-3.16版本

cmake官网正常是上不去的,需要fq

二、protobuf文件问题

1.关于包名的命名
  • 推荐的写法是从根目录开始写,使用绝对路径(需要统一整个大的目录结构框架)
  • 前期可根据之前的ros功能包名及节点名来进行命名
  • 消息名用“驼峰式命名法”,消息变量名不能有大写字母
  • 属性顺序号需要按照顺序进行定义,且不允许有重复
  • import用于包含其他proto文件的message/enum类型(import的文件需与当前文件处于同一文件夹下)
  • 对于已编译好的项目,若要增加新的消息
    • 不要修改已存在字段的编号
    • 不能移除已经存在的required字段
    • 移除optional和repeated类型字段时,顺序号必需保留,不可复用
syntax = "proto2";

import "std_msgs.proto";

package dispensing.machine_control;

message Wheel{
  optional float wheel_rpm = 1;
  optional float wheel_angle = 2;
  optional float wheel_distance = 3;
  repeated std_msgs.Header header = 4;
}
2.time 自定义为uint64
 message Header {
    optional uint32 seq = 1;
    optional uint64 stamp = 2;
    optional string frame_id = 3;
    
}
3.char 用float代替
message IoInputStatus{
	optional float io = 1;
}

三、编译生成后类成员变量访问方法

/*set_*/
//ROS
deviceInfoBasic.voltage  = 	bms_data->Voltage_of_pack;
//Cyber
deviceInfoBasic.set_voltage(bms_data->voltage_of_pack());

//对于string类型,提供一个mutable_方法,返回变量值的可修改指针

/* 针对repeated变量 */
message SingleModuleStu{
	optional int32	module_index = 1;
	repeated int32	status = 2;
}
//获取repeated变量的大小(_size)
int nSize = motor_info->status_size();

//通过下脚标访问其中的数据成员组
int nSize = motor_info->status_size();
int16_t mAddr = 0x2002;
if(nSize <= 0)
{
    return;
}
m_motor_num = nSize;
for(int j = 0; j < nSize*2; j += 2)
{
        m_motor_err_split_info[j] = (m_motor_err_info[j/2] >> 16) & 0xFFFF;
        m_motor_err_split_info[j+1] = (m_motor_err_info[j/2]) & 0xFFFF;
}
//通过下脚标返回其中的成员的mutable_的方法
inline ::std::string* mutable_name();
//_add方法:增加一个成员(如下)

四、geometry_msgs 改写后赋值(嵌套+repeated)

为了方便特意将geometry_msgs、std_msgs从.msg文件改写成了同名的.proto文件

// geometry_msgs.proto 文件部分内容

message Twist{
	repeated Vector3 linear = 1;
	repeated Vector3 angular = 2;
}

message Vector3 {
    optional double x = 1;
    optional double y = 2;
    optional double z = 3;
}

message PoseStamped {
    repeated std_msgs.Header header = 1;
    repeated Pose pose = 2;
}
  1. 赋值方式一:
geometry_msgs::Twist twist;

twist.add_linear()->set_x(0);
twist.add_linear()->set_y(0);
twist.add_linear()->set_z(0);
twist.add_angular()->set_x(0);
twist.add_angular()->set_y(0);
twist.add_angular()->set_z(0);
  1. 赋值方式二:
geometry_msgs::Twist twist;
geometry_msgs::Vector3* linear;
geometry_msgs::Vector3* angular;

linear = twist.add_linear();
angular = twist.add_angular();

linear->set_x(0);
linear->set_y(0);
linear->set_z(0);
angular->set_x(0);
angular->set_y(0);
angular->set_z(0);

五、交叉编译生成二进制文件过大

#前期可以先用这个方法
aarch64-linux-gnu-strip machine_control 

#后续版本稳定后可以将交叉编译的模式由debug改为release

六、回调函数是类成员函数

  • 用lambda表达式(apollo 的回调都是用apollo表达式的)

七、Proto3 区别于 Proto2 的使用

  • 在第一行非空非注释行,必须写:syntax = “proto3”;
  • 字段规则移除 「required」,并把 「optional」改为 「singular」
  • 「repeated」字段默认使用 paced 编码
  • 移除 default 选项
  • 枚举类型的第一个字段必须要为 0
  • 移除对扩展的支持,新增 Any 类型, Any 类型是用来替代 proto2 中的扩展的
  • 增加了 JSON 映射特性

参考文档:

Protobuf使用手册

ProtoBuf3 C++使用篇

protobuf repeated类型的使用

Protobuf 的 proto3 与 proto2 的区别

Apollo Cyber RT操作系统学习记录(一)

你可能感兴趣的:(DDS,protobuf,c++)