Giter Club home page Giter Club logo

create_robot's People

Contributors

clydemcqueen avatar coderkarl avatar jacobperron avatar kmoriarty avatar lopsided98 avatar owen7900 avatar pgold avatar process1183 avatar selimxsuha avatar trainman419 avatar vinnnyr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

create_robot's Issues

catkin build fails

I'm getting errors about missing header files when I run catkin build.
ca_msgs/ChargingState.h is the first missing file.
The first bad commit is ea79707
The last commit that builds is 589a15e
I can give more info if you need it but it just looks like a "git add ca_msgs/." was forgotten.

Add ability to change mode

Could have a subscriber that listens to a custom message for changing the mode of Create (OFF, PASSIVE, SAFE, and FULL). Or as a minimum, have a parameter to the node that starts the robot in SAFE or FULL mode.

Odom is wrong on Create 1

Hi.
I am working with Create 1 and no matter how the robot moves the only change in /odom is in pose.position.x only! all others are zeros. Also, the orientation is always x=0, y=0, z=0, w=1

I am building the package from source on ROS Kinetic/ Ubuntu 16

Here is an output of the odom topic, after i did some random moves:

header: 
  seq: 6659
  stamp: 
    secs: 1511204611
    nsecs: 762806633
  frame_id: odom
child_frame_id: base_footprint
pose: 
  pose: 
    position: 
      x: 1.17099511623
      y: 0.0
      z: 0.0
    orientation: 
      x: 0.0
      y: 0.0
      z: 0.0
      w: 1.0
  covariance: [0.6134979128837585, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 18.377765655517578, 0.0, 0.0, 0.0, 22.565868377685547, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 22.565868377685547, 0.0, 0.0, 0.0, 36.8668212890625]
twist: 
  twist: 
    linear: 
      x: 0.0
      y: 0.0
      z: 0.0
    angular: 
      x: 0.0
      y: 0.0
      z: 0.0
  covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

Add ability to start built-in cleaning modes

I think a subscriber listening to a custom cleaning mode message will be good. Then we will also need a way to stop/pause any active cleaning behaviours.

Proposal:

uint8 CLEAN_MODE_NONE=0
uint8 CLEAN_MODE_DEFAULT=1
uint8 CLEAN_MODE_MAX=2
uint8 CLEAN_MODE_SPOT=3

Header header
uint8 mode

Or maybe instead of CLEAN_MODE_NONE users could use another topic to change the mode out of PASSIVE #13

Support IR Omni and bumper sensors in Gazebo

Put simply, it lists that the ir sensors are supported with this repo, but I'm unable to see it as a topic in ros with gazebo and the create_2.launch file, is this feature only for runtime instead of gazebo?

Roomba 780 Incorrect Odometry

Hi when using the roomba 780 the Odometry for rotating is not correct.
It will turn a bit less then 1,125 in rviz when only turning a full circle in real life.
Is there an easy way to change this behavior?
Also how would i make changes to libcreate package and use this package i can not seem to locate it on my computer.
Thanks in advance

EDIT:
Also because the odometry is determined in the libcreate package i can not simply change it in the create_driver.cpp since then the arrow will point correctly but when going straight it will not move straight forward in rviz.
Also I found the package in devel/src/libcreate I am trying to see if changes help here.

EDIT:
In the util.h of libcreate i edited the V_3_TICKS_PER_REV to make the drift as small as possible. I don't know if this is the best option though.

How to publish covariance for ekf

HI, I'm using a intel d435i for navigation with create 2

I want to use robot pose ekf package to combine odometry and IMU data

I have seen create_driver.cpp already publish covariance matrix

but when I launch the robot driver, it shows the following error

[ERROR] [1594611946.458760993]: Covariance specified for measurement on topic wheelodom is zero
[ERROR] [1594611946.500368988]: filter time older than odom message buffer

Is the covariance matrix not publish to the topic?

Deviation driving straight

I am currently experiencing a problem where when I want to drive straight forward there will be a deviation to the right.
The odometry will also show this deviation.
I can simply solve it sending less power to the right wheel. Can I use the straight_radius parameter to change this behaviour or is there any other way then chaging create.cpp?

Inaccurate odometry at low speeds on Create 1

An annoying issue I am running into with my Create 1 is that at low speeds angular velocities, the odometry does not register that the robot is turning. After thinking about this for a while I realized this is because of the incremental nature and low resolution of the angle sensor field.

Since this field only has a resolution of 1 degree, and it is polled and reset to 0 every 15 ms, this means that any rotational speed below 67 deg/sec appears as no movement, assuming the value is rounded down. I haven't measured exactly, but this seems to match the behavior I have noticed.

