[ROS]极简开发环境建立流程(新手适用)

2023-05-16

ROS开发环境的建立

  • 一、前言
  • 二、操作系统环境
    • 1. Ubuntu
    • 2. VMWare【可选】
  • 三、ROS运行环境
    • 1. ROS
    • 2. ROS周边设置
    • 3. ROS开发包及帮助获取方式
  • 四、ROS开发环境
    • 1. 建立工作空间——workspace
    • 2. Original开发环境
      • a. 建立基本开发单元——package
      • b. C/C++开发流程【HelloWorld】
        • 编写
        • 编译
        • 运行
      • c. Python开发流程【HelloWorld】
        • 编写
        • 运行
    • 3. IDE开发环境【非必须】
      • a. VSCode及其插件
        • 安装VSCode
        • 安装插件
        • 设置开发环境
        • 建立基本开发单元——package
        • C/C++开发流程【HelloWorld】
        • Python开发流程【HelloWorld】
      • b. Roboware Studio(已停止更新)
  • 五、ROS学习资料
  • 六、后语【应该没有彩蛋】
    • 彩蛋?

一、前言

写在最前面,虽然前前后后也折腾了好几回,检查了好几回,肯定不免疏忽会有弄错的地方,如果有请及时留言指出,博主虽然更新比较慢,但是稍微还是会看一下,这样也可以给后面看的人有个勘误意见供参考。

【正式开始】

其实建立开发环境挺麻烦的,但还好有各种各样的包和大量的资料作为支持,在这里总结一下如何建立一个看起来顺眼,用起来稍微有点顺手的开发环境。

按照本文描述步骤一一完成后即可获得可以正常开发软件的极简环境了。

特此说明:本文仅提供最基础的开发方式,开发环境中所有术语及结构说明解释不是本文应阐述的内容范围,如有不理解的地方请尽量搜索或者查找相关学习资料完善学习。

为之后尽量减少给读者造成理解上的偏差,这里将文章撰写时间写明:【文章成于二〇二〇年初冬】,请以此时间作为阅读本文的参考时间。

二、操作系统环境

本节仅讲述Linux开源环境Ubuntu下的环境设置。

1. Ubuntu

下表为最近的三个版本Ubuntu的简介及下载链接,博主建议选取最新的LTS版本,这样在系统维护服务会有保障。

系统版本系统名称发布时间终止维护时间推荐系统配置
16.04.7(LTS)Xenial Xerus
18.04.5(LTS)Bionic Beaver
20.04.1(LTS)Focal FossaApril 2025CPU:2 GHz(双核);内存:4 GB;硬盘:25 GB

:上表中标明“—”的代表:“官网未标明,请自行搜索信息”

对于上表中博主仅完成了最新的环境建立,其余环境并并未完成建立,最后未使用上述两个环境并非是环境不好而是遇到了短时间难以解决的问题,问题叙述如下:

  • 在尝试建立前两个环境时,ros建立过程中sudo rosdep init出现无法下载的错误,按网络资料(解决方案1,解决方案2,解决方案3,解决方案4)尝试多次后均未能解决,大约需要访问部分显示404网络链接才能正常使用,总的来说解决方法过于复杂,故并未能成功建立这两个环境,如确有需要的读者可试着尝试。

2. VMWare【可选】

官方免费版下载地址或自行搜索免费版,关键字:VMware Workstation Player,或从这里下载。

Ubuntu虚拟机硬件配置

  1. 推荐配置:可按Ubuntu对应版本中提供的官方推荐设置完成设置。
  2. 简易要求:最低配置即满足小型开发和学习的需要,要求如下:
开发环境选取最低配置
Original开发环境单核≥2GHz、内存≥2GB、硬盘空间≥20GB
IDE开发环境双核≥2GHz,内存≥3GB,硬盘空间≥25GB
  1. 其它要求:如有其它要求可自行尝试设置或自行搜索相关信息。

三、ROS运行环境

1. ROS

可点击获取官方下载安装教程,或在下表点击版本名称进入安装教程。

版本简称发布日期终止维护日期Ubuntu版本
ROS Kinetic KamekineticMay, 2016April, 202116.04
ROS Melodic MoreniamelodicMay, 2018May, 202318.04
ROS Noetic NinjemysnoeticMay, 2020May, 202520.04

博主个人建议选用最新版(原因还是有维护(LTS)),当然各位读者可根据自身情况选用合适版本安装。
下面仅列举noetic的安装步骤Terminal指令,如有异议可参照上方给出的官方安装教程链接。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
sudo apt-get install ros-noetic-desktop-full
source /opt/ros/noetic/setup.bash

