lcm是个很好用的接口。
简而言之,是一个UDP传输方案。也就是在UDP外围做了一层封装,使得数据的传输变得比较的方便。
有点像ros的消息传递方式。
官网资料就够了。操作步骤简单明了。
http://lcm-proj.github.io/
打开官网如下:
以下步骤按照图示一步一步操作就可以了。
点击Downloads,打开下载页面。
当前日期(20181204)的最新版本是1.4.0
选择安装包lcm-1.4.0.zip,这个是编译后的程序。Source code是当对源码感兴趣或二次开发的时候采用。
下载后解压得到文件夹lcm-1.4.0
历史版本,例如lcm1.3.1,也在这里下载。
安装参考:
点开构建链接。
http://lcm-proj.gitub.io/build_instructions.html
安装:
进入.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
为了方便,直接使用官网例程不改动
http://lcm-proj.github.io/tutorial_general.html
打开 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
到此,我们的结构体就建好了。
选择控制台工程。
工程名例如publisher
参考lcm官网的
以及例程
C++ | listener.cpp | send_message.cpp |
做2件事:
1)将publisher工程的自动建的main.cpp内容全部替换为send_message.cpp中的内容;
2)在工程的pro文件中添加路径和库,如下:
编译工程,就发消息了。
消息只发一次,因此窗口一闪而过。
依次说明如下:
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
原因是没有设置环境变量,解决办法:
然后在ld.so.conf中添加动态链接库的目录,效果如下:
include /etc/ld.so.conf.d/*.conf
/usr/local/lib/liblcm*
然后运行如下命令更新动态链接库目录:
OK!
方法同上。
C++ | listener.cpp | send_message.cpp |
仍然是2件事:
1)此时使用例程listener.cpp替换main.cpp中的全部内容;
2)在.pro中添加包含路径和库。
效果如下:
编译通过。
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”问题消失。也就是在终端运行你的程序。
先编译执行linsener,保持窗口监听状态。
再编译执行publisher,窗口一闪而过。
接收窗口收到如下信息:
OK了。
错误提示:
in[]:import lcm
ImportError: ***/python3.6/site-packages/lcm/_lcm.so: undefined symbol: PyInt_AsLong
问题发生在lcm的python支持晚装不完全的情况。
在lcm安装的./configure步骤,需要查看是否支持python,不支持的信息如下:
python从3.6换作3.5时,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。