Another side effect of this issue is that the odometry reading can drift significantly even at higher speeds, because of the rounding of the angle. In the worst case, this could mean that the heading is drifting 67 or 33 deg/sec, depending on whether the angle is rounded down or to the nearest whole number.

There are a few ways I can think of fixing this problem. Sampling at a lower rate would reduce the minimum speed at which rotation can be measured, but it really doesn't solve the problem. Another way to mitigate the problem is to integrate the wheel velocities, but this has its own issues. For one, the Create only exposes its requested wheel velocities, but these might be close enough to the actual velocities to make an improvement over the current situation.

I am really starting to see why the Turtlebot includes a gyroscope, and I might investigate this as another solution.

I'll test out a few solutions and submit a PR if I can make any improvements.

Dirt detect sensor

I am using an iRobot Create 2 and am trying to get dirt detect data through a publisher but I don't know if this is right.

  • create_driver.h:
    adding in:
    std_msgs::UInt16 dirt_msg_; //dirt
    void publishDirtInfo() const; //dirt
    ros::Publisher dirt_detect_pub_; //dirt

  • create_driver.cpp:

adding in
dirt_detect_pub_ = nh.advertise<std_msgs::UInt16>("dirt_detect", 10);
publishDirtInfo() //i add that in update()

So I read that the dirt sensor is a "piezoelectric sensor (essentially a crystal that generates electrical impulses when things strike it). When bits of dirt hit the sensor, they generate tiny electric impulses and, presumably, an excessive number of these impulses triggers 'dirt detect'." The problem is when I echo the dirt_detect topic, it only gives me val

Error!

Hello! I want to run my iRobot Create 2 with my Ubuntu Computer that is running ROS Kinetic 16.04 (with maybe a Raspberry Pi 3 in the future) but have had very bad luck. But when I came across AutonomyLab, I gave it a shot. And it kinda worked, but I got this error:
ERROR: launch node of type [ca_driver/ca_driver]: can't locate node [ca_driver] in package [ca_driver]
I don't know why it's doing that, but any help is appreciated. Thanks!
I just started using ROS and my iRobot Create 2 a few days ago, so I don't know a lot.
EDIT: Here's my CMakeLists file:

cmake_minimum_required(VERSION 2.8.3)
project(ca_driver)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  geometry_msgs
  nav_msgs
  tf
  ca_msgs
)

find_package(Boost REQUIRED system thread)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES libcreate
  CATKIN_DEPENDS roscpp std_msgs geometry_msgs nav_msgs tf ca_msgs ca_description
)

include(ExternalProject)
ExternalProject_Add(libcreate
  GIT_REPOSITORY https://github.com/AutonomyLab/libcreate.git
  GIT_TAG 1.2.1
  PREFIX ${CATKIN_DEVEL_PREFIX}
  CONFIGURE_COMMAND cmake .
  BUILD_COMMAND make
  INSTALL_COMMAND echo "No install"
  BUILD_IN_SOURCE 1
)

set(libcreate_PATH "${CATKIN_DEVEL_PREFIX}/src/libcreate/")

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${Boost_INCLUDE_DIRS}
  ${libcreate_PATH}/include
  include
)

link_directories(${libcreate_PATH})

add_executable(ca_driver src/create_driver.cpp)

target_link_libraries(ca_driver
  create
  ${catkin_LIBRARIES}
  ${Boost_LIBRARIES}
)
add_dependencies(ca_driver libcreate)

Edit 2: Bump! I don't see why this is not working, it should be, right? I tried everything from sourcing stuff do trying to rosrun the node which I don't know how to do!
Edit 3: Aha. There is nothing in ~/my_catkin_ws/devel/lib/ except for pkgconfig. And there was no errors running catkin build when I first built it, but now I can't catkin_make it.

Odometry error is huge while rotate in place

Hi, I am trying to use Create2 as a move base to implement navigation.
while using AMCL to localize thre robot, it will fit the map when moving straightly. but when rotating, AMCL will not adjust at all. As a result, if rotating angle is larger, say 30 degree, only rotation no translation, AMCL will never find the localization. It may be caused by inaccurate rotating angle computed by odometry. when I turn 360 degree. in rviz, it's about 420 degree. I wonder whether I can increase the axle length value to relieve the huge error? And I cannot find how to do it.

No joy_teleop.py file

I am trying to run the ca_tools joy_teleop.launch file but I am getting an error saying "cannot launch node of type [joy_teleop/joy_teleop.py]: joy_teleop. I do not see this type of file in either joy or create_autonomy. Where does it come from?