2. ROS周边设置

安装ros的辅助包,见以下Terminal指令。

#辅助包{可选安装,建议全装}
sudo apt-get install ros-$ROS_DISTRO-teleop-twist-keyboard ros-$ROS_DISTRO-amcl ros-$ROS_DISTRO-move-base ros-$ROS_DISTRO-slam-gmapping ros-$ROS_DISTRO-slam-karto ros-$ROS_DISTRO-map-server ros-$ROS_DISTRO-dwa-local-planner ros-$ROS_DISTRO-teb-local-planner  
#其它常用及依赖软件{可选安装,建议全装}
sudo apt-get install vim
sudo apt-get install default-jdk
sudo apt-get install python
sudo apt-get install python3-pip
sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install clang-format
sudo apt-get install python3-argcomplete #argcomplete插件(python自动补全)
activate-global-python-argcomplete3 --user #激活argcomplete插件
#pip install update pip
#pip install pylint
pip3 install update pip
pip3 install pylint

注:argcomplete其它设置,仅供参考。

3. ROS开发包及帮助获取方式

ROS包搜索获取及安装Terminal指令

apt search ros-noetic #查找包的名称
sudo apt-get install ros-noetic-PACKAGE  #PACKAGE换成对应的包名称

如果要找支持包,可以去ROS包官网索引及git链接中查找。

ROS官网上有很多资源(包括学习资源),诸位可根据需要查看。

四、ROS开发环境

1. 建立工作空间——workspace

假设要建立的工作空间的名称为myworkspace,建立在用户路径下,建立的Terminal命令为

#创建空间
mkdir -p ~/myworkspace/src
cd ~/myworkspace/src &&catkin_init_workspace

#编译空间及批处理设置
cd ~/myworkspace/ &&catkin_make
echo source ~/myworkspace/devel/setup.bash >> ~/.bashrc
source ~/.bashrc

# 检查设置成功与否
# 如果建立成功,则输出结果应包含"/home/${USER}/myworkspace/src"的路径
echo $ROS_PACKAGE_PATH

这样就建立好了一个工作空间,程序的开发就可以在myworkspace工作空间中进行。
有新建工作空间自动化工具可以方便的建立workspace(自动化工具不能检测输入是否合法,请大家尽量小心的输入正确地址和workspace的名称)。


另,乱码问题(仅作为一个参考性的资料):
此外,对于文件中文显示乱码问题可以参见该篇文章,查看系统支持字符集及设置字符集简要步骤可参见以下代码:

cat /usr/share/i18n/SUPPORTED #查看系统支持字符集
sudo vi /var/lib/locales/supported.d/zh #使用vim修订增加字符集
sudo locale-gen #更新系统显示字符集

但是博主尝试后发现,以上解决乱码的方法并对部分乱码问题几乎无用,如果有碰见该问题,可以尝试使用此方法。


2. Original开发环境

a. 建立基本开发单元——package

假设要建立的package的名称为helloworld,建立在myworkspace工作空间中,依赖包包括std_msgs、rospy、 roscpp。

#创建package
cd ~/myworkspace/src
catkin_create_pkg helloworld std_msgs rospy roscpp

#编译package,确认package创建正确,如成功创建则
cd ~/myworkspace &&catkin_make

这样就建立好了一个基本开发单元,程序的开发就可以在helloworld的package中进行。
为方便建立基本开发单元,有新建package自动化工具可以方便的建立package(自动化工具无法检测地址和输入是否合法,请大家尽量在当前工作空间根目录下运行该文件,一定一定要谨慎输入,保证输入的所有地址和package名称正确


对于package内,常用的文件夹有include(默认建立)、src(默认建立)、scripts、msg和srv,可按照使用需要自行添加。


b. C/C++开发流程【HelloWorld】

编写

使用语句新建helloworld.cpp文件

cd ~/myworkspace/src/helloworld/src/ &&touch helloworld.cpp
gedit helloworld.cpp

并在文件helloworld.cpp内键入以下代码(建议手动输入,尽量不要复制粘贴):

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char** argv)
{
	ros::init(argc, argv, "helloworld");
	ros::NodeHandle n;
	ros::Publisher helloworld_publisher = n.advertise<std_msgs::String>("/letallknow", 10);
	ros::Rate loop_rate(10);
	unsigned int count = 0;
	std_msgs::String msg;
	msg.data = "hello world!";
	
	while(ros::ok())
	{
		ROS_INFO("%s: %d", msg.data.c_str(), count);
		helloworld_publisher.publish(msg);
		count++;
		loop_rate.sleep()
	}
	return 0;
}

