lcm接口ubuntu16.04系统qt编程详细步骤

1 前言

lcm是个很好用的接口。

简而言之,是一个UDP传输方案。也就是在UDP外围做了一层封装,使得数据的传输变得比较的方便。

有点像ros的消息传递方式。

 

2参考资料

官网资料就够了。操作步骤简单明了。

http://lcm-proj.github.io/

打开官网如下:

lcm接口ubuntu16.04系统qt编程详细步骤_第1张图片

以下步骤按照图示一步一步操作就可以了。

3 操作步骤

3.1Downloads

点击Downloads,打开下载页面。

lcm接口ubuntu16.04系统qt编程详细步骤_第2张图片

当前日期(20181204)的最新版本是1.4.0

选择安装包lcm-1.4.0.zip,这个是编译后的程序。Source code是当对源码感兴趣或二次开发的时候采用。

下载后解压得到文件夹lcm-1.4.0

历史版本,例如lcm1.3.1,也在这里下载。

 

3.2Build Instructions

安装参考:

点开构建链接。

http://lcm-proj.gitub.io/build_instructions.html

lcm接口ubuntu16.04系统qt编程详细步骤_第3张图片

安装:

进入.zip所在的目录,ctrl+alt+t打开终端,执行以下命令。

unzip lcm-X.Y.Z.zip
cd lcm-X.Y.Z
./configure
make
sudo make install
sudo ldconfig

有时需要安装依赖包,一般不需要。

sudo apt-get install build-essential

sudo apt-get install libglib2.0-dev 

#sudo apt-get install openjdk-6-jdk //如果不用java,这个包就不要装了,300MB

sudo apt-get install python-dev

【如下命令一般不需要,请跳过:

mkdir build

cd build

cmake ..

make

sudo make install
安装完成。

验证:

可以再开一个终端。验证一下安装是否成功。

python

>>>import lcm

>>>

无错误提示,表示安装成功。

重新安装或安装不同版本:

如果系统已经安装过了lcm,再次安装请执行如下步骤:

1)删除旧版本:(一般都安装在/usr/local/lib目录下)

cd /usr/local/lib

ls liblcm*

rm -rf liblcm*

2)执行安装,例如在lcm-X.Y.Z目录下:

cd lcm-X.Y.Z

./configure

make

sudo make install

sudo ldconfig

 

 

3.3 定义结构体

为了方便,直接使用官网例程不改动

http://lcm-proj.github.io/tutorial_general.html

lcm接口ubuntu16.04系统qt编程详细步骤_第4张图片

打开 Step 1: Creating a type definition

参考该页面定义结构体并编译。步骤如下:

找个目录用来放工程,例如prj

在prj下新建空文本文档,命名为example_t.lcm。

打开文档把如下内容帖进去并保存:

package exlcm;

struct example_t

{

int64_t timestamp;

double position[3];

double orientation[4];

int32_t num_ranges;

int16_t ranges[num_ranges];

string name;

boolean enabled;

}

在此目录打开一个终端,执行如下指令:

lcm-gen -x example_t.lcm

此时将生成一个文件夹exlcm,并内含一个文件example_t.hpp

到此,我们的结构体就建好了。

3.4 新建qt发送工程

3.4.1编码步骤

选择控制台工程。

工程名例如publisher

参考lcm官网的

  • Steps 2-4: C++

以及例程

C++ listener.cpp send_message.cpp

做2件事:

1)将publisher工程的自动建的main.cpp内容全部替换为send_message.cpp中的内容;

2)在工程的pro文件中添加路径和库,如下:

lcm接口ubuntu16.04系统qt编程详细步骤_第5张图片

编译工程,就发消息了。

消息只发一次,因此窗口一闪而过。

 

3.4.2遇到的问题

依次说明如下:

1)提示找不到exlcm文件或目录

这说明没有在qt的.pro文件中包含本地目录,请照图添加。

2)error: undefined reference to `lcm_create'

没有添加.so库文件,照图添加。

具体的库路径可能和图上不一样。如果添加不存在的路经,qt不会报错,但是没有效果。需要特别注意。

如果确定自己系统的.so库文件在哪里?

随便开个终端,执行如下命令:

find /usr -name "*liblcm*so"

看到某lib文件夹下有相关文件,就是它了。将库路径修改添加一下。

注意该错误只要工程正确编译一次后,即使将.so包含路径去掉,仍然能够编译通过。但是个隐患。

此时照着该工程新建工程,仍然会重新遇到该错误。

3)qt error while loading shared libraries: liblcm.so.1

属于error while loading shared libraries: libXXX.so类型

使用cmake命令行方式不会报该错误,使用qt界面方式会报错。

可参考网址添加环境变量:http://blog.sina.com.cn/s/blog_69b6a7c601012pgo.html

error while loading shared libraries: libCosmo.so.5.8: cannot open shared object file: No such file or directory

原因是没有设置环境变量,解决办法:

QT错误解决:error <wbr>while <wbr>loading <wbr>shared <wbr>libraries: <wbr>libXXX.so
然后在ld.so.conf中添加动态链接库的目录,效果如下:

include /etc/ld.so.conf.d/*.conf
/usr/local/lib/liblcm*

然后运行如下命令更新动态链接库目录:

QT错误解决:error <wbr>while <wbr>loading <wbr>shared <wbr>libraries: <wbr>libXXX.so
OK!

3.5 新建linsener接收工程

3.5.1编码步骤

方法同上。

C++ listener.cpp send_message.cpp

仍然是2件事:

1)此时使用例程listener.cpp替换main.cpp中的全部内容;

2)在.pro中添加包含路径和库。

效果如下:

lcm接口ubuntu16.04系统qt编程详细步骤_第6张图片

编译通过。

3.5.2遇到的问题

1)GDB: Failed to set controlling terminal

解决Linux下Qt Creator调试C/C++程序出现Debugging starts &"warning: GDB: Failed to set controlling terminal警告。

参考:https://blog.csdn.net/jz1570551401/article/details/78154164?locationNum=2&fps=1

如下图,在Qt左侧面板找到项目,运行,然后在右侧运行标题下的勾选“Run in terminal”。这将使QT Creator在与gdb一起使用的XTerm(默认)中启动该程序,并使“ &"warning: GDB: Failed to set controlling terminal”问题消失。也就是在终端运行你的程序。

 

3.6收发测试

先编译执行linsener,保持窗口监听状态。

再编译执行publisher,窗口一闪而过。

接收窗口收到如下信息:

lcm接口ubuntu16.04系统qt编程详细步骤_第7张图片

OK了。

 

4 常见问题

4.1  python下使用出现undefined symbol: PyInt_AsLong

错误提示:

in[]:import lcm

ImportError: ***/python3.6/site-packages/lcm/_lcm.so: undefined symbol: PyInt_AsLong

问题发生在lcm的python支持晚装不完全的情况。

在lcm安装的./configure步骤,需要查看是否支持python,不支持的信息如下:

lcm接口ubuntu16.04系统qt编程详细步骤_第8张图片

python从3.6换作3.5时,lcm可以正常安装和使用了。

 

4.2 lcm包大小超过缓存

当包太大(例如2MB)时,容易丢数据。

此时需要改大系统收发缓存。

参考官网:

http://lcm-proj.github.io/multicast_setup.html 的章节  Kernel UDP receive buffer sizing

OS Maximum Default
Linux sudo sysctl -w net.core.rmem_max=2097152 sudo sysctl -w net.core.rmem_default=2097152

其中2097152=2×1024×1024,表示2MB。

 

 

 

 

你可能感兴趣的:(lcm接口ubuntu16.04系统qt编程详细步骤)