Create 1 Odometry Not Changing

Hello,
We have just started using the create_autonomy package on our create 1 roombas but the odom message seems to never update. The odom message continuously outputs a unit quaternion for orientation and zeros for the position, linear velocity, and angular velocity after pushing the robot around by hand. We have the configuration as default with the "robot_model:" parameters set to CREATE_1. Is there a configuration problem or does the odometry not work on the create 1s?
Thank you for your time.

roomba 527 `terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' what(): write: Input/output error`

Hi I'm using create_autonomy under the condition below.

roomba: series 527
raspi 3B
connection: UART ( not via serial cable)
Ubuntu Mate 18.04.2 Bionic Beaver
Ros melodic
(Since I'm not pro, information below may be insufficient or may contain useless information.)

According to README, it's written that roomba series 500 user should use ca_driver create_1.launch, but it didn't work for me.
(Error failed to establish connection was shown)

Instead, when I used create_2.launch it worked and I was able to rotate roomba using /cmd_vel.

Hope this would help someone who is struggling.

Odom topic parameters

Hello everyone,

I'm doing a localization project using create_autonomy package. When I display topic "odom" (rostopic echo /odom), I see parameter "z" and "w" under "orientation" section. I think "z" parameter represents the angle the robot turns but I'm not sure what unit it is. The robot was turned roughly 90 degrees and "z" parameter showed around 0.7, so either the unit is not radian or the error the robot experiencing is huge.

Please let me know what "z" and "w" parameters mean and the units of them.
Any help would be much appreciated.

Thanks

Roomba Wi-fi

Hi,
I have a Roomba 765 with the wi-fi module. There are some possibility to connect the node with roomba using wi-fi instead of usb?

Thanks!

Need help for create_autonomy

I'm doing a localization project on iRobot Create 2 using this create_autonomy package.
I have some questions:

  1. What are the units for the positions x, y and velocities? - I moved the robot in a measured distance (50 cm = 1.64 ft) and my x position was 1.4. The only plausible unit I can see is ft, but I'm not 100% sure. For the velocity, I think the unit is m/s. However, I need someone to confirm on this.

  2. If unit of position is indeed ft, how can I change it to meters ? Since the unit of wheelDiameter is meter so I think might as well just keep everything consistent.

  3. I already changed the wheelDiameter to 0.071m according to my physical measurement on the wheel. Just wondering if you guys would suggest changing the number of ticks per revolution (ticks_per_rev) to improve accuracy. If so, what would be the best value for Create 2 (current default value is 508.8).

Thanks. I would really appreciate any help.

Errors in Kinetic / ARM

Hi, I'm really impressed with this code but have run into a couple of issues, I think might be related.

First, I constantly get this error:

[ERROR] [1543867337.867718293]: [CREATE] Unknown mode detected: 252743663270254058981690501133436787895498668826663733637000776013412360950214277709398187746400460009372844193492090595425297940066201946348352200523363198873163318461413287195509944170593093187536689539940275561930708793405606929731851927692420771088109218725054971849345505388159995781185415942242304.000000

I've modified the code to spit out the mode value, this is the very large number.

Additionally, I can't visualize odometry in rviz because of a similar problem. Some of the covariance numbers are just huge:

pose: pose: position: x: 0.000722417084035 y: -7.40265249988e-07 z: 0.0 orientation: x: 0.0 y: 0.0 z: -0.00102470564418 w: 0.999999474989 covariance: [0.000361207639798522, -7.402609298878815e-07, 0.0, 0.0, 0.0, -0.0010246954625472426, -7.402609867313004e-07, 4.551321985957202e-09, 0.0, 0.0, 0.0, 1.0500214557396248e-05, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7976931348623157e+308, 0.0, -0.0010246954625472426, 1.0500214557396248e-05, 0.0, 0.0, 0.0, 0.026162702590227127]

I've forked the repo and I'd do my best to make changes / fixes if you can point me in the right direction. Thanks!

Use sensor_msgs/Range for bumpers?

It was suggested that maybe using the sensor_msgs/Range message type might be a nice alternative to replace the custom Bumper message. It could be used as follows:
field_of_view = 0.34 (bumper size)
max_range = 0 (no contact)
min_range = -0.00891 (bumper contact)
Bumper is pressed if: msg.range < 0

Unfortunately, this message type would only encapsulate one of the two contact sensors on Create and I don't like the idea of having two separate messages for each bumper.

Also, the light sensors would then have to be moved to a different message type. Perhaps sensor_msgs/Illuminance?

ca_driver failing during catkin build

The build for the source is failing on the ca_driver. Followed the steps for the Install and Compile sections with the exception that I'm running kinetic.

I am running on a Pi 3 Model B (ARMv71) with Ubuntu 16.04.5 LTS. I have ensured that I have an updated ros-kinetic and Ubuntu 16.04 distribution. I have sourced kinetic and the catkin workspace.

Here's the results when I run catkin build:

ubuntu@rrover32g:~/rrover$ catkin build
--------------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/kinetic
Workspace:                   /home/ubuntu/rrover
--------------------------------------------------------
Source Space:       [exists] /home/ubuntu/rrover/src
Log Space:          [exists] /home/ubuntu/rrover/logs
Build Space:        [exists] /home/ubuntu/rrover/build
Devel Space:        [exists] /home/ubuntu/rrover/devel
Install Space:      [unused] /home/ubuntu/rrover/install
DESTDIR:            [unused] None
--------------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
--------------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
--------------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
--------------------------------------------------------
Workspace configuration appears valid.
--------------------------------------------------------
[build] Found '5' packages in 0.0 seconds.                                                                      
[build] Package table is up to date.                                                                            
Starting  >>> ca_description                                                                                    
Starting  >>> ca_msgs                                                                                           
Starting  >>> ca_tools                                                                                          
Finished  <<< ca_description                [ 1.2 seconds ]                                                     
Finished  <<< ca_tools                      [ 0.8 seconds ]                                                     
Finished  <<< ca_msgs                       [ 1.9 seconds ]                                                     
Starting  >>> ca_driver                                                                                         
________________________________________________________________________________________________________________
Errors     << ca_driver:make /home/ubuntu/rrover/logs/ca_driver/build.make.001.log                              
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `tf::quaternionTFToMsg(tf::Quaternion const&, geometry_msgs::Quaternion_<std::allocator<void> >&)':
create_driver.cpp:(.text+0xec): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::CreateDriver(ros::NodeHandle&)':
create_driver.cpp:(.text+0x418): undefined reference to `ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
create_driver.cpp:(.text+0x45a): undefined reference to `ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
create_driver.cpp:(.text+0x45e): undefined reference to `ros::this_node::getName()'
create_driver.cpp:(.text+0x5f4): undefined reference to `ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
create_driver.cpp:(.text+0xc2e): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0xd34): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'
create_driver.cpp:(.text+0xdaa): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0xe8a): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'
create_driver.cpp:(.text+0xf5c): undefined reference to `create::Create::connect(std::string const&, int const&)'
create_driver.cpp:(.text+0xfca): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0x10ca): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0x11de): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0x2980): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::~CreateDriver()':
create_driver.cpp:(.text+0x3510): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o:create_driver.cpp:(.text+0x3c14): more undefined references to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' follow
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::defineSongCallback(boost::shared_ptr<ca_msgs::DefineSong_<std::allocator<void> > const> const&)':
create_driver.cpp:(.text+0x4390): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::playSongCallback(boost::shared_ptr<ca_msgs::PlaySong_<std::allocator<void> > const> const&)':
create_driver.cpp:(.text+0x445a): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0x452a): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::publishMode()':
create_driver.cpp:(.text+0x5dea): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `CreateDriver::spin()':
create_driver.cpp:(.text+0x612e): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `main':
create_driver.cpp:(.text+0x625c): undefined reference to `ros::init(int&, char**, std::string const&, unsigned int)'
create_driver.cpp:(.text+0x629a): undefined reference to `ros::NodeHandle::NodeHandle(std::string const&, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&)'
create_driver.cpp:(.text+0x63c0): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text+0x64a4): undefined reference to `ros::console::print(ros::console::FilterBase*, void*, ros::console::levels::Level, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > const&, char const*, int, char const*)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `diagnostic_updater::Updater::force_update()':
create_driver.cpp:(.text._ZN18diagnostic_updater7Updater12force_updateEv[_ZN18diagnostic_updater7Updater12force_updateEv]+0x1b4): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZN18diagnostic_updater7Updater12force_updateEv[_ZN18diagnostic_updater7Updater12force_updateEv]+0x328): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `diagnostic_updater::Updater::update_diagnostic_period()':
create_driver.cpp:(.text._ZN18diagnostic_updater7Updater24update_diagnostic_periodEv[_ZN18diagnostic_updater7Updater24update_diagnostic_periodEv]+0x48): undefined reference to `ros::NodeHandle::getParamCached(std::string const&, double&) const'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `void ros::Publisher::publish<diagnostic_msgs::DiagnosticArray_<std::allocator<void> > >(diagnostic_msgs::DiagnosticArray_<std::allocator<void> > const&) const':
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x7a): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x186): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x27a): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x390): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x49c): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o:create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN15diagnostic_msgs16DiagnosticArray_ISaIvEEEEEvRKT_]+0x5a8): more undefined references to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' follow
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `bool ros::NodeHandle::param<std::string>(std::string const&, std::string&, std::string const&) const':
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramISsEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramISsEEbRKSsRT_RKS4_]+0x12): undefined reference to `ros::NodeHandle::hasParam(std::string const&) const'
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramISsEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramISsEEbRKSsRT_RKS4_]+0x22): undefined reference to `ros::NodeHandle::getParam(std::string const&, std::string&) const'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `bool ros::NodeHandle::param<double>(std::string const&, double&, double const&) const':
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIdEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIdEEbRKSsRT_RKS4_]+0x12): undefined reference to `ros::NodeHandle::hasParam(std::string const&) const'
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIdEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIdEEbRKSsRT_RKS4_]+0x22): undefined reference to `ros::NodeHandle::getParam(std::string const&, double&) const'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `bool ros::NodeHandle::param<bool>(std::string const&, bool&, bool const&) const':
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIbEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIbEEbRKSsRT_RKS4_]+0x12): undefined reference to `ros::NodeHandle::hasParam(std::string const&) const'
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIbEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIbEEbRKSsRT_RKS4_]+0x22): undefined reference to `ros::NodeHandle::getParam(std::string const&, bool&) const'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `bool ros::NodeHandle::param<int>(std::string const&, int&, int const&) const':
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIiEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIiEEbRKSsRT_RKS4_]+0x12): undefined reference to `ros::NodeHandle::hasParam(std::string const&) const'
create_driver.cpp:(.text._ZNK3ros10NodeHandle5paramIiEEbRKSsRT_RKS4_[_ZNK3ros10NodeHandle5paramIiEEbRKSsRT_RKS4_]+0x22): undefined reference to `ros::NodeHandle::getParam(std::string const&, int&) const'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o: In function `void ros::Publisher::publish<nav_msgs::Odometry_<std::allocator<void> > >(nav_msgs::Odometry_<std::allocator<void> > const&) const':
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x7a): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x186): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x27a): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x390): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x49c): undefined reference to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)'
CMakeFiles/ca_driver.dir/src/create_driver.cpp.o:create_driver.cpp:(.text._ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_[_ZNK3ros9Publisher7publishIN8nav_msgs9Odometry_ISaIvEEEEEvRKT_]+0x5a8): more undefined references to `ros::console::initializeLogLocation(ros::console::LogLocation*, std::string const&, ros::console::levels::Level)' follow
collect2: error: ld returned 1 exit status
make[2]: *** [/home/ubuntu/rrover/devel/.private/ca_driver/lib/ca_driver/ca_driver] Error 1
make[1]: *** [CMakeFiles/ca_driver.dir/all] Error 2
make: *** [all] Error 2
cd /home/ubuntu/rrover/build/ca_driver; catkin build --get-env ca_driver | catkin env -si  /usr/bin/make --jobserver-fds=6,7 -j; cd -
................................................................................................................
Failed     << ca_driver:make                [ Exited with code 2 ]                                              
Failed    <<< ca_driver                     [ 7.3 seconds ]                                                     
[build] Summary: 3 of 4 packages succeeded.                                                                     
[build]   Ignored:   1 packages were skipped or are blacklisted.                                                
[build]   Warnings:  None.                                                                                      
[build]   Abandoned: None.                                                                                      
[build]   Failed:    1 packages failed.                                                                         
[build] Runtime: 10.2 seconds total.         

[minor] Incorrect battery charge state when the base is plugged in

I received the following status from the driver when the base was plugged in and the battery was dead empty:

[ INFO] [1477512181.538170353]: [CREATE] Connection established.
[ INFO] [1477512181.538329047]: [CREATE] Battery level 2430.30 %
[ INFO] [1477512181.599300275]: [CREATE] Ready.

Publish JointState for wheel joints

Unless, I'm misunderstanding something, it seems that the driver should publish JointState messages for the wheels. Without these messages, robot_state_publisher cannot generate transforms for the wheels.

Support for Create 1

I had a brief attempt at running the driver for the first generation Create with no luck. Could not get the serial communication working. Needs further investigation.

Improved undocking

Currently, publishing to the undock topic simply switches control of the robot back to the user (after the robot has entered the docking demo). It would be nice if, on top of this, the robot also backs up slowly for a short distance. Similar to how the built-in cleaning behaviours work when starting on a docking station. Unfortunately, iRobot has not exposed this undocking behaviour, so we have to roll our own.

Serial Freezing after a long time - then unfreezing

We have been using this package successfully - except that after the create 2 has been in the charger for a long time, it seems to become either partially or fully unresponsive. By taking it off the charger by hand, or by sending it random combinations of of FULL/PASSIVE commands and /UNDOCK commands, it seems to sometimes become fully responsive after a minute or two but not always.

Expected behavior: We should just send it an /undock command which puts it into full mode and it should start responding to movement commands.

Actual behavior: When it is in this mode, we are sending in an /undock command and it is not showing a toggled /mode or /battery/charging_state in the ROS topic outputs and does not drive around or go beep, etc.

Background:

We have seen this across 3 Create 2's, multiple USB-> Serial cables and multiple computers so it doesn't seem to be a state of the hardware but instead something core to the system.

I have been running this for 4 days (over the weekend) and could see our code internally toggling passive / full every few minutes but then tried to undock it and back it up and it would not come out of the passive mode when I sent a FULL command.

  • Using the USB --> Serial cable that comes with the create 2
  • ROS Kinetic
  • Toggling into FULL mode and back to PASSIVE every 4 minutes to try to make sure it doesn't go asleep (A hack based on forum posts)
  • We have seen the Create start in sleep mode (Booted computer 20 minutes before, then started it - and it was frozen from the beginning. We have also had it start in regular mode where it seems to get stuck, even when we are triggering a change in states to full every 4 minutes (Well within the 5 minute limit)

Below I can see that there 9M packets which have been sent. When it was not responding, this number was staying constant for a while then jerking up then flat.

Excerpt from /diagnostics

        {
            "message": "Serial connection is good",
            "hardware_id": "CREATE_2",
            "values": [
                {
                    "key": "Corrupt packets",
                    "value": "0"
                },
                {
                    "key": "Total packets",
                    "value": "9731905"
                }
            ],
            "name": "ca_driver: Serial Status",
            "level": 0
        }

After toggling things for a while, I started to see it incrementing again by 60 packets / s and it was fully responsive (No ROS reset, unplugging, moving off the charger, etc).

Questions:

  • Is Create Autonomy sending in the wake up command and other elements to toggle it back awake? Is there something I am missing?
  • Have other people encountered it freezing after a while.
  • Is there a command we should be sending in separately to keep the robot from going to sleep "hard" when in passive mode rather than toggling to FULL then PASSIVE again?

Thanks!

Unknown mode detected

Hi, I'm using Roomba 642 and a simple USB-serial connection to connect it to my raspberry pi 3. When first I run roslaunch ca_driver create_2.launch, it outputs [CREATE] Unknown mode detected but I ignore it. Then, I run teleop_joy_keyboard and successfully control my roomba with the keyboard. However, when I try it again, this time when I run roslaunch ca_driver create_2.launch, it gives me an error as below and my roomba freezes. I'm running create_autonomy on ROS kinetic.

pi@pi-desktop:~/catkin_ws$ roslaunch ca_driver create_2.launch 
... logging to /home/pi/.ros/log/93e6802c-306c-11ea-85c7-b827eba5a161/roslaunch-pi-desktop-2378.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

xacro: Traditional processing is deprecated. Switch to --inorder processing!
To check for compatibility of your document, use option --check-order.
For more infos, see http://wiki.ros.org/xacro#Processing_Order
xacro.py is deprecated; please use xacro instead
started roslaunch server http://pi-desktop:44355/

SUMMARY
========

PARAMETERS
 * /ca_driver/base_frame: base_footprint
 * /ca_driver/dev: /dev/ttyUSB0
 * /ca_driver/latch_cmd_duration: 0.2
 * /ca_driver/loop_hz: 10.0
 * /ca_driver/odom_frame: odom
 * /ca_driver/publish_tf: True
 * /ca_driver/robot_model: CREATE_2
 * /robot_description: <?xml version="1....
 * /rosdistro: kinetic
 * /rosversion: 1.12.14

NODES
  /
    ca_driver (ca_driver/ca_driver)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)

ROS_MASTER_URI=http://localhost:11311

process[ca_driver-1]: started with pid [2431]
process[robot_state_publisher-2]: started with pid [2438]
[ INFO] [1578305369.481359865]: [CREATE] "CREATE_2" selected
[ INFO] [1578305370.552198949]: [CREATE] Connection established.
[ INFO] [1578305370.553044573]: [CREATE] Battery level 49.81 %
[ INFO] [1578305370.808227190]: [CREATE] Ready.
[ERROR] [1578305370.809554949]: [CREATE] Unknown mode detected
[ERROR] [1578305370.909520832]: [CREATE] Unknown mode detected
[ERROR] [1578305371.009491455]: [CREATE] Unknown mode detected
[ERROR] [1578305371.110775420]: [CREATE] Unknown mode detected
[ERROR] [1578305371.209784284]: [CREATE] Unknown mode detected
[ERROR] [1578305371.309791583]: [CREATE] Unknown mode detected
[ERROR] [1578305371.410613726]: [CREATE] Unknown mode detected
[ERROR] [1578305371.509811808]: [CREATE] Unknown mode detected
[ERROR] [1578305371.609841555]: [CREATE] Unknown mode detected
[create::Serial] serial error - End of file
[ERROR] [1578305371.709839584]: [CREATE] Unknown mode detected
[FATAL] [1578305371.711663644]: [CREATE] Runtime error: write: Input/output error
[ INFO] [1578305371.712741767]: [CREATE] Destruct sequence initiated.
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
  what():  write: Input/output error
[ca_driver-1] process has died [pid 2431, exit code -6, cmd /home/pi/catkin_ws/devel_isolated/ca_driver/lib/ca_driver/ca_driver __name:=ca_driver __log:=/home/pi/.ros/log/93e6802c-306c-11ea-85c7-b827eba5a161/ca_driver-1.log].
log file: /home/pi/.ros/log/93e6802c-306c-11ea-85c7-b827eba5a161/ca_driver-1*.log

I really hope you can help me with this error. Thanks!

Issue with catkin build

Hey guys

I´m having a problem with building in my project.
I work with an iRobot Create 1 and a Raspberry Pi with Raspbian.
Installing ROS Melodic worked without any issues and now i want to install the package from create_autonomy but the command "catkin build" fails at the point where it comes to the ca_driver and libcreate.

Here is the Error Message:

Errors << ca_driver:cmake /home/pi/ros_catkin_ws/logs/ca_driver/build.cmake.001.log
CMake Error at /home/pi/ros_catkin_ws/src/create_autonomy/ca_driver/CMakeLists.txt:4 (find_package):
By not providing "Findlibcreate.cmake" in CMAKE_MODULE_PATH this project
has asked CMake to find a package configuration file provided by
"libcreate", but CMake did not find one.

Could not find a package configuration file provided by "libcreate" with
any of the following names:

 libcreateConfig.cmake
 libcreate-config.cmake

Add the installation prefix of "libcreate" to CMAKE_PREFIX_PATH or set
"libcreate_DIR" to a directory containing one of the above files. IF
"libcreate" provides a seperate development package od SDK, be sure it has
been installed.


I know it already says what i can do to solve this problem... but i really don´t understand it or know how to do it exactly.
Can any of you help me please?

Kinetic Support

Has this package been tested on Kinetic? I have an iRobot Create 2 that I plan to run from Ubuntu 16.04 (i think..) on a Raspberry Pi 3. I can test it if you'd like.

Roomba and Ros Kinetic

Hi,
create_autonomy is available for ROS Kinetic? I want to control a robot Roomba-765.
Thanks.

Print linear velocity and angle to terminal [Help Wanted]

I'm trying to modify the create_driver.cpp very similar to this, but I'm trying to write the linear velocity and angle to the terminal window instead. So far everything I've tried breaks the controller. Any suggestions?

  //Automatically log battery % in terminal window once per minute
  ros::Rate rate(loop_hz_minute);
  while (ros::ok())
  {
	  ROS_INFO("[LOG] Battery level %.2f %%", (robot_->getBatteryCharge() / robot_->getBatteryCapacity()) * 100.0); // print to terminal
	  usleep(60000000);  // HZ - 1 minute = 60000000 microseconds
  }

OI mode at shutdown for charging battery

Hi All,
Thank you for the great project !
If possible, I would ask you a question.
would be possible to bring in passive mode the robot at the shutdown , reason is that In the state the robot is at shutdown idoesn't charge the battery .

Thanks in advance for you help !
germal

Create 1 serial communication with DB-25

The instructions say:
Connect computer to Create's 7-pin serial port
-If using Create 1, ensure that nothing is connected to Create's DB-25 port

Just to be clear, is there support for using DB-25 port rather than the 7-pin port?

How to upgrade iRobot create_2 firmware to 3.2.6

Not certain this is an issue, might be my ignorance, but looking for help. Have posted on the ROS Answers as well. The create_autonomy github readme indicates that the Create 2 (firmware >= 3.2.6). Been googling and contacted iRobot twice, still unable to figure how to upgrade firmware to 3.2.6. Any help in this matter will be deeply appreciated.

Add support for battery state

Add ROS level API for the following libcreate functions:

uint16_t getVoltage() const;
uint16_t getCurrent() const;
uint8_t getTemperature() const;
uint16_t getBatteryCharge() const;
uint16_t getBatteryCapacity() const;

Add cliff sensor support

At the very least the driver can publish a Boolean message signalling whether or not a cliff is detected.
Alternatively, can also publish a custom message similar to the Bumper message, that contains the raw signal strengths as well as the Boolean cliff signals for all four sensors.

I'm getting "failed to receive data from Create. Check if robot is powered!" error

Hi
I'm using create2 robot. To start the robot I use create_2.launch from ca_driver. However, I always get "failed to receive data from Create. Check if robot is powered!" error. I also tried to switch on the robot by pressing the middle button, but it didn't work.
However, if I remove the battery from the base and insert it back, it magically starts working. But after sometime again it stops working. Is anyone facing the similar issue ?
Is there something I'm doing wrong?

Thanks for your help

Play a song on Create 1

Hi. First of all, amazing work guys.

I am working with an Create 1 robot (ROS Kinectic, Ubuntu 16.04), and i can't make it play a song. I want to play the Imperial March, as explained in this link. The example is written in Python, and i need it in C++.

Here is my code:

` ros::init(argc, argv, "musica");
ros::NodeHandle n;