然后使用语句打开helloworld/CMakeLists.txt文件

cd ~/myworkspace/src/helloworld/
gedit CMakeLists.txt

在helloworld/CMakeLists.txt文件下添加代码

add_excutable(helloworld src/helloworld.cpp)
target_link_libraries(helloworld ${catkin_LIBRARIES})

即完成了程序的编写。

编译

使用语句

cd ~/myworkspace/
catkin_make

编译整个工作空间。

运行

使用语句roscore打开roscore,并在另一个Terminal内输入语句
rosrun helloworld helloworld
完成后,程序开始运行。

c. Python开发流程【HelloWorld】

编写

使用语句新建scripts文件夹

mkdir ~/myworkspace/src/helloworld/scripts

新建helloworld.cpp文件

cd ~/myworkspace/src/helloworld/scripts/ &&touch helloworld.py
gedit helloworld.py

在文件helloworld.py内键入以下代码(建议手动输入,尽量不要复制粘贴):

#!/usr/bin/env python3

import rospy
from std_msgs.msg import String

def helloworld():
	rospy.init_node('helloworld')
	helloworld_publisher = rospy.Publisher('/letallknow', String, queue_size=10)
	rate = rospy.Rate(10)
	mymsg = String("hello world!")
	count = 0
	
	while not rospy.is_shutdown():
		rospy.loginfo('%s: %d', mymsg.data, count)
		helloworld_publisher.publish(mymsg)
		rate.sleep()
		count += 1

if __name__ == '__main__':
	helloworld()
	

运行

改变文件可执行属性:

  • 在scripts文件夹中找到helloworld.py右键选中Properties,之后再在Permissions的Tab中找到Execute选中□ Allow executing file as program

  • 打开Terminal,执行以下语句
chmod +x ~/myworkspace/src/helloworld/scripts/helloworld.py

打开新的Terminal,运行roscore命令,并在另一个Terminal内输入语句
rosrun helloworld helloworld.py
完成后,程序开始运行。

3. IDE开发环境【非必须】

a. VSCode及其插件

安装VSCode

VSCode安装包.deb官方下载地址,如下载速度过慢可从这里下载。
下载完成双击.deb文件后自动安装,即得到VSCode开发环境。

安装插件

本节提供搜索的关键字,在VSCode的插件市场中自行搜索完成安装,VSCode插件安装简易教程,如果仍然有疑问,请自行搜索解决。

  1. 基本插件

ros
c/c++
python

  1. 语法检查及代码补全与其它需要插件

ESLint
Pylance
MagicPython
C++ Intellisense
Better C++ Syntax
Code Spell Checker
msg language support
Bracket Pair Colorizer 2
Visual Studio IntelliCode
c/c++ clang command adapter

  1. 格式插件

Clang-Format
xml tools
ROS snippets

  1. 注释插件

koroFileHeader

  1. 语言支持包

Chines(Simplified)Language Pack
可另搜索Language Pack来获取需要的语言包,

其它与显示主题相关的插件不为本文的阐述范围,有兴趣的读者可以自行寻找配置。

设置开发环境

开发环境设置步骤如下,假设已经建立了myworkspace这个工作空间:

  • 在myworkspace目录下输入命令code .,进入vscode;
  • 菜单栏选取 Terminal -> Configure default build task或按下Ctrl+Shift+P后输入Tasks:Configure default build task回车选中,选择catkin_make: build;
  • 关闭tasks.json,即完成了环境的配置。

如还有对环境设置有疑问,请参见这篇文章或这篇文章,或自行探索。

语言开发环境的插件的使用不属于本节叙述范围,如有特殊需要的读者可自行探索研究。

建立基本开发单元——package

右键点击myworkspace工作空间中的src文件选择Create Catkin Package 或 按下 Ctrl+Shift+P后输入ROS:Creat Catkin Packge回车选中,然后根据提示依次输入

  • Package name(Press ‘Enter’ to confirm or ‘Escape’ to cancel):输入helloworld
  • Dependencies (Press ‘Enter’ to confirm or ‘Escape’ to cancel):输入std_msgs rospy roscpp

为了方便起见,将该package的名称定为helloworld,其中依赖包输入格式为每个包以空格隔开,常用包有【std_msgs rospy roscpp】,最后就成功建立了一个package。


对于package内,常用的文件夹有include(默认建立)、src(默认建立)、scripts、msg和srv,可按照使用需要自行添加。


C/C++开发流程【HelloWorld】

  • 编写
    在helloworld的src文件夹下新建helloworld.cpp文件,文件内键入以下代码(建议手动输入,尽量不要复制粘贴):
#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char** argv)
{
	ros::init(argc, argv, "helloworld");
	ros::NodeHandle n;
	ros::Publisher helloworld_publisher = n.advertise<std_msgs::String>("/letallknow", 10);
	ros::Rate loop_rate(10);
	unsigned int count = 0;
	std_msgs::String msg;
	msg.data = "hello world!";
	
	while(ros::ok())
	{
		ROS_INFO("%s: %d", msg.data.c_str(), count);
		helloworld_publisher.publish(msg);
		count++;
		loop_rate.sleep()
	}
	return 0;
}

在helloworld/CMakeLists.txt文件下添加以下代码

add_excutable(helloworld src/helloworld.cpp)
target_link_libraries(helloworld ${catkin_LIBRARIES})

即完成了程序的编写。

  • 编译
    按下Ctrl+Shift+B,等待完成编译。
  • 运行
    打开新的Terminal,运行roscore命令
    然后回到VSCode空间中,按下Ctrl+Shift+P,输入ROS:Run a ROS excutable (rosrun),回车后依次填入
  • Choose a package: 输入包名称helloworld
  • Choose an executable: 输入执行文件名称helloworld
  • Enter any extra arguments(Press ‘Enter’ to confirm or ‘Esc’ to cancel): 直接回车

完成上述步骤,程序即开始运行。

Python开发流程【HelloWorld】

  • 编写
    在helloworld下新建scripts文件夹,并在文件夹scripts下新建文件helloworld.py。
    打开helloworld.py文件后,在文件内键入以下代码(建议手动输入,尽量不要复制粘贴):
#!/usr/bin/env python3

import rospy
from std_msgs.msg import String

def helloworld():
	rospy.init_node('helloworld')
	helloworld_publisher = rospy.Publisher('/letallknow', String, queue_size=10)
	rate = rospy.Rate(10)
	mymsg = String("hello world!")
	count = 0
	
	while not rospy.is_shutdown():
		rospy.loginfo('%s: %d', mymsg.data, count)
		helloworld_publisher.publish(mymsg)
		rate.sleep()
		count += 1

if __name__ == '__main__':
	helloworld()

  • 运行
    改变文件可执行属性:
  • 右键点击helloworld.py选中Open Containing Folder,或左键选中helloworld.py按下Ctrl+Alt+R
  • 在文件夹中找到helloworld.py右键选中Properties或左键选中helloworld.py按下Ctrl+I,之后再在Permissions的Tab中找到Execute选中Allow executing file as program

  • 打开Terminal,执行以下语句
chmod +x ~/myworkspace/src/helloworld/scripts/helloworld.py

打开新的Terminal,运行roscore命令
然后回到VSCode空间中,按下Ctrl+Shift+P,输入ROS:Run a ROS excutable (rosrun),回车后依次填入

  • Choose a package: 输入包名称helloworld
  • Choose an executable: 输入执行文件名称helloworld.py
  • Enter any extra arguments(Press ‘Enter’ to confirm or ‘Esc’ to cancel): 直接回车

完成上述步骤,程序即开始运行。

b. Roboware Studio(已停止更新)

由于已经停止更新,且最新版本仅支持Ubuntu-Melodic,所以该项目博主并未尝试,仅提供下载链接及开发资料链接供大家自行尝试安装包下载链接,开源源代码链接。

五、ROS学习资料

  1. ROS官网链接(资料最全)
  2. 古月ROS入门21讲(用时较短,上手快): bilibili链接、古月居链接
  3. 机器人操作系统入门(用时较长,内容多): 中国大学MOOC、中国大学MOOC

六、后语【应该没有彩蛋】

嗯。如果按照上面一步一步来还没有完成环境建立,请给博主留言问题后,并自行出门左转度娘谷哥,自行搜索查找解决建立环境问题。(博主【正常应该大概可能也许一定一时半会】不会帮你想如何解决的,但是你可以帮助到后面看的人)。

就到这里了~ 如果有帮助的话,欢迎点赞、收藏、转载本文链接,但千万别留言,留言板留给存在问题或想给出建议或指出错误的小盆友们~~

如果不喜欢本文请自行Alt+F4,嗯。。。That’s it!

彩蛋?