mode_publisher = n.advertise<std_msgs::Empty>("/undock", 1000);
define_publisher = n.advertise<ca_msgs::DefineSong>("/define_song", 1000);
play_publisher = n.advertise<ca_msgs::PlaySong>("/play_song", 1000);
ros::Rate loop_rate(10);

std_msgs::Empty empty;
mode_publisher.publish(empty);


ROS_INFO("Escribiendo partitura.\n");

// define silence
int r = 30;

// map note names in the lilypad notation to irobot commands
int c4 = 60;
int cis4 = 61; 
int des4 = 61;
int d4 = 62;
int dis4 = 63;
int ees4 = 63;
int e4 = 64;
int f4 = 65;
int fis4 = 66;
int ges4 = 66;
int g4 = 67;
int gis4 = 68;
int aes4 = 68;
int a4 = 69;
int ais4 = 70;
int bes4 = 70;
int b4 = 71;
int c5 = 72;
int cis5 = 73;
int des5 = 73;
int d5 = 74;
int dis5 = 75;
int ees5 = 75;
int e5 = 76;
int f5 = 77;
int fis5 = 78;
int ges5 = 78;
int g5 = 79;
int gis5 = 80;
int aes5 = 80;
int a5 = 81;
int ais5 = 82;
int bes5 = 82;
int b5 = 83;
int c6 = 84;
int cis6 = 85;
int des6 = 85;
int d6 = 86;
int dis6 = 87;
int ees6 = 87;
int e6 = 88;
int f6 = 89;
int fis6 = 90;
int ges6 = 90;

// define some note lengths
// change the top MEASURE (4/4 time) to get faster/slower speeds
int MEASURE = 160;
int HALF = MEASURE/2;
int Q = MEASURE/4;
int E = MEASURE/8;
int Ed = MEASURE*3/16;
int S = MEASURE/16;

int MEASURE_TIME = MEASURE/64;

// Escribo la canción.
std::vector<uint8_t> notes(9);
std::vector<float> durations(9);

uint8_t kk[9] = { a4, a4, a4, f4, c5, a4, f4, c5, a4 };
notes.assign(&kk[0], &kk[0]+9);
float vv[9] = { Q, Q, Q, Ed, S, Q, Ed, S, HALF };
durations.assign(&vv[0], &vv[0]+9);

ca_msgs::DefineSong song_msg;
song_msg.song = 0;
song_msg.length = 9;
song_msg.notes = notes;
song_msg.durations = durations;

define_publisher.publish(song_msg);

ros::spinOnce();

// Especifico la canción a reproducir.
ca_msgs::PlaySong play_msg;
play_msg.song = 0;

play_publisher.publish(play_msg);

ROS_INFO("Reproduciendo musica.\n");

return 0;`

No compilation errors. But when i run the node, the create_1.launcher console puts "Bad Song Definition" (or something like that).

¿Am i doing something wrong?
¿Can you give me an example on how to define and play a simple song (or a beep)? Even by console, like "rostopic pub -1 ...."

Thanks in advance.
Greetings from Argentina.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.