2020年11月23日:

  1. 为兼容python2,三、2.节增加sudo apt-get install python
  2. 三、2.节原指令sudo apt-get install python3-pipx有误,修订为sudo apt-get install python3-pip
  3. pip指令会出现不存在的情况,修订pip install update pippip install pylintpip3 install update pippip3 install pylint
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[ROS]极简开发环境建立流程(新手适用) 的相关文章

  • kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

    kinova jaco2使用Moveit 控制真实机械臂抓取固定点物体 一 机械臂坐标系 坐标系方向 位姿方向 轴的起始点 二 启动机械臂和Moveit 三 实现抓取 python代码 python文件建议直接用python启动 四 遇到的
  • ROS之QtCreator开发环境搭建

    文章目录 系统环境 官方教程 安装 卸载 使用 导入工作空间 构建与运行 编写测试程序 系统环境 操作系统 Ubuntu20 04 ROS版本 Noetic 官方教程 按照官方教程或者下面笔记中的内容均能进行环境搭建 笔记中另外做了部分补充
  • ROS系统基本功能的使用详解(基本指令/节点/服务/启动文件/动态参数)

    ROS系统基本功能的使用详解 一 创建工作空间 二 创建与编译ROS功能包 三 ROS的基本命令 3 1 节点 3 2 主题 3 3 服务 3 4 参数服务器 四 节点的创建与运行 4 1 创建源文件 4 2 修改CMakeLists tx
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • ROS2踩坑记录

    Vscode 显示 找不到module 以此选择 设置 Python 在setting json中编辑 在 python autoComplete extraPaths 中添加额外的第三方库路径 如 opt ros foxy lib pyt
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • Ubuntu16.04安装ROS Kinetic详细步骤

    文章目录 ROS安装 配置Ubuntu软件仓库 设置sources list 设置密钥 更新Debian软件包索引 安装ROS 初始化 rosdep 环境配置 构建工厂依赖 测试安装 开发环境 ROS安装 ROS Kinetic只支持Wil
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • Kinect / Primesense (Xtion) ROS Ubuntu 通过虚拟机 (VMware)

    由于我花了相当长的时间才弄清楚如何让 Xtion Primesense 在 VMware 上工作 所以我想在这里与大家分享 使用 Kinect 时 即使 VMware 已成功连接该设备 我也无法让 ROS 查看该设备 roslaunch o
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c

随机推荐

  • 产品管理精华:第十一,数据的思维方式

    xfeff xfeff 数量庞大 增长迅猛 种类多样的数据已经成为企业在大数据时代发展不得不面临的现实境况 这是挑战 xff0c 也是机遇 基于客户需求 xff0c 提供领先 全面 有效的解决方案 xff0c 帮助企业获取商业洞察力 xff
  • 产品管理精华:第十四,产品炼成?

    xfeff 最近一段时间在准备信息系统项目管理师 的考试 xff0c 在备考复习过程中 xff0c 通过系统学习和理解项目管理相关知识 xff0c 发现项目和产品管理联系很密切 项目过程是伴随着产品过程而生 我们先来了解一下项目的定义 xf
  • glib简单记录包括字符串,主循环,回调函数和xml解析

    一 将最近用到的glib字符串功能整理了下直接用程序记录比较好看懂 define MAX LEN 100 gchar demo char msg gchar pcfgfile 61 NULL para 61 NULL va list arg
  • 产品管理精华:第十六,品味

    美感是第一道关卡 xff0c 丑陋的数学在世界上无法生存 G H 哈代 xff0c 一个数学家的道歉 品味 xff0c 如今很少听到这个词了 xff0c 可能被一些新的 xff0c 流行的叫法替代了 很长一段时间 xff0c 谈论品味这玩意
  • 《产品管理精华》目录

    产品管理精华 目录 本文是这个目录 xff0c 可以快速找到你需要的内容 xff1a 产品管理精华 xff1a 第一 xff0c 谁是优秀的产品经理 xff1f 产品管理精华 xff1a 第二 xff0c 工具 xff0c 适合自己的最好
  • 电商分销的社交化运营实践

    最近一段时间专注于研究社交化的电商分销运营体系 xff0c 如何最大化利用碎片化社会资源来整合营销渠道 目前最有代表性的电商分销就是全民分销概念 xff0c 它的最大特点在于通过社交网络 xff08 大部分是通过微信商城开店 43 三级返佣
  • 《产品管理精华》序

    今日事 xff0c 今日毕 xff01 xff0c 说起来容易 xff0c 做起来难 知道为什么要去做一件事 xff0c 这样做了哪些人都受到实惠 xff0c 领悟生活的趣味 xff0c 自己是否也得到了快乐和满足 xff0c 每一份付出都
  • 个人简介

    经验丰富的产品设计师 xff0c 专门从事与产品设计相关的研究 趋势分析 理念探索和产品研发 专注于政策脉搏和市场趋势的研究 xff0c 成功研发多个互联网相关领域产品 xff0c 对移动互联网产品架构 运营管理有较为深入的管控能力 欢迎大
  • 产品管理精华:第一,谁是优秀的产品经理?

    34 人因为梦想而伟大 34 英格丽 褒曼 每个人的心中都有一个梦想 xff0c 梦想是美好的 xff0c 但是实现梦想的道路是曲折的 xff0c 无数人在实现梦想的道路上遭遇了无数曲折 xff0c 尽管如此 xff0c 他们依旧大步向前
  • 产品管理精华:第三,需求调研,从用户出发

    因为需要 xff0c 让我更加完美 佚名 产品经理都会遇到 客户 用户 这两个概念念 xff0c 它们谁更重要也一直争论不休 用户 近乎苛刻的需求可以不断产品体验和质量 xff0c 同时产品投入市场之后都会遇到变现这个问题 xff0c 总需
  • 第1章 概述--PADS的历史版本

    1986年 xff1a PADS PCB xff0c DOS操作系统 1989年 xff1a PADS Logic xff0c DOS操作系统 1990年 xff1a PADS 2000 xff0c DOS操作系统 1993年 xff1a
  • docker安装图形化界面

    分享第一份Java基础 中级 高级面试集合 Java基础 xff08 对象 43 线程 43 字符 43 接口 43 变量 43 异常 43 方法 xff09 Java中级开发 xff08 底层 43 Spring相关 43 Redis 4
  • 嵌入式软件开发岗面试题

    1 单片机IO口开漏输出和推挽输出有什么区别 xff1f 答 xff1a 开漏输出 xff1a 开漏输出只能输出低电平 xff0c 如果要输出高电平必须通过上拉电阻才能实现 就类似于三极管的集电极输出 推挽输出 xff1a 推挽输出既可以输
  • pytorch 查看模型结构 网络参数

    用法比较简单 xff0c 不过容易忘 xff0c 记录一下 假设已定义好模型 xff0c 名为model 查看模型结构 xff1a gt gt gt print model 查看网络参数 xff1a for name parameters
  • 【Linux网络编程】select函数实现TCP并发服务器

    I O多路复用 应用程序中同时处理 多路 输入输出流 xff0c 若采用 阻塞模式 xff0c 将得不到预期的目的 xff1b 若采用 非阻塞模式 xff0c 对多个输入进行轮询 xff0c 但又太浪费 CPU 时间 xff1b 若设置 多
  • 【校招】面试_华为_通用软件工程师_二面

    1 面试信息 面试形式 xff1a 视频面试 面试时间 xff1a 2020 03 25 11 30 00 AM 面试时长 xff1a 40分钟 面试职位 xff1a 软件技术开发部 通用软件工程师 xff08 无线网络产品线 通用软件开发
  • 你必须会的启发式搜索算法--A*算法

    一 算法原理 A 算法 xff0c 就是解决在一个平面 grid地图中寻找起点到终点的最短路径问题的算法 xff0c 类似于Dijkstra算法和BFS算法一样 xff0c 属于广度优先搜索 实际上它还是一个启发式搜索算法 xff0c 什么
  • C/C++/LINUX 资源网站

    C C 43 43 LINUX 资源网站 本博客记录学习 开发中常用的网站 http www cplusplus com c 43 43 官网 xff0c 包含c 43 43 介绍以及一些简单的使用样例 目前主要用来查询 STL 的使用 h
  • 焊接单片机最小系统板,驱动lcd1602

    今天分享一些我制作单片机最小系统板的过程以及遇到的问题和解决办法 本人萌新一枚 xff0c 写文章就是我们大家互相学习交流 之前学习的是郭天祥的tx 1c单片机 xff0c 书中的例程都写的差不多了 xff0c 就想着自己焊接一个最小系统板
  • [ROS]极简开发环境建立流程(新手适用)

    ROS开发环境的建立 一 前言二 操作系统环境1 Ubuntu2 VMWare 可选 三 ROS运行环境1 ROS2 ROS周边设置3 ROS开发包及帮助获取方式 四 ROS开发环境1 建立工作空间 workspace2 